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