skia2/tools/skiaserve/tester/tester.py

119 lines
3.1 KiB
Python

# Copyright 2016 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import argparse
import json
import os
import re
import requests
from os import listdir
from os.path import isfile, join
default_ops = [
"enable_gpu",
"post",
"info",
"cmd",
"img",
"batchList"
]
def Check(request):
assert(request.status_code == 200)
return request
def WriteJson(request, path):
# Writes out pretty printed json
with open(path, 'wb+') as fd:
json.dump(request.json(), fd, sort_keys=True, indent=2,
separators=(',', ': '))
return request
def WritePng(request, path):
with open(path, 'wb+') as fd:
fd.write(request.content)
# A simple class to drive testing
class SkiaServeTester:
def __init__(self, url, output_dir):
self.url = url
self.output_dir = output_dir
# skp properties
self.skp = ''
self.skp_name = ''
def set_skp(self, skp_dir, skp_name):
self.skp = skp_dir + '/' + skp_name
self.skp_name = skp_name
def info(self):
return Check(requests.get(self.url + '/info'))
def post(self):
with open(self.skp, 'rb') as payload:
files = {'file': payload}
# upload skp
return Check(requests.post(self.url + '/new', files=files))
def cmd(self):
path = self.output_dir + '/' + self.skp_name + '.cmd.json'
return WriteJson(Check(requests.get(self.url + '/cmd')), path)
def img(self):
opcount = self.opcount()
url = self.url + '/img/' + str(opcount)
path = self.output_dir + '/' + self.skp_name + '.png'
return WritePng(Check(requests.get(url)), path)
def enable_gpu(self):
return Check(requests.post(self.url + '/enableGPU/1'))
def disable_gpu(self):
return Check(requests.post(self.url + '/enableGPU/0'))
def opcount(self):
r = self.cmd()
return len(r.json()['commands']) - 1 # why the minus 1 here?
def batchList(self):
path = self.output_dir + '/' + self.skp_name + '.batches.json'
return WriteJson(Check(requests.get(self.url + '/batches')), path)
def main():
parser = argparse.ArgumentParser(description='Tester for SkiaServe')
parser.add_argument('--skp_dir', default='skps', type=str)
parser.add_argument('--url', default='http://localhost:8888', type=str)
parser.add_argument('--output_dir', default='results', type=str)
parser.add_argument('--match', default='.*', type=str)
parser.add_argument('--ops', nargs='+', default=default_ops)
args = parser.parse_args()
skp_dir = args.skp_dir
url = args.url
output_dir = args.output_dir
ops = args.ops
if not os.path.isdir(output_dir):
os.makedirs(output_dir)
skps = []
for skp in listdir(skp_dir):
if isfile(join(skp_dir, skp)) and re.match(args.match, skp):
skps.append(skp)
tester = SkiaServeTester(url, output_dir)
for skp_name in skps:
tester.set_skp(skp_dir, skp_name)
for op in ops:
getattr(tester, op)()
if __name__ == "__main__":
main()