rebaseline.py: fix --add-new when there are no expectations at all

BUG=skia:1582
R=rmistry@google.com

Review URL: https://codereview.chromium.org/23899003

git-svn-id: http://skia.googlecode.com/svn/trunk@11063 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
epoger@google.com 2013-09-03 18:27:19 +00:00
Родитель 8b4ba63735
Коммит 93acfd2b49
11 изменённых файлов: 250 добавлений и 97 удалений

Просмотреть файл

@ -94,47 +94,42 @@ TEST_BUILDERS = [
class _InternalException(Exception): class _InternalException(Exception):
pass pass
# Object that handles exceptions, either raising them immediately or collecting
# them to display later on.
class ExceptionHandler(object): class ExceptionHandler(object):
""" Object that handles exceptions, either raising them immediately or
collecting them to display later on."""
# params: # params:
# keep_going_on_failure: if False, report failures and quit right away;
# if True, collect failures until
# ReportAllFailures() is called
def __init__(self, keep_going_on_failure=False): def __init__(self, keep_going_on_failure=False):
"""
params:
keep_going_on_failure: if False, report failures and quit right away;
if True, collect failures until
ReportAllFailures() is called
"""
self._keep_going_on_failure = keep_going_on_failure self._keep_going_on_failure = keep_going_on_failure
self._failures_encountered = [] self._failures_encountered = []
self._exiting = False
# Exit the program with the given status value. def RaiseExceptionOrContinue(self):
def _Exit(self, status=1): """ We have encountered an exception; either collect the info and keep
self._exiting = True going, or exit the program right away."""
sys.exit(status) # Get traceback information about the most recently raised exception.
exc_info = sys.exc_info()
# We have encountered an exception; either collect the info and keep going,
# or exit the program right away.
def RaiseExceptionOrContinue(self, e):
# If we are already quitting the program, propagate any exceptions
# so that the proper exit status will be communicated to the shell.
if self._exiting:
raise e
if self._keep_going_on_failure: if self._keep_going_on_failure:
print >> sys.stderr, 'WARNING: swallowing exception %s' % e print >> sys.stderr, ('WARNING: swallowing exception %s' %
self._failures_encountered.append(e) repr(exc_info[1]))
self._failures_encountered.append(exc_info)
else: else:
print >> sys.stderr, e
print >> sys.stderr, ( print >> sys.stderr, (
'Halting at first exception; to keep going, re-run ' + 'Halting at first exception; to keep going, re-run ' +
'with the --keep-going-on-failure option set.') 'with the --keep-going-on-failure option set.')
self._Exit() raise exc_info[1], None, exc_info[2]
def ReportAllFailures(self): def ReportAllFailures(self):
if self._failures_encountered: if self._failures_encountered:
print >> sys.stderr, ('Encountered %d failures (see above).' % print >> sys.stderr, ('Encountered %d failures (see above).' %
len(self._failures_encountered)) len(self._failures_encountered))
self._Exit() sys.exit(1)
# Object that rebaselines a JSON expectations file (not individual image files). # Object that rebaselines a JSON expectations file (not individual image files).
@ -272,7 +267,10 @@ class JsonRebaseliner(object):
expectations_input_filepath = os.path.join( expectations_input_filepath = os.path.join(
self._expectations_root, builder, self._expectations_input_filename) self._expectations_root, builder, self._expectations_input_filename)
expectations_dict = gm_json.LoadFromFile(expectations_input_filepath) expectations_dict = gm_json.LoadFromFile(expectations_input_filepath)
expected_results = expectations_dict[gm_json.JSONKEY_EXPECTEDRESULTS] expected_results = expectations_dict.get(gm_json.JSONKEY_EXPECTEDRESULTS)
if not expected_results:
expected_results = {}
expectations_dict[gm_json.JSONKEY_EXPECTEDRESULTS] = expected_results
# Update the expectations in memory, skipping any tests/configs that # Update the expectations in memory, skipping any tests/configs that
# the caller asked to exclude. # the caller asked to exclude.
@ -330,7 +328,6 @@ parser.add_argument('--actuals-filename',
'of ACTUALS_BASE_URL) to read a summary of results ' 'of ACTUALS_BASE_URL) to read a summary of results '
'from; defaults to %(default)s'), 'from; defaults to %(default)s'),
default='actual-results.json') default='actual-results.json')
# TODO(epoger): Add test that exercises --add-new argument.
parser.add_argument('--add-new', action='store_true', parser.add_argument('--add-new', action='store_true',
help=('in addition to the standard behavior of ' help=('in addition to the standard behavior of '
'updating expectations for failing tests, add ' 'updating expectations for failing tests, add '
@ -417,10 +414,13 @@ for builder in builders:
mark_unreviewed=args.unreviewed) mark_unreviewed=args.unreviewed)
try: try:
rebaseliner.RebaselineSubdir(builder=builder) rebaseliner.RebaselineSubdir(builder=builder)
except BaseException as e: except:
exception_handler.RaiseExceptionOrContinue(e) exception_handler.RaiseExceptionOrContinue()
else: else:
exception_handler.RaiseExceptionOrContinue(_InternalException( try:
'expectations_json_file %s not found' % expectations_json_file)) raise _InternalException('expectations_json_file %s not found' %
expectations_json_file)
except:
exception_handler.RaiseExceptionOrContinue()
exception_handler.ReportAllFailures() exception_handler.ReportAllFailures()

Просмотреть файл

@ -1,34 +1,26 @@
{ {
"actual-results" : { "actual-results" : {
"failed" : { "failed" : null,
"aaclip_565.png" : [ "bitmap-64bitMD5", 6190901827590820995 ],
"aaclip_8888.png" : [ "bitmap-64bitMD5", 14456211900777561488 ]
},
"failure-ignored" : null, "failure-ignored" : null,
"no-comparison" : { "no-comparison" : {
"aaclip_565.png" : [ "bitmap-64bitMD5", 6190901827590820995 ],
"aaclip_8888.png" : [ "bitmap-64bitMD5", 14456211900777561488 ],
"aaclip_gpu.png" : [ "bitmap-64bitMD5", 11899819492385205974 ],
"aaclip_pdf.png" : [ "bitmap-64bitMD5", 13515207506164874564 ] "aaclip_pdf.png" : [ "bitmap-64bitMD5", 13515207506164874564 ]
}, },
"succeeded" : { "succeeded" : null
"aaclip_gpu.png" : [ "bitmap-64bitMD5", 11899819492385205974 ]
}
}, },
"expected-results" : { "expected-results" : {
"aaclip_565.png" : { "aaclip_565.png" : {
"allowed-digests" : [ "allowed-digests" : null,
[ "bitmap-64bitMD5", 12345 ]
],
"ignore-failure" : false "ignore-failure" : false
}, },
"aaclip_8888.png" : { "aaclip_8888.png" : {
"allowed-digests" : [ "allowed-digests" : null,
[ "bitmap-64bitMD5", 67890 ]
],
"ignore-failure" : false "ignore-failure" : false
}, },
"aaclip_gpu.png" : { "aaclip_gpu.png" : {
"allowed-digests" : [ "allowed-digests" : null,
[ "bitmap-64bitMD5", 11899819492385205974 ]
],
"ignore-failure" : false "ignore-failure" : false
}, },
"aaclip_pdf.png" : { "aaclip_pdf.png" : {

Просмотреть файл

@ -1,26 +1 @@
{ {}
"expected-results" : {
"aaclip_565.png" : {
"allowed-digests" : [
[ "bitmap-64bitMD5", 12345 ]
],
"ignore-failure" : false
},
"aaclip_8888.png" : {
"allowed-digests" : [
[ "bitmap-64bitMD5", 67890 ]
],
"ignore-failure" : false
},
"aaclip_gpu.png" : {
"allowed-digests" : [
[ "bitmap-64bitMD5", 11899819492385205974 ]
],
"ignore-failure" : false
},
"aaclip_pdf.png" : {
"allowed-digests" : null,
"ignore-failure" : false
}
}
}

Просмотреть файл

@ -0,0 +1 @@
python tools/rebaseline.py --expectations-root tools/tests/rebaseline/output/add-new/output-actual/gm-expectations --actuals-base-url tools/tests/rebaseline/input/json1 --add-new --builders Test-Android-GalaxyNexus-SGX540-Arm7-Debug Test-Mac10.6-MacMini4.1-GeForce320M-x86-Release Test-Win7-ShuttleA-HD2000-x86-Release

Просмотреть файл

@ -0,0 +1,87 @@
{
"expected-results": {
"3x3bitmaprect_565.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
16998423976396106083
]
],
"ignore-failure": false
},
"3x3bitmaprect_8888.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
2054956815327187963
]
],
"ignore-failure": false
},
"aaclip_gpu.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
11899819492385205974
]
],
"ignore-failure": false,
"unknown-extra-field": "make sure that rebaseline.py maintains this unknown field within a record whose allowed-digest IS NOT modified"
},
"aarectmodes_565.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
14760033689012826769
]
],
"ignore-failure": false
},
"imageblur_565.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
3359963596899141322
]
],
"ignore-failure": false,
"unknown-extra-field": "make sure that rebaseline.py maintains this unknown field within a record whose allowed-digest IS modified"
},
"imageblur_8888.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
4217923806027861152
]
],
"ignore-failure": false
},
"shadertext3_8888.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
3713708307125704716
]
],
"ignore-failure": false
},
"xfermodeimagefilter_pdf.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
16502178848783208088
]
],
"ignore-failure": false
},
"xfermodes_pdf.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
9151974350149210736
]
],
"ignore-failure": false
}
}
}

Просмотреть файл

@ -0,0 +1,36 @@
{
"expected-results": {
"aaclip_565.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
6190901827590820995
]
]
},
"aaclip_8888.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
14456211900777561488
]
]
},
"aaclip_gpu.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
11899819492385205974
]
]
},
"aaclip_pdf.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
13515207506164874564
]
]
}
}
}

Просмотреть файл

@ -0,0 +1,85 @@
{
"expected-results": {
"3x3bitmaprect_565.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
16998423976396106083
]
],
"ignore-failure": false
},
"3x3bitmaprect_8888.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
2054956815327187963
]
],
"ignore-failure": false
},
"aaclip_gpu.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
11899819492385205974
]
],
"ignore-failure": false
},
"aarectmodes_565.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
14760033689012826769
]
],
"ignore-failure": false
},
"imageblur_565.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
3359963596899141322
]
],
"ignore-failure": false
},
"imageblur_8888.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
4217923806027861152
]
],
"ignore-failure": false
},
"shadertext3_8888.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
3713708307125704716
]
],
"ignore-failure": false
},
"xfermodeimagefilter_pdf.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
16502178848783208088
]
],
"ignore-failure": false
},
"xfermodes_pdf.png": {
"allowed-digests": [
[
"bitmap-64bitMD5",
9151974350149210736
]
],
"ignore-failure": false
}
}
}

Просмотреть файл

@ -0,0 +1 @@
0

Просмотреть файл

Просмотреть файл

@ -1,26 +1 @@
{ {}
"expected-results" : {
"aaclip_565.png" : {
"allowed-digests" : [
[ "bitmap-64bitMD5", 12345 ]
],
"ignore-failure" : false
},
"aaclip_8888.png" : {
"allowed-digests" : [
[ "bitmap-64bitMD5", 67890 ]
],
"ignore-failure" : false
},
"aaclip_gpu.png" : {
"allowed-digests" : [
[ "bitmap-64bitMD5", 11899819492385205974 ]
],
"ignore-failure" : false
},
"aaclip_pdf.png" : {
"allowed-digests" : null,
"ignore-failure" : false
}
}
}

Просмотреть файл

@ -244,6 +244,7 @@ REBASELINE_INPUT=tools/tests/rebaseline/input
REBASELINE_OUTPUT=tools/tests/rebaseline/output REBASELINE_OUTPUT=tools/tests/rebaseline/output
rebaseline_test "$REBASELINE_INPUT/json1" "--actuals-base-url $REBASELINE_INPUT/json1 --builders Test-Android-GalaxyNexus-SGX540-Arm7-Debug Test-Win7-ShuttleA-HD2000-x86-Release" "$REBASELINE_OUTPUT/using-json1-expectations" rebaseline_test "$REBASELINE_INPUT/json1" "--actuals-base-url $REBASELINE_INPUT/json1 --builders Test-Android-GalaxyNexus-SGX540-Arm7-Debug Test-Win7-ShuttleA-HD2000-x86-Release" "$REBASELINE_OUTPUT/using-json1-expectations"
rebaseline_test "$REBASELINE_INPUT/json1" "--actuals-base-url $REBASELINE_INPUT/json1 --bugs 1234 5678 --builders Test-Android-GalaxyNexus-SGX540-Arm7-Debug Test-Win7-ShuttleA-HD2000-x86-Release --notes notes_content --unreviewed" "$REBASELINE_OUTPUT/marked-unreviewed" rebaseline_test "$REBASELINE_INPUT/json1" "--actuals-base-url $REBASELINE_INPUT/json1 --bugs 1234 5678 --builders Test-Android-GalaxyNexus-SGX540-Arm7-Debug Test-Win7-ShuttleA-HD2000-x86-Release --notes notes_content --unreviewed" "$REBASELINE_OUTPUT/marked-unreviewed"
rebaseline_test "$REBASELINE_INPUT/json1" "--actuals-base-url $REBASELINE_INPUT/json1 --add-new --builders Test-Android-GalaxyNexus-SGX540-Arm7-Debug Test-Mac10.6-MacMini4.1-GeForce320M-x86-Release Test-Win7-ShuttleA-HD2000-x86-Release" "$REBASELINE_OUTPUT/add-new"
# #
# Test jsondiff.py ... # Test jsondiff.py ...