Exemple #1
0
def get_jsonlog(filename='log/airtest.log'):    
    logfile = os.getenv('AIRTEST_LOGFILE', filename)
    if os.path.exists(logfile):
        backfile = logfile+'.'+time.strftime('%Y%m%d%H%M%S')
        os.rename(logfile, backfile)
    else:
        base.makedirs(base.dirname(logfile))
    jlog = jsonlog.JSONLog(logfile)
    return jlog
Exemple #2
0
 def writeline(self, d, *args):
     '''
     @param d (dict or string): content needed write to file
     @param args(array): only when d is string, support writeline('hello %s', 'world')
     '''
     with Lock(self._lock) as _:
         base.makedirs(base.dirname(self._filename))
         with open(self._filename, 'a') as file:
             if isinstance(d, dict):
                 d.update({'timestamp': int(time.time())})
                 outline = json.dumps(d)
             else:
                 outline = str(d) % args
             file.write(outline.rstrip() + '\n')
Exemple #3
0
 def writeline(self, d, *args):
     '''
     @param d (dict or string): content needed write to file
     @param args(array): only when d is string, support writeline('hello %s', 'world')
     '''
     with Lock(self._lock) as _:
         base.makedirs(base.dirname(self._filename))
         with open(self._filename, 'a') as file:
             if isinstance(d, dict):
                 d.update({'timestamp': int(time.time())})
                 outline = json.dumps(d)
             else:
                 outline = str(d) % args
             file.write(outline.rstrip() + '\n')
Exemple #4
0
def render(logfile, htmldir):
    '''
    parse logfile and render it to html
    '''
    if not os.path.exists(logfile):
        sys.exit('logfile: %s not exists' %(logfile))
    #htmldir = base.dirname(htmlfile)
    if not os.path.exists(htmldir):
        os.makedirs(htmldir)
    cpus, items = [], []
    fpss = []
    mems, imgs = [], []
    data = {
            'info': {
                'generated_time': time.strftime('%Y/%m/%d %H:%M:%S'),
            },
            'items': items, 
            #'cpus': cpus,
            'cpu_data': None,
            'mem_data': None,
            #'mems': mems,
            'images': imgs,
            }
    info = data.get('info')

    start_time = 0
    for line in open(logfile):
        d = json.loads(line)
        time_format = '%Y/%m/%d %H:%M:%S'
        timestamp = d.get('timestamp') - start_time
        _type = d.get('type')
        if _type == 'start':
            start_time = d.get('timestamp')
        elif _type == 'record':
            mem = d.get('mem')
            if mem:
                mems.append([timestamp, mem])
            cpu = d.get('cpu')
            if cpu:
                cpus.append([timestamp, cpu])
            fps = d.get('fps')
            if fps:
                fpss.append([timestamp, fps])
        elif _type == 'snapshot':
            filename = d.get('filename')
            basename = os.path.basename(filename)
            with fuckit:
                shutil.copyfile(filename, os.path.join(htmldir, basename))
                imgs.append({'time':timestamp, 'filename':basename})
        #elif d.get('result'):
        #    data['result'] = {'status': d.get('result'), 'detail': d.get('detail')}
    data['cpu_data'] = json.dumps(cpus)
    data['mem_data'] = json.dumps(mems)
    def average(ss):
        if ss:
            return reduce(lambda x,y: x+y, [value for _,value in ss])/float(len(ss))
        return 0.0

    data['cpu_average'] = round(average(cpus), 2)
    data['mem_average'] = round(average(mems), 2)
    data['fps_average'] = round(average(fpss), 2)

    tmpldir = os.path.join(base.dirname(__file__), 'htmltemplate')
    for name in os.listdir(tmpldir):
        fullpath = os.path.join(tmpldir, name)
        outpath = os.path.join(htmldir, name)
        if os.path.isdir(fullpath):
            shutil.rmtree(outpath, ignore_errors=True)
            shutil.copytree(fullpath, outpath)
            continue
        if fullpath.endswith('.swp'):
            continue
        content = open(fullpath).read().decode('utf-8')
        out = pystache.render(content, data)
        print fullpath
        with open(outpath, 'w') as file:
            file.write(out.encode('utf-8'))

        # store json data file, for other system
        with open(os.path.join(htmldir, 'data.json'), 'w') as file:
            json.dump(data, file)
Exemple #5
0
    if d == 'UP':
        return x, y
    if d == 'DOWN':
        return w-x, y-y
    if d == 'RIGHT':
        return y, w-x
    if d == 'LEFT':
        return h-y, x

# prepare log and tmp dir
logfile = os.getenv('AIRTEST_LOGFILE', 'log/airtest.log')
if os.path.exists(logfile):
    backfile = logfile+'.'+time.strftime('%Y%m%d%H%M%S')
    os.rename(logfile, backfile)
else:
    base.makedirs(base.dirname(logfile))
jlog = jsonlog.JSONLog(logfile)

@patch.record(jlog)
class AndroidDevice(object):
    def __init__(self, serialno=None, pkgname=None):
        self._last_point = None
        self._threshold = 0.3 # for findImage
        self._rotation = None # UP,DOWN,LEFT,RIGHT
        self._tmpdir = 'tmp'

        if not os.path.exists(self._tmpdir):
            base.makedirs(self._tmpdir)

        self.pkgname = pkgname
        self.adb, self._serialno = ViewClient.connectToDeviceOrExit(verbose=False, serialno=serialno)
Exemple #6
0
def render(logfile, htmldir):
    '''
    parse logfile and render it to html
    '''
    if not os.path.exists(logfile):
        sys.exit('logfile: %s not exists' %(logfile))
    #htmldir = base.dirname(htmlfile)
    if not os.path.exists(htmldir):
        os.makedirs(htmldir)
    cpus, items = [], []
    fpss = []
    mems, imgs = [], []
    data = {
            'info': {
                'generated_time': time.strftime('%Y/%m/%d %H:%M:%S'),
            },
            'items': items, 
            #'cpus': cpus,
            'cpu_data': None,
            'mem_data': None,
            #'mems': mems,
            'images': imgs,
            }
    info = data.get('info')

    start_time = 0
    for line in open(logfile):
        d = json.loads(line)
        timestamp = d.get('timestamp') - start_time
        _type = d.get('type')
        if _type == 'start':
            start_time = d.get('timestamp')
        elif _type == 'record':
            mem = d.get('mem')
            if mem:
                mems.append([timestamp, mem])
            cpu = d.get('cpu')
            if cpu:
                cpus.append([timestamp, cpu])
            fps = d.get('fps')
            if fps:
                fpss.append([timestamp, fps])
        elif _type == 'snapshot':
            filename = d.get('filename')
            basename = os.path.basename(filename)
            with fuckit:
                shutil.copyfile(filename, os.path.join(htmldir, basename))
                imgs.append({'time':timestamp, 'filename':basename})
        #elif d.get('result'):
        #    data['result'] = {'status': d.get('result'), 'detail': d.get('detail')}
    data['cpu_data'] = json.dumps(cpus)
    data['mem_data'] = json.dumps(mems)

    from . import proto
    records = []
    for line in open(logfile):
        v = json.loads(line)
        r = {'time': time.strftime(TIME_FORMAT, time.localtime(v.get('timestamp')))}
        d = v.get('data', {})
        tag = v.get('tag')

        if tag == proto.TAG_FUNCTION:
            tag = markupsafe.Markup('<span class="glyphicon glyphicon-sound-dolby"></span>')    
            args = map(json.dumps, d.get('args'))
            kwargs = [ '%s=%s' %(k, json.dumps(_v)) for k, _v in d.get('kwargs', {}).items() ]
            message = '<code>%s(%s)</code>' %(d.get('name'), ', '.join(args+kwargs))
            message = markupsafe.Markup(message)
        elif tag == proto.TAG_SNAPSHOT:
            message = d.get('filename')
        elif tag == proto.TAG_CPU:
            message = 'total: %d, average: %d' %(d.get('total'), d.get('average'))
        else:
            message = None
        
        if message:
            r['tag'] = tag
            r['message'] = message
            records.append(r)


    data['records'] = records
    def average(ss):
        if ss:
            return reduce(lambda x,y: x+y, [value for _,value in ss])/float(len(ss))
        return 0.0

    data['cpu_average'] = round(average(cpus), 2)
    data['mem_average'] = round(average(mems), 2)
    data['fps_average'] = round(average(fpss), 2)

    tmpldir = os.path.join(base.dirname(__file__), 'htmltemplate')
    for name in os.listdir(tmpldir):
        fullpath = os.path.join(tmpldir, name)
        outpath = os.path.join(htmldir, name)
        if os.path.isdir(fullpath):
            shutil.rmtree(outpath, ignore_errors=True)
            shutil.copytree(fullpath, outpath)
            continue
        if fullpath.endswith('.swp'):
            continue
        content = open(fullpath).read().decode('utf-8')
        out = pystache.Renderer(escape=markupsafe.escape).render(content, data)
        print fullpath
        with open(outpath, 'w') as file:
            file.write(out.encode('utf-8'))

        # store json data file, for other system
        with open(os.path.join(htmldir, 'data.json'), 'w') as file:
            json.dump(data, file)
Exemple #7
0
def render(logfile, htmldir):
    """
    parse logfile and render it to html
    """
    if not os.path.exists(logfile):
        sys.exit("logfile: %s not exists" % (logfile))
    if not os.path.exists(htmldir):
        os.makedirs(htmldir)
    cpus, items = [], []
    fpss = []
    mems = []
    imgs = []
    # The render data
    data = {
        "info": {"generated_time": time.strftime("%Y/%m/%d %H:%M:%S")},
        "items": items,
        "cpu_data": None,
        "mem_data": None,
        "images": imgs,
    }
    info = data.get("info")

    # Read log line by line
    from . import proto

    records = []
    for line in open(logfile):
        v = json.loads(line)
        r = {"time": time.strftime(TIME_FORMAT, time.localtime(v.get("timestamp")))}
        d = v.get("data", {})
        tag = v.get("tag")

        # Process Function, Snapshot, Memory, CPU ...
        if tag == proto.TAG_FUNCTION:
            tag = markupsafe.Markup("function")
            args = map(json.dumps, d.get("args"))
            kwargs = ["%s=%s" % (k, json.dumps(_v)) for k, _v in d.get("kwargs", {}).items()]
            message = '<code style="color:green">%s(%s)</code>' % (d.get("name"), ", ".join(args + kwargs))
            message = markupsafe.Markup(message)
        elif tag == proto.TAG_SNAPSHOT:
            message = markupsafe.Markup("<img width=100%% src='%s'/>" % d.get("filename"))
        elif tag == proto.TAG_CPU:
            message = "%d%%" % (d)
            cpus.append([r, d])
        elif tag == proto.TAG_MEMORY:
            mems.append([r, d["PSS"]])
            message = json.dumps(d)
        else:
            message = None

        if message:
            r["tag"] = tag
            r["message"] = message
            records.append(r)

    # Calculate average cpu and mem
    data["records"] = records

    def average(ss):
        if ss:
            return reduce(lambda x, y: x + y, [value for _, value in ss]) / float(len(ss))
        return 0.0

    data["cpu_average"] = round(average(cpus), 2)
    data["mem_average"] = round(average(mems), 2)
    data["fps_average"] = round(average(fpss), 2)

    tmpldir = os.path.join(base.dirname(__file__), "htmltemplate")
    for name in os.listdir(tmpldir):
        fullpath = os.path.join(tmpldir, name)
        outpath = os.path.join(htmldir, name)
        if os.path.isdir(fullpath):
            shutil.rmtree(outpath, ignore_errors=True)
            shutil.copytree(fullpath, outpath)
            continue
        if fullpath.endswith(".swp"):
            continue
        content = open(fullpath).read().decode("utf-8")
        out = pystache.Renderer(escape=markupsafe.escape).render(content, data)
        print fullpath
        with open(outpath, "w") as file:
            file.write(out.encode("utf-8"))

        # store json data file, for other system
        with open(os.path.join(htmldir, "data.json"), "w") as file:
            json.dump(data, file)
    # Copy snapshots
    if htmldir != ".":
        shutil.rmtree(os.path.join(htmldir, "tmp"), ignore_errors=True)
    shutil.copytree("tmp", os.path.join(htmldir, "tmp"))
Exemple #8
0
def render(logfile, htmldir):
    '''
    parse logfile and render it to html
    '''
    if not os.path.exists(logfile):
        sys.exit('logfile: %s not exists' % (logfile))
    if not os.path.exists(htmldir):
        os.makedirs(htmldir)
    cpus, items = [], []
    fpss = []
    mems = []
    imgs = []
    # The render data
    data = {
        'info': {
            'generated_time': time.strftime('%Y/%m/%d %H:%M:%S'),
        },
        'items': items,
        'cpu_data': None,
        'mem_data': None,
        'images': imgs,
    }
    info = data.get('info')

    # Read log line by line
    from . import proto
    records = []
    for line in open(logfile):
        v = json.loads(line)
        r = {
            'time': time.strftime(TIME_FORMAT,
                                  time.localtime(v.get('timestamp')))
        }
        d = v.get('data', {})
        tag = v.get('tag')

        # Process Function, Snapshot, Memory, CPU ...
        if tag == proto.TAG_FUNCTION:
            tag = markupsafe.Markup('function')
            args = map(json.dumps, d.get('args'))
            kwargs = [
                '%s=%s' % (k, json.dumps(_v))
                for k, _v in d.get('kwargs', {}).items()
            ]
            message = '<code style="color:green">%s(%s)</code>' % (
                d.get('name'), ', '.join(args + kwargs))
            message = markupsafe.Markup(message)
        elif tag == proto.TAG_SNAPSHOT:
            message = markupsafe.Markup("<img width=100%% src='%s'/>" %
                                        d.get('filename'))
        elif tag == proto.TAG_CPU:
            message = '%d%%' % (d)
            cpus.append([r, d])
        elif tag == proto.TAG_MEMORY:
            mems.append([r, d['PSS']])
            message = json.dumps(d)
        else:
            message = None

        if message:
            r['tag'] = tag
            r['message'] = message
            records.append(r)

    # Calculate average cpu and mem
    data['records'] = records

    def average(ss):
        if ss:
            return reduce(lambda x, y: x + y,
                          [value for _, value in ss]) / float(len(ss))
        return 0.0

    data['cpu_average'] = round(average(cpus), 2)
    data['mem_average'] = round(average(mems), 2)
    data['fps_average'] = round(average(fpss), 2)

    tmpldir = os.path.join(base.dirname(__file__), 'htmltemplate')
    for name in os.listdir(tmpldir):
        fullpath = os.path.join(tmpldir, name)
        outpath = os.path.join(htmldir, name)
        if os.path.isdir(fullpath):
            shutil.rmtree(outpath, ignore_errors=True)
            shutil.copytree(fullpath, outpath)
            continue
        if fullpath.endswith('.swp'):
            continue
        content = open(fullpath).read().decode('utf-8')
        out = pystache.Renderer(escape=markupsafe.escape).render(content, data)
        print fullpath
        with open(outpath, 'w') as file:
            file.write(out.encode('utf-8'))

        # store json data file, for other system
        with open(os.path.join(htmldir, 'data.json'), 'w') as file:
            json.dump(data, file)
    # Copy snapshots
    if htmldir != '.':
        shutil.rmtree(os.path.join(htmldir, 'tmp'), ignore_errors=True)
    shutil.copytree('tmp', os.path.join(htmldir, 'tmp'))