Chromium Code Reviews| Index: testing/tools/gold.py |
| diff --git a/testing/tools/gold.py b/testing/tools/gold.py |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..60f3a404b3b01a1f53cff0bdf227f5f5f325cbbb |
| --- /dev/null |
| +++ b/testing/tools/gold.py |
| @@ -0,0 +1,123 @@ |
| +# Copyright 2015 The PDFium Authors. All rights reserved. |
| +# Use of this source code is governed by a BSD-style license that can be |
| +# found in the LICENSE file. |
| + |
|
borenet
2016/12/21 19:47:28
Style nit: 2 spaces between anything at the top le
stephana
2016/12/21 21:47:57
Done.
|
| +import json |
| +import os |
| +import shutil |
| + |
| +# This module collects and writes output in a format expected by the |
| +# Gold baseline tool. Based on meta data provided explicitly and by |
| +# adding a series of test results it can be used to produce |
| +# a JSON file that is uploaded to Google Storage and ingested by Gold. |
| +# |
| +# The output will look similar this: |
| +# |
| +# { |
| +# "build_number" : "2", |
| +# "gitHash" : "a4a338179013b029d6dd55e737b5bd648a9fb68c", |
| +# "key" : { |
| +# "arch" : "arm64", |
| +# "compiler" : "Clang", |
| +# }, |
| +# "results" : [ |
| +# { |
| +# "key" : { |
| +# "config" : "vk", |
| +# "name" : "yuv_nv12_to_rgb_effect", |
| +# "source_type" : "gm" |
| +# }, |
| +# "md5" : "7db34da246868d50ab9ddd776ce6d779", |
| +# "options" : { |
| +# "ext" : "png", |
| +# "gamma_correct" : "no" |
| +# } |
| +# }, |
| +# { |
| +# "key" : { |
| +# "config" : "vk", |
| +# "name" : "yuv_to_rgb_effect", |
| +# "source_type" : "gm" |
| +# }, |
| +# "md5" : "0b955f387740c66eb23bf0e253c80d64", |
| +# "options" : { |
| +# "ext" : "png", |
| +# "gamma_correct" : "no" |
| +# } |
| +# } |
| +# ], |
| +# } |
| +# |
| +class GoldResults(object): |
| + def __init__(self, source_type, outputDir, propertiesStr, keyStr): |
| + """ |
| + source_type is the source_type (=corpus) field used for all results. |
| + output_dir is the directory where the resulting images are copied and |
| + the dm.json file is written. |
| + propertiesStr is a string with space separated key/value pairs that |
| + is used to set the top level fields in the output JSON file. |
| + keyStr is a string with space separated key/value pairs that |
| + is used to set the 'key' field in the output JSON file. |
| + """ |
| + self._source_type = source_type |
| + self._properties = self._parseKeyValuePairs(propertiesStr) |
| + self._properties["key"] = self._parseKeyValuePairs(keyStr) |
| + self._results = [] |
| + self._outputDir = outputDir |
| + |
| + def AddTestResult(self, testName, md5Hash, outputImagePath): |
| + # Copy the image to <output_dir>/<md5Hash>.<image_extension> |
| + imgExt = os.path.splitext(outputImagePath)[1].lstrip(".") |
| + if not imgExt: |
| + raise ValueError("File %s does not have an extension" % outputImagePath) |
| + newFilePath = os.path.join(self._outputDir, md5Hash + '.' + imgExt) |
| + shutil.copy2(outputImagePath, newFilePath) |
| + |
| + # Add an entry to the list of test results |
| + self._results.append({ |
| + "key": { |
| + "name": testName, |
| + "source_type": self._source_type, |
| + }, |
| + "md5": md5Hash, |
| + "options": { |
| + "ext": imgExt, |
| + "gamma_correct": "no" |
| + } |
| + }) |
| + |
| + def _parseKeyValuePairs(self, kvStr): |
| + kvPairs = kvStr.split() |
|
borenet
2016/12/21 19:47:28
I recommend shlex.split, if kvPairs might include
stephana
2016/12/21 21:47:57
Done.
|
| + if len(kvPairs) % 2: |
| + raise ValueError("Uneven number of key/value pairs. Got %s" % kvStr) |
| + return { kvPairs[i]:kvPairs[i+1] for i in range(0, len(kvPairs), 2) } |
| + |
| + def WriteResults(self): |
| + self._properties.update({ |
| + "results": self._results |
| + }) |
| + |
| + outputFileName = os.path.join(self._outputDir, "dm.json") |
| + with open(outputFileName, 'wb') as outfile: |
| + json.dump(self._properties, outfile, indent=1) |
| + outfile.write("\n") |
| + |
| +# Produce example output for manual testing. |
| +if __name__ == "__main__": |
|
borenet
2016/12/21 19:47:28
I prefer to put the below lines into a function si
stephana
2016/12/21 21:47:57
I don't think so. If I run this from another file:
|
| + # Create a test directory with three empty 'image' files. |
| + testDir = "./testdirectory" |
| + if not os.path.exists(testDir): |
| + os.makedirs(testDir) |
| + open(os.path.join(testDir, "image1.png"), 'wb').close() |
| + open(os.path.join(testDir, "image2.png"), 'wb').close() |
| + open(os.path.join(testDir, "image3.png"), 'wb').close() |
| + |
| + # Create an instance and add results. |
| + propStr = "build_number 2 builder Builder-Name gitHash a4a338179013b029d6dd55e737b5bd648a9fb68c" |
|
borenet
2016/12/21 19:47:28
Nit: line break
stephana
2016/12/21 21:47:57
Done.
|
| + keyStr = "arch arm64 compiler Clang configuration Debug" |
| + |
| + gr = GoldResults("pdfium", testDir, propStr, keyStr) |
| + gr.AddTestResult("test-1", "hash-1", os.path.join(testDir, "image1.png")) |
| + gr.AddTestResult("test-2", "hash-2", os.path.join(testDir, "image2.png")) |
| + gr.AddTestResult("test-3", "hash-3", os.path.join(testDir, "image3.png")) |
| + gr.WriteResults() |