tester.py revision 810f77fb9c21a8f2e3373ff92ef302e22b585e4c
1810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt# Copyright 2016 Google Inc. 2810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt# 3810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt# Use of this source code is governed by a BSD-style license that can be 4810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt# found in the LICENSE file. 5810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 6810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualittimport argparse 7810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualittimport json 8810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualittimport os 9810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualittimport re 10810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualittimport requests 11810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 12810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualittfrom os import listdir 13810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualittfrom os.path import isfile, join 14810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 15810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualittops = [ 16810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt "enable_gpu", 17810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt "post", 18810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt "info", 19810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt "cmd", 20810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt "img" 21810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt] 22810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 23810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualittdef Check(request): 24810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt assert(request.status_code == 200) 25810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt return request 26810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 27810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualittdef WriteJson(request, path): 28810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt # Writes out pretty printed json 29810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt with open(path, 'wb+') as fd: 30810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt json.dump(request.json(), fd, sort_keys=True, indent=2, 31810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt separators=(',', ': ')) 32810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt return request 33810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 34810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualittdef WritePng(request, path): 35810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt with open(path, 'wb+') as fd: 36810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt fd.write(request.content) 37810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 38810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 39810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt# A simple class to drive testing 40810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualittclass SkiaServeTester: 41810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt def __init__(self, url, output_dir): 42810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt self.url = url 43810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt self.output_dir = output_dir 44810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 45810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt # skp properties 46810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt self.skp = '' 47810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt self.skp_name = '' 48810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 49810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt def set_skp(self, skp_dir, skp_name): 50810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt self.skp = skp_dir + '/' + skp_name 51810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt self.skp_name = skp_name 52810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 53810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt def info(self): 54810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt return Check(requests.get(self.url + '/info')) 55810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 56810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt def post(self): 57810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt with open(self.skp, 'rb') as payload: 58810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt files = {'file': payload} 59810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 60810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt # upload skp 61810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt return Check(requests.post(self.url + '/new', files=files)) 62810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 63810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt def cmd(self): 64810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt path = self.output_dir + '/' + self.skp_name + '.cmd.json' 65810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt return WriteJson(Check(requests.get(self.url + '/cmd')), path) 66810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 67810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt def img(self): 68810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt opcount = self.opcount() 69810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt url = self.url + '/img/' + str(opcount) 70810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt path = self.output_dir + '/' + self.skp_name + '.png' 71810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt return WritePng(Check(requests.get(url)), path) 72810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 73810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt def enable_gpu(self): 74810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt return Check(requests.post(self.url + '/enableGPU/1')) 75810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 76810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt def disable_gpu(self): 77810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt return Check(requests.post(self.url + '/enableGPU/0')) 78810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 79810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt def opcount(self): 80810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt r = self.cmd() 81810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt return len(r.json()['commands']) - 1 # why the minus 1 here? 82810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 83810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualittdef main(): 84810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt parser = argparse.ArgumentParser(description='Tester for SkiaServe') 85810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt parser.add_argument('--skp_dir', default='skps', type=str) 86810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt parser.add_argument('--url', default='http://localhost:8888', type=str) 87810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt parser.add_argument('--output_dir', default='results', type=str) 88810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt parser.add_argument('--match', default='.*', type=str) 89810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 90810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt args = parser.parse_args() 91810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt skp_dir = args.skp_dir 92810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt url = args.url 93810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt output_dir = args.output_dir 94810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 95810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt if not os.path.isdir(output_dir): 96810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt os.makedirs(output_dir) 97810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 98810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt skps = [] 99810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt for skp in listdir(skp_dir): 100810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt if isfile(join(skp_dir, skp)) and re.match(args.match, skp): 101810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt skps.append(skp) 102810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 103810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt tester = SkiaServeTester(url, output_dir) 104810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 105810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt for skp_name in skps: 106810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt tester.set_skp(skp_dir, skp_name) 107810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt for op in ops: 108810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt getattr(tester, op)() 109810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt 110810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualittif __name__ == "__main__": 111810f77fb9c21a8f2e3373ff92ef302e22b585e4cjoshualitt main() 112