1cb93a386Sopenharmony_ci# Copyright 2016 Google Inc. 2cb93a386Sopenharmony_ci# 3cb93a386Sopenharmony_ci# Use of this source code is governed by a BSD-style license that can be 4cb93a386Sopenharmony_ci# found in the LICENSE file. 5cb93a386Sopenharmony_ci 6cb93a386Sopenharmony_ciimport argparse 7cb93a386Sopenharmony_ciimport json 8cb93a386Sopenharmony_ciimport os 9cb93a386Sopenharmony_ciimport re 10cb93a386Sopenharmony_ciimport requests 11cb93a386Sopenharmony_ci 12cb93a386Sopenharmony_cifrom os import listdir 13cb93a386Sopenharmony_cifrom os.path import isfile, join 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_cidefault_ops = [ 16cb93a386Sopenharmony_ci "enable_gpu", 17cb93a386Sopenharmony_ci "post", 18cb93a386Sopenharmony_ci "info", 19cb93a386Sopenharmony_ci "cmd", 20cb93a386Sopenharmony_ci "img", 21cb93a386Sopenharmony_ci "batchList" 22cb93a386Sopenharmony_ci] 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_cidef Check(request): 25cb93a386Sopenharmony_ci assert(request.status_code == 200) 26cb93a386Sopenharmony_ci return request 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_cidef WriteJson(request, path): 29cb93a386Sopenharmony_ci # Writes out pretty printed json 30cb93a386Sopenharmony_ci with open(path, 'wb+') as fd: 31cb93a386Sopenharmony_ci json.dump(request.json(), fd, sort_keys=True, indent=2, 32cb93a386Sopenharmony_ci separators=(',', ': ')) 33cb93a386Sopenharmony_ci return request 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_cidef WritePng(request, path): 36cb93a386Sopenharmony_ci with open(path, 'wb+') as fd: 37cb93a386Sopenharmony_ci fd.write(request.content) 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci# A simple class to drive testing 41cb93a386Sopenharmony_ciclass SkiaServeTester: 42cb93a386Sopenharmony_ci def __init__(self, url, output_dir): 43cb93a386Sopenharmony_ci self.url = url 44cb93a386Sopenharmony_ci self.output_dir = output_dir 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ci # skp properties 47cb93a386Sopenharmony_ci self.skp = '' 48cb93a386Sopenharmony_ci self.skp_name = '' 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_ci def set_skp(self, skp_dir, skp_name): 51cb93a386Sopenharmony_ci self.skp = skp_dir + '/' + skp_name 52cb93a386Sopenharmony_ci self.skp_name = skp_name 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci def info(self): 55cb93a386Sopenharmony_ci return Check(requests.get(self.url + '/info')) 56cb93a386Sopenharmony_ci 57cb93a386Sopenharmony_ci def post(self): 58cb93a386Sopenharmony_ci with open(self.skp, 'rb') as payload: 59cb93a386Sopenharmony_ci files = {'file': payload} 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ci # upload skp 62cb93a386Sopenharmony_ci return Check(requests.post(self.url + '/new', files=files)) 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci def cmd(self): 65cb93a386Sopenharmony_ci path = self.output_dir + '/' + self.skp_name + '.cmd.json' 66cb93a386Sopenharmony_ci return WriteJson(Check(requests.get(self.url + '/cmd')), path) 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci def img(self): 69cb93a386Sopenharmony_ci opcount = self.opcount() 70cb93a386Sopenharmony_ci url = self.url + '/img/' + str(opcount) 71cb93a386Sopenharmony_ci path = self.output_dir + '/' + self.skp_name + '.png' 72cb93a386Sopenharmony_ci return WritePng(Check(requests.get(url)), path) 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ci def enable_gpu(self): 75cb93a386Sopenharmony_ci return Check(requests.post(self.url + '/enableGPU/1')) 76cb93a386Sopenharmony_ci 77cb93a386Sopenharmony_ci def disable_gpu(self): 78cb93a386Sopenharmony_ci return Check(requests.post(self.url + '/enableGPU/0')) 79cb93a386Sopenharmony_ci 80cb93a386Sopenharmony_ci def opcount(self): 81cb93a386Sopenharmony_ci r = self.cmd() 82cb93a386Sopenharmony_ci return len(r.json()['commands']) - 1 # why the minus 1 here? 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ci def batchList(self): 85cb93a386Sopenharmony_ci path = self.output_dir + '/' + self.skp_name + '.batches.json' 86cb93a386Sopenharmony_ci return WriteJson(Check(requests.get(self.url + '/batches')), path) 87cb93a386Sopenharmony_ci 88cb93a386Sopenharmony_cidef main(): 89cb93a386Sopenharmony_ci parser = argparse.ArgumentParser(description='Tester for SkiaServe') 90cb93a386Sopenharmony_ci parser.add_argument('--skp_dir', default='skps', type=str) 91cb93a386Sopenharmony_ci parser.add_argument('--url', default='http://localhost:8888', type=str) 92cb93a386Sopenharmony_ci parser.add_argument('--output_dir', default='results', type=str) 93cb93a386Sopenharmony_ci parser.add_argument('--match', default='.*', type=str) 94cb93a386Sopenharmony_ci parser.add_argument('--ops', nargs='+', default=default_ops) 95cb93a386Sopenharmony_ci 96cb93a386Sopenharmony_ci args = parser.parse_args() 97cb93a386Sopenharmony_ci skp_dir = args.skp_dir 98cb93a386Sopenharmony_ci url = args.url 99cb93a386Sopenharmony_ci output_dir = args.output_dir 100cb93a386Sopenharmony_ci ops = args.ops 101cb93a386Sopenharmony_ci 102cb93a386Sopenharmony_ci if not os.path.isdir(output_dir): 103cb93a386Sopenharmony_ci os.makedirs(output_dir) 104cb93a386Sopenharmony_ci 105cb93a386Sopenharmony_ci skps = [] 106cb93a386Sopenharmony_ci for skp in listdir(skp_dir): 107cb93a386Sopenharmony_ci if isfile(join(skp_dir, skp)) and re.match(args.match, skp): 108cb93a386Sopenharmony_ci skps.append(skp) 109cb93a386Sopenharmony_ci 110cb93a386Sopenharmony_ci tester = SkiaServeTester(url, output_dir) 111cb93a386Sopenharmony_ci 112cb93a386Sopenharmony_ci for skp_name in skps: 113cb93a386Sopenharmony_ci tester.set_skp(skp_dir, skp_name) 114cb93a386Sopenharmony_ci for op in ops: 115cb93a386Sopenharmony_ci getattr(tester, op)() 116cb93a386Sopenharmony_ci 117cb93a386Sopenharmony_ciif __name__ == "__main__": 118cb93a386Sopenharmony_ci main() 119