aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm
diff options
context:
space:
mode:
authorGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-03-17 14:22:02 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-03-17 14:22:02 +0000
commitd1c85d29204ad94950b23014c03e781409b9b682 (patch)
treee6c068261660cbeb9d0f9f6cd9ce149d66b90625 /gm
parent1d1f2347d303852172fb7629c27d295ef68d9a3c (diff)
rebaseline_server: make intermediate JSON specify base urls for diff images
BUG=skia:1919,skia:2230 NOTREECHECKS=True NOTRY=True R=rmistry@google.com Author: epoger@google.com Review URL: https://codereview.chromium.org/196533021 git-svn-id: http://skia.googlecode.com/svn/trunk@13830 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'gm')
-rw-r--r--gm/rebaseline_server/imagepairset.py50
-rwxr-xr-xgm/rebaseline_server/imagepairset_test.py16
-rwxr-xr-xgm/rebaseline_server/results.py2
-rwxr-xr-xgm/rebaseline_server/server.py2
-rw-r--r--gm/rebaseline_server/static/constants.js10
-rw-r--r--gm/rebaseline_server/static/loader.js24
-rw-r--r--gm/rebaseline_server/static/view.html25
-rw-r--r--gm/rebaseline_server/testdata/outputs/expected/results_test.ResultsTest.test_gm/gm.json18
8 files changed, 97 insertions, 50 deletions
diff --git a/gm/rebaseline_server/imagepairset.py b/gm/rebaseline_server/imagepairset.py
index 26c833e1b0..48c3064718 100644
--- a/gm/rebaseline_server/imagepairset.py
+++ b/gm/rebaseline_server/imagepairset.py
@@ -9,6 +9,10 @@ found in the LICENSE file.
ImagePairSet class; see its docstring below.
"""
+# System-level imports
+import posixpath
+
+# Local imports
import column
# Keys used within dictionary representation of ImagePairSet.
@@ -16,10 +20,15 @@ import column
KEY__EXTRACOLUMNHEADERS = 'extraColumnHeaders'
KEY__IMAGEPAIRS = 'imagePairs'
KEY__IMAGESETS = 'imageSets'
-KEY__IMAGESETS__BASE_URL = 'baseUrl'
-KEY__IMAGESETS__DESCRIPTION = 'description'
+KEY__IMAGESETS__FIELD__BASE_URL = 'baseUrl'
+KEY__IMAGESETS__FIELD__DESCRIPTION = 'description'
+KEY__IMAGESETS__SET__DIFFS = 'diffs'
+KEY__IMAGESETS__SET__IMAGE_A = 'imageA'
+KEY__IMAGESETS__SET__IMAGE_B = 'imageB'
+KEY__IMAGESETS__SET__WHITEDIFFS = 'whiteDiffs'
DEFAULT_DESCRIPTIONS = ('setA', 'setB')
+DIFF_BASE_URL = '/static/generated-images'
class ImagePairSet(object):
@@ -42,16 +51,18 @@ class ImagePairSet(object):
self._extra_column_tallies = {} # maps column_id -> values
# -> instances_per_value
self._image_pair_dicts = []
+ self._image_base_url = None
+ self._diff_base_url = DIFF_BASE_URL
def add_image_pair(self, image_pair):
"""Adds an ImagePair; this may be repeated any number of times."""
# Special handling when we add the first ImagePair...
if not self._image_pair_dicts:
- self._base_url = image_pair.base_url
+ self._image_base_url = image_pair.base_url
- if image_pair.base_url != self._base_url:
+ if image_pair.base_url != self._image_base_url:
raise Exception('added ImagePair with base_url "%s" instead of "%s"' % (
- image_pair.base_url, self._base_url))
+ image_pair.base_url, self._image_base_url))
self._image_pair_dicts.append(image_pair.as_dict())
extra_columns_dict = image_pair.extra_columns_dict
if extra_columns_dict:
@@ -127,14 +138,29 @@ class ImagePairSet(object):
Uses the KEY__* constants as keys.
"""
+ key_description = KEY__IMAGESETS__FIELD__DESCRIPTION
+ key_base_url = KEY__IMAGESETS__FIELD__BASE_URL
return {
KEY__EXTRACOLUMNHEADERS: self._column_headers_as_dict(),
KEY__IMAGEPAIRS: self._image_pair_dicts,
- KEY__IMAGESETS: [{
- KEY__IMAGESETS__BASE_URL: self._base_url,
- KEY__IMAGESETS__DESCRIPTION: self._descriptions[0],
- }, {
- KEY__IMAGESETS__BASE_URL: self._base_url,
- KEY__IMAGESETS__DESCRIPTION: self._descriptions[1],
- }],
+ KEY__IMAGESETS: {
+ KEY__IMAGESETS__SET__IMAGE_A: {
+ key_description: self._descriptions[0],
+ key_base_url: self._image_base_url,
+ },
+ KEY__IMAGESETS__SET__IMAGE_B: {
+ key_description: self._descriptions[1],
+ key_base_url: self._image_base_url,
+ },
+ KEY__IMAGESETS__SET__DIFFS: {
+ key_description: 'color difference per channel',
+ key_base_url: posixpath.join(
+ self._diff_base_url, 'diffs'),
+ },
+ KEY__IMAGESETS__SET__WHITEDIFFS: {
+ key_description: 'differing pixels in white',
+ key_base_url: posixpath.join(
+ self._diff_base_url, 'whitediffs'),
+ },
+ },
}
diff --git a/gm/rebaseline_server/imagepairset_test.py b/gm/rebaseline_server/imagepairset_test.py
index 815fd74056..2fc6d72bd4 100755
--- a/gm/rebaseline_server/imagepairset_test.py
+++ b/gm/rebaseline_server/imagepairset_test.py
@@ -106,16 +106,24 @@ class ImagePairSetTest(unittest.TestCase):
IMAGEPAIR_2_AS_DICT,
IMAGEPAIR_3_AS_DICT,
],
- 'imageSets': [
- {
+ 'imageSets': {
+ 'imageA': {
'baseUrl': BASE_URL_1,
'description': SET_A_DESCRIPTION,
},
- {
+ 'imageB': {
'baseUrl': BASE_URL_1,
'description': SET_B_DESCRIPTION,
},
- ],
+ 'diffs': {
+ 'baseUrl': '/static/generated-images/diffs',
+ 'description': 'color difference per channel',
+ },
+ 'whiteDiffs': {
+ 'baseUrl': '/static/generated-images/whitediffs',
+ 'description': 'differing pixels in white',
+ },
+ },
}
image_pair_set = imagepairset.ImagePairSet(
diff --git a/gm/rebaseline_server/results.py b/gm/rebaseline_server/results.py
index efc898a203..0a53136a25 100755
--- a/gm/rebaseline_server/results.py
+++ b/gm/rebaseline_server/results.py
@@ -38,7 +38,7 @@ import imagepairset
# Keys used to link an image to a particular GM test.
# NOTE: Keep these in sync with static/constants.js
-REBASELINE_SERVER_SCHEMA_VERSION_NUMBER = 1
+REBASELINE_SERVER_SCHEMA_VERSION_NUMBER = 2
KEY__EXPECTATIONS__BUGS = gm_json.JSONKEY_EXPECTEDRESULTS_BUGS
KEY__EXPECTATIONS__IGNOREFAILURE = gm_json.JSONKEY_EXPECTEDRESULTS_IGNOREFAILURE
KEY__EXPECTATIONS__REVIEWED = gm_json.JSONKEY_EXPECTEDRESULTS_REVIEWED
diff --git a/gm/rebaseline_server/server.py b/gm/rebaseline_server/server.py
index 19b00355ff..396f42d8e4 100755
--- a/gm/rebaseline_server/server.py
+++ b/gm/rebaseline_server/server.py
@@ -330,6 +330,8 @@ class HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
now = int(time.time())
response_dict = {
results_mod.KEY__HEADER: {
+ results_mod.KEY__HEADER__SCHEMA_VERSION: (
+ results_mod.REBASELINE_SERVER_SCHEMA_VERSION_NUMBER),
results_mod.KEY__HEADER__IS_STILL_LOADING: True,
results_mod.KEY__HEADER__TIME_UPDATED: now,
results_mod.KEY__HEADER__TIME_NEXT_UPDATE_AVAILABLE: (
diff --git a/gm/rebaseline_server/static/constants.js b/gm/rebaseline_server/static/constants.js
index 8d832f0e0b..87a07752a3 100644
--- a/gm/rebaseline_server/static/constants.js
+++ b/gm/rebaseline_server/static/constants.js
@@ -34,11 +34,15 @@ module.constant('constants', (function() {
KEY__EXTRACOLUMNHEADERS: 'extraColumnHeaders',
KEY__IMAGEPAIRS: 'imagePairs',
KEY__IMAGESETS: 'imageSets',
- KEY__IMAGESETS__BASE_URL: 'baseUrl',
- KEY__IMAGESETS__DESCRIPTION: 'description',
+ KEY__IMAGESETS__FIELD__BASE_URL: 'baseUrl',
+ KEY__IMAGESETS__FIELD__DESCRIPTION: 'description',
+ KEY__IMAGESETS__SET__DIFFS: 'diffs',
+ KEY__IMAGESETS__SET__IMAGE_A: 'imageA',
+ KEY__IMAGESETS__SET__IMAGE_B: 'imageB',
+ KEY__IMAGESETS__SET__WHITEDIFFS: 'whiteDiffs',
// NOTE: Keep these in sync with ../results.py
- REBASELINE_SERVER_SCHEMA_VERSION_NUMBER: 1,
+ REBASELINE_SERVER_SCHEMA_VERSION_NUMBER: 2,
KEY__EXPECTATIONS__BUGS: 'bugs',
KEY__EXPECTATIONS__IGNOREFAILURE: 'ignore-failure',
KEY__EXPECTATIONS__REVIEWED: 'reviewed-by-human',
diff --git a/gm/rebaseline_server/static/loader.js b/gm/rebaseline_server/static/loader.js
index d2c7288a2f..fea5aa0404 100644
--- a/gm/rebaseline_server/static/loader.js
+++ b/gm/rebaseline_server/static/loader.js
@@ -63,8 +63,7 @@ Loader.controller(
$scope.constants = constants;
$scope.windowTitle = "Loading GM Results...";
$scope.resultsToLoad = $location.search().resultsToLoad;
- $scope.loadingMessage = "Loading results from '" + $scope.resultsToLoad +
- "', please wait...";
+ $scope.loadingMessage = "please wait...";
/**
* On initial page load, load a full dictionary of results.
@@ -74,7 +73,13 @@ Loader.controller(
$http.get($scope.resultsToLoad).success(
function(data, status, header, config) {
var dataHeader = data[constants.KEY__HEADER];
- if (dataHeader[constants.KEY__HEADER__IS_STILL_LOADING]) {
+ if (dataHeader[constants.KEY__HEADER__SCHEMA_VERSION] !=
+ constants.REBASELINE_SERVER_SCHEMA_VERSION_NUMBER) {
+ $scope.loadingMessage = "ERROR: Got JSON file with schema version "
+ + dataHeader[constants.KEY__HEADER__SCHEMA_VERSION]
+ + " but expected schema version "
+ + constants.REBASELINE_SERVER_SCHEMA_VERSION_NUMBER;
+ } else if (dataHeader[constants.KEY__HEADER__IS_STILL_LOADING]) {
// Apply the server's requested reload delay to local time,
// so we will wait the right number of seconds regardless of clock
// skew between client and server.
@@ -84,19 +89,13 @@ Loader.controller(
var timeNow = new Date().getTime();
var timeToReload = timeNow + reloadDelayInSeconds * 1000;
$scope.loadingMessage =
- "Server is still loading results; will retry at " +
+ "server is still loading results; will retry at " +
$scope.localTimeString(timeToReload / 1000);
$timeout(
function(){location.reload();},
timeToReload - timeNow);
- } else if (dataHeader[constants.KEY__HEADER__SCHEMA_VERSION] !=
- constants.REBASELINE_SERVER_SCHEMA_VERSION_NUMBER) {
- $scope.loadingMessage = "ERROR: Got JSON file with schema version "
- + dataHeader[constants.KEY__HEADER__SCHEMA_VERSION]
- + " but expected schema version "
- + constants.REBASELINE_SERVER_SCHEMA_VERSION_NUMBER;
} else {
- $scope.loadingMessage = "Processing data, please wait...";
+ $scope.loadingMessage = "processing data, please wait...";
$scope.header = dataHeader;
$scope.extraColumnHeaders = data[constants.KEY__EXTRACOLUMNHEADERS];
@@ -172,8 +171,7 @@ Loader.controller(
}
).error(
function(data, status, header, config) {
- $scope.loadingMessage = "Failed to load results from '"
- + $scope.resultsToLoad + "'";
+ $scope.loadingMessage = "FAILED to load.";
$scope.windowTitle = "Failed to Load GM Results";
}
);
diff --git a/gm/rebaseline_server/static/view.html b/gm/rebaseline_server/static/view.html
index 61abcf0127..179a41ea2d 100644
--- a/gm/rebaseline_server/static/view.html
+++ b/gm/rebaseline_server/static/view.html
@@ -18,7 +18,8 @@
</a>
</h2>
- <em>
+ <em ng-show="!extraColumnHeaders"><!-- show until data is loaded -->
+ Loading results from <a href="{{resultsToLoad}}">{{resultsToLoad}}</a> ...
{{loadingMessage}}
</em>
@@ -31,7 +32,7 @@
</div>
<div ng-show="header[constants.KEY__HEADER__TIME_UPDATED]">
- Results current as of {{localTimeString(header[constants.KEY__HEADER__TIME_UPDATED])}}
+ Results from <a href="{{resultsToLoad}}">{{resultsToLoad}}</a> current as of {{localTimeString(header[constants.KEY__HEADER__TIME_UPDATED])}}
</div>
<div><!-- tabs -->
@@ -242,10 +243,10 @@
bugs
</th>
<th width="{{imageSize}}">
- {{imageSets[0][constants.KEY__IMAGESETS__DESCRIPTION]}}
+ {{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_A][constants.KEY__IMAGESETS__FIELD__DESCRIPTION]}}
</th>
<th width="{{imageSize}}">
- {{imageSets[1][constants.KEY__IMAGESETS__DESCRIPTION]}}
+ {{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_B][constants.KEY__IMAGESETS__FIELD__DESCRIPTION]}}
</th>
<th width="{{imageSize}}">
<input type="radio"
@@ -341,10 +342,10 @@
<!-- image A -->
<td valign="bottom" width="{{imageSize}}">
<div ng-if="imagePair[constants.KEY__IMAGE_A_URL] != null">
- <a href="{{imageSets[0][constants.KEY__IMAGESETS__BASE_URL]}}/{{imagePair[constants.KEY__IMAGE_A_URL]}}" target="_blank">View Image</a><br/>
+ <a href="{{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_A][constants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGE_A_URL]}}" target="_blank">View Image</a><br/>
<img ng-if="showThumbnails"
width="{{imageSize}}"
- src="{{imageSets[0][constants.KEY__IMAGESETS__BASE_URL]}}/{{imagePair[constants.KEY__IMAGE_A_URL]}}" />
+ src="{{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_A][constants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGE_A_URL]}}" />
</div>
<div ng-show="imagePair[constants.KEY__IMAGE_A_URL] == null"
style="text-align:center">
@@ -355,10 +356,10 @@
<!-- image B -->
<td valign="bottom" width="{{imageSize}}">
<div ng-if="imagePair[constants.KEY__IMAGE_B_URL] != null">
- <a href="{{imageSets[1][constants.KEY__IMAGESETS__BASE_URL]}}/{{imagePair[constants.KEY__IMAGE_B_URL]}}" target="_blank">View Image</a><br/>
+ <a href="{{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_B][constants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGE_B_URL]}}" target="_blank">View Image</a><br/>
<img ng-if="showThumbnails"
width="{{imageSize}}"
- src="{{imageSets[1][constants.KEY__IMAGESETS__BASE_URL]}}/{{imagePair[constants.KEY__IMAGE_B_URL]}}" />
+ src="{{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_B][constants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGE_B_URL]}}" />
</div>
<div ng-show="imagePair[constants.KEY__IMAGE_B_URL] == null"
style="text-align:center">
@@ -374,10 +375,10 @@
{{imagePair[constants.KEY__DIFFERENCE_DATA][constants.KEY__DIFFERENCE_DATA__PERCENT_DIFF_PIXELS].toFixed(4)}}%
({{imagePair[constants.KEY__DIFFERENCE_DATA][constants.KEY__DIFFERENCE_DATA__NUM_DIFF_PIXELS]}})
<br/>
- <a href="/static/generated-images/whitediffs/{{getImageDiffRelativeUrl(imagePair)}}" target="_blank">View Image</a><br/>
+ <a href="{{imageSets[constants.KEY__IMAGESETS__SET__WHITEDIFFS][constants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{getImageDiffRelativeUrl(imagePair)}}" target="_blank">View Image</a><br/>
<img ng-if="showThumbnails"
width="{{imageSize}}"
- src="/static/generated-images/whitediffs/{{getImageDiffRelativeUrl(imagePair)}}" />
+ src="{{imageSets[constants.KEY__IMAGESETS__SET__WHITEDIFFS][constants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{getImageDiffRelativeUrl(imagePair)}}" />
</div>
<div ng-show="!imagePair[constants.KEY__IS_DIFFERENT]"
style="text-align:center">
@@ -393,11 +394,11 @@
{{imagePair[constants.KEY__DIFFERENCE_DATA][constants.KEY__DIFFERENCE_DATA__PERCEPTUAL_DIFF].toFixed(4)}}%
{{imagePair[constants.KEY__DIFFERENCE_DATA][constants.KEY__DIFFERENCE_DATA__MAX_DIFF_PER_CHANNEL]}}
<br/>
- <a href="/static/generated-images/diffs/{{getImageDiffRelativeUrl(imagePair)}}" target="_blank">View Image</a><br/>
+ <a href="{{imageSets[constants.KEY__IMAGESETS__SET__DIFFS][constants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{getImageDiffRelativeUrl(imagePair)}}" target="_blank">View Image</a><br/>
<img ng-if="showThumbnails"
ng-style="{backgroundColor: pixelDiffBgColor}"
width="{{imageSize}}"
- src="/static/generated-images/diffs/{{getImageDiffRelativeUrl(imagePair)}}"/>
+ src="{{imageSets[constants.KEY__IMAGESETS__SET__DIFFS][constants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{getImageDiffRelativeUrl(imagePair)}}" />
</div>
<div ng-show="!imagePair[constants.KEY__IS_DIFFERENT]"
style="text-align:center">
diff --git a/gm/rebaseline_server/testdata/outputs/expected/results_test.ResultsTest.test_gm/gm.json b/gm/rebaseline_server/testdata/outputs/expected/results_test.ResultsTest.test_gm/gm.json
index 562d6c1424..5c106b0565 100644
--- a/gm/rebaseline_server/testdata/outputs/expected/results_test.ResultsTest.test_gm/gm.json
+++ b/gm/rebaseline_server/testdata/outputs/expected/results_test.ResultsTest.test_gm/gm.json
@@ -52,7 +52,7 @@
"dataHash": "2099241024256114776",
"isEditable": false,
"isExported": true,
- "schemaVersion": 1,
+ "schemaVersion": 2,
"timeNextUpdateAvailable": null,
"timeUpdated": 12345678,
"type": "all"
@@ -541,14 +541,22 @@
"isDifferent": false
}
],
- "imageSets": [
- {
+ "imageSets": {
+ "diffs": {
+ "baseUrl": "/static/generated-images/diffs",
+ "description": "color difference per channel"
+ },
+ "imageA": {
"baseUrl": "http://chromium-skia-gm.commondatastorage.googleapis.com/gm",
"description": "expected image"
},
- {
+ "imageB": {
"baseUrl": "http://chromium-skia-gm.commondatastorage.googleapis.com/gm",
"description": "actual image"
+ },
+ "whiteDiffs": {
+ "baseUrl": "/static/generated-images/whitediffs",
+ "description": "differing pixels in white"
}
- ]
+ }
} \ No newline at end of file