tester.py 3.1 KB

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