From 507881a7b8b1062ac03ac733fde43cc04d3fccfc Mon Sep 17 00:00:00 2001 From: Sarah Clements Date: Fri, 17 Jul 2020 10:28:01 -0700 Subject: [PATCH] Remove step parser v3 (#6634) * remove StepParser and switch to ErrorParser * remove writes to TextLogStep from artifact.py * remove buildbot ref in builders * replace TextLogStep model in DetailsPanel, SimilarJobsTab and logviewer App * cleanup DetailsPanel * remove old log parsing tests and update others * add logging to error_summary.py * add parse max error lines limit to ErrorParser * fix in similar jobs tab for Bug 1652869 --- schemas/text-log-summary-artifact.yml | 83 --- tests/autoclassify/test_classify_failures.py | 4 +- tests/autoclassify/utils.py | 15 +- tests/etl/test_load_artifacts.py | 62 +-- .../test_artifact_builder_collection.py | 8 +- .../test_log_view_artifact_builder.py | 90 ++-- .../test_performance_artifact_builder.py | 4 +- tests/model/test_classified_failure.py | 2 +- .../artifacts/text_log_summary.json | 193 +------ tests/sample_data/logs/crash-1.logview.json | 85 +-- .../logs/jsreftest-fail.logview.json | 471 ++++++++-------- ...in32-pgo-bm85-build1-build111.logview.json | 503 ------------------ ...bm54-tests1-linux-build50.jobartifact.json | 16 - ...t-1-bm54-tests1-linux-build50.logview.json | 116 ---- ...77-tests1-macosx-build141.jobartifact.json | 16 - ...2-bm77-tests1-macosx-build141.logview.json | 116 ---- ...4-bm103-tests1-linux-build369.logview.json | 150 +----- ...e-bm74-tests1-windows-build12.logview.json | 231 +------- ...er-bm53-tests1-linux-build122.logview.json | 212 ++------ .../logs/opt-objc-exception.logview.json | 79 +-- tests/ui/job-view/Filtering_test.jsx | 2 +- tests/ui/job-view/details/PinBoard_test.jsx | 2 +- tests/ui/mock/full_job.json | 2 +- .../push-health/details/DetailsPanel_test.jsx | 2 +- tests/ui/shared/FailureSummaryTab_test.jsx | 2 +- tests/webapp/api/test_jobs_api.py | 107 +--- treeherder/autoclassify/autoclassify.py | 4 +- treeherder/autoclassify/matchers.py | 4 +- treeherder/config/settings.py | 2 +- treeherder/etl/artifact.py | 40 +- .../log_parser/artifactbuildercollection.py | 12 +- treeherder/log_parser/artifactbuilders.py | 10 +- treeherder/log_parser/crossreference.py | 2 +- treeherder/log_parser/parsers.py | 224 +------- treeherder/log_parser/tasks.py | 10 +- treeherder/model/error_summary.py | 10 +- treeherder/model/models.py | 13 +- treeherder/webapp/api/intermittents_view.py | 4 +- treeherder/webapp/api/jobs.py | 5 +- ui/helpers/url.js | 2 + ui/job-view/details/tabs/SimilarJobsTab.jsx | 21 +- ui/logviewer/App.jsx | 28 +- ui/models/textLogErrors.js | 20 - ui/models/textLogStep.js | 9 - ui/shared/tabs/LogviewerTab.jsx | 24 +- ui/shared/tabs/failureSummary/ErrorsList.jsx | 10 +- .../tabs/failureSummary/FailureSummaryTab.jsx | 33 +- 47 files changed, 526 insertions(+), 2534 deletions(-) delete mode 100644 schemas/text-log-summary-artifact.yml delete mode 100644 tests/sample_data/logs/mozilla-central-win32-pgo-bm85-build1-build111.logview.json delete mode 100644 tests/sample_data/logs/mozilla-central_fedora-b2g_test-crashtest-1-bm54-tests1-linux-build50.jobartifact.json delete mode 100644 tests/sample_data/logs/mozilla-central_fedora-b2g_test-crashtest-1-bm54-tests1-linux-build50.logview.json delete mode 100644 tests/sample_data/logs/mozilla-central_mountainlion_test-mochitest-2-bm77-tests1-macosx-build141.jobartifact.json delete mode 100644 tests/sample_data/logs/mozilla-central_mountainlion_test-mochitest-2-bm77-tests1-macosx-build141.logview.json delete mode 100644 ui/models/textLogErrors.js delete mode 100644 ui/models/textLogStep.js diff --git a/schemas/text-log-summary-artifact.yml b/schemas/text-log-summary-artifact.yml deleted file mode 100644 index dc8e5edfc..000000000 --- a/schemas/text-log-summary-artifact.yml +++ /dev/null @@ -1,83 +0,0 @@ -'$schema': http://json-schema.org/draft-04/schema# -type: object -properties: - blob: - type: object - properties: - step_data: - type: object - properties: - steps: - type: array - items: - type: object - properties: - errors: - type: array - items: - type: object - properties: - line: - type: string - linenumber: - type: integer - additionalProperties: false - additionalItems: false - name: - type: string - started: - type: string - format: date-time - started_linenumber: - type: integer - finished_linenumber: - type: integer - finished: - type: string - format: date-time - result: - type: string - enum: - [ - busted, - testfailed, - exception, - success, - canceled, - unknown, - retry, - skipped, - ] - required: - - errors - - name - - started - - started_linenumber - - finished_linenumber - - finished - - result - additionalProperties: false - additionalItems: false - errors_truncated: - type: boolean - additionalProperties: false - required: - - steps - - errors_truncated - logurl: - type: string - additionalProperties: false - required: - - step_data - - logurl - type: - type: string - name: - type: string - job_guid: - type: integer -additionalProperties: false -required: - - blob - - type - - name diff --git a/tests/autoclassify/test_classify_failures.py b/tests/autoclassify/test_classify_failures.py index 46794a341..bc6c47033 100644 --- a/tests/autoclassify/test_classify_failures.py +++ b/tests/autoclassify/test_classify_failures.py @@ -104,9 +104,7 @@ def test_autoclassify_no_update_job_classification( lines = [(test_line, {})] test_error_lines, test_failure_lines = create_lines(test_job_2, lines) TextLogError.objects.create( - step=test_error_lines[0].step, - line="Some error that isn't in the structured logs", - line_number=2, + job=test_job_2, line="Some error that isn't in the structured logs", line_number=2, ) do_autoclassify(test_job_2, test_failure_lines, [precise_matcher]) diff --git a/tests/autoclassify/utils.py b/tests/autoclassify/utils.py index 00374413a..c45780844 100644 --- a/tests/autoclassify/utils.py +++ b/tests/autoclassify/utils.py @@ -1,5 +1,3 @@ -import datetime - from mozlog.formatters.tbplformatter import TbplFormatter from treeherder.model.models import ( @@ -8,7 +6,6 @@ from treeherder.model.models import ( JobLog, TextLogError, TextLogErrorMetadata, - TextLogStep, ) test_line = { @@ -79,16 +76,6 @@ def get_data(base_data, updates): def create_text_log_errors(job, failure_line_list): - step = TextLogStep.objects.create( - job=job, - name='everything', - started_line_number=1, - finished_line_number=10, - started=datetime.datetime.now(), - finished=datetime.datetime.now(), - result=TextLogStep.TEST_FAILED, - ) - formatter = TbplFormatter() errors = [] for i, (base_data, updates) in enumerate(failure_line_list): @@ -96,7 +83,7 @@ def create_text_log_errors(job, failure_line_list): if not data: continue error = TextLogError.objects.create( - step=step, line=formatter(data).split("\n")[0], line_number=i + job=job, line=formatter(data).split("\n")[0], line_number=i ) errors.append(error) diff --git a/tests/etl/test_load_artifacts.py b/tests/etl/test_load_artifacts.py index b0bc58a8d..08c1eb0f8 100644 --- a/tests/etl/test_load_artifacts.py +++ b/tests/etl/test_load_artifacts.py @@ -1,7 +1,7 @@ import json from treeherder.etl.artifact import store_job_artifacts -from treeherder.model.models import TextLogError, TextLogStep +from treeherder.model.models import TextLogError def test_load_textlog_summary_twice(test_repository, test_job): @@ -10,32 +10,21 @@ def test_load_textlog_summary_twice(test_repository, test_job): 'name': 'text_log_summary', 'blob': json.dumps( { - 'step_data': { - "steps": [ - { - 'name': 'foo', - 'started': '2016-05-10 12:44:23.103904', - 'started_linenumber': 8, - 'finished_linenumber': 10, - 'finished': '2016-05-10 12:44:23.104394', - 'result': 'success', - 'errors': [{"line": '07:51:28 WARNING - foobar', "linenumber": 1587}], - } - ] - } + 'errors': [ + {"line": 'WARNING - foobar', "linenumber": 1587}, + {"line": 'WARNING - foobar', "linenumber": 1590}, + ], } ), 'job_guid': test_job.guid, } store_job_artifacts([text_log_summary_artifact]) - assert TextLogError.objects.count() == 1 - assert TextLogStep.objects.count() == 1 + assert TextLogError.objects.count() == 2 # load again (simulating the job being parsed twice, # which sometimes happens) store_job_artifacts([text_log_summary_artifact]) - assert TextLogError.objects.count() == 1 - assert TextLogStep.objects.count() == 1 + assert TextLogError.objects.count() == 2 def test_load_non_ascii_textlog_errors(test_job): @@ -44,34 +33,23 @@ def test_load_non_ascii_textlog_errors(test_job): 'name': 'text_log_summary', 'blob': json.dumps( { - 'step_data': { - "steps": [ - { - 'name': 'foo', - 'started': '2016-05-10 12:44:23.103904', - 'started_linenumber': 8, - 'finished_linenumber': 10, - 'finished': '2016-05-10 12:44:23.104394', - 'result': 'success', - 'errors': [ - { - # non-ascii character - "line": '07:51:28 WARNING - \U000000c3', - "linenumber": 1587, - }, - { - # astral character (i.e. higher than ucs2) - "line": '07:51:29 WARNING - \U0001d400', - "linenumber": 1588, - }, - ], - } - ] - } + 'errors': [ + { + # non-ascii character + "line": '07:51:28 WARNING - \U000000c3', + "linenumber": 1587, + }, + { + # astral character (i.e. higher than ucs2) + "line": '07:51:29 WARNING - \U0001d400', + "linenumber": 1588, + }, + ], } ), 'job_guid': test_job.guid, } + store_job_artifacts([text_log_summary_artifact]) assert TextLogError.objects.count() == 2 diff --git a/tests/log_parser/test_artifact_builder_collection.py b/tests/log_parser/test_artifact_builder_collection.py index 160079f51..e89f0fa91 100644 --- a/tests/log_parser/test_artifact_builder_collection.py +++ b/tests/log_parser/test_artifact_builder_collection.py @@ -7,19 +7,19 @@ from treeherder.log_parser.artifactbuildercollection import ( ArtifactBuilderCollection, LogSizeException, ) -from treeherder.log_parser.artifactbuilders import BuildbotLogViewArtifactBuilder +from treeherder.log_parser.artifactbuilders import LogViewerArtifactBuilder def test_builders_as_list(): """test that passing in a list of builders works""" - builder = BuildbotLogViewArtifactBuilder() + builder = LogViewerArtifactBuilder() lpc = ArtifactBuilderCollection("foo-url", builders=[builder]) assert lpc.builders == [builder] def test_builders_as_single_still_list(): """test that passing in a single builder becomes a list""" - builder = BuildbotLogViewArtifactBuilder() + builder = LogViewerArtifactBuilder() lpc = ArtifactBuilderCollection("foo-url", builders=builder) assert lpc.builders == [builder] @@ -43,7 +43,7 @@ def test_all_builders_complete(): lpc.parse() exp = { - "text_log_summary": {"step_data": {"steps": [], "errors_truncated": False}, "logurl": url,}, + "text_log_summary": {"errors": [], "logurl": url,}, } assert exp == lpc.artifacts diff --git a/tests/log_parser/test_log_view_artifact_builder.py b/tests/log_parser/test_log_view_artifact_builder.py index f7df558c5..de8c3d25b 100644 --- a/tests/log_parser/test_log_view_artifact_builder.py +++ b/tests/log_parser/test_log_view_artifact_builder.py @@ -4,9 +4,9 @@ import responses from tests import test_utils from tests.test_utils import add_log_response from treeherder.log_parser.artifactbuildercollection import ArtifactBuilderCollection -from treeherder.log_parser.artifactbuilders import BuildbotLogViewArtifactBuilder +from treeherder.log_parser.artifactbuilders import LogViewerArtifactBuilder -slow = pytest.mark.slow +skip = pytest.mark.skip @responses.activate @@ -20,7 +20,7 @@ def do_test(log): url = add_log_response("{}.txt.gz".format(log)) - builder = BuildbotLogViewArtifactBuilder(url) + builder = LogViewerArtifactBuilder(url) lpc = ArtifactBuilderCollection(url, builders=builder) lpc.parse() act = lpc.artifacts[builder.name] @@ -36,23 +36,6 @@ def do_test(log): assert act == exp -def test_crashtest_passing(): - """Process a job with a single log reference.""" - - do_test("mozilla-central_fedora-b2g_test-crashtest-1-bm54-tests1-linux-build50") - - -def test_mochitest_pass(): - """Process a job with a single log reference.""" - - do_test("mozilla-central_mountainlion_test-mochitest-2-bm77-tests1-macosx-build141") - - -def test_duration_gt_1hr(): - do_test("mozilla-central-win32-pgo-bm85-build1-build111") - - -@slow def test_mochitest_fail(): """Process a job with a single log reference.""" @@ -65,128 +48,133 @@ def test_mochitest_process_crash(): do_test("mozilla-inbound_ubuntu64_vm-debug_test-mochitest-other-bm53-tests1-linux-build122") -@slow +def test_crash_1(): + """Test from old log parser""" + do_test("crash-1") + + +def test_opt_objc_exception(): + """Test from old log parser""" + do_test("opt-objc-exception") + + +def test_jsreftest_fail(): + """Test from old log parser""" + do_test("jsreftest-fail") + + +# TODO remove old tests and update active tests with current live backing logs +@skip def test_jetpack_fail(): """Process a job with a single log reference.""" do_test("ux_ubuntu32_vm_test-jetpack-bm67-tests1-linux-build16") -@slow -def test_crash_1(): - """Test from old log parser""" - do_test("crash-1") - - -@slow +@skip def test_crash_2(): """Test from old log parser""" do_test("crash-2") -@slow +@skip def test_crash_mac_1(): """Test from old log parser""" do_test("crash-mac-1") -@slow +@skip def test_crashtest_timeout(): """Test from old log parser""" do_test("crashtest-timeout") -@slow -def test_jsreftest_fail(): - """Test from old log parser""" - do_test("jsreftest-fail") - - -@slow +@skip def test_jsreftest_timeout_crash(): """Test from old log parser""" do_test("jsreftest-timeout-crash") -@slow +@skip def test_leaks_1(): """Test from old log parser""" do_test("leaks-1") -@slow +@skip def test_mochitest_test_end(): """Test from old log parser""" do_test("mochitest-test-end") -@slow +@skip def test_multiple_timeouts(): """Test from old log parser""" do_test("multiple-timeouts") -@slow -def test_opt_objc_exception(): - """Test from old log parser""" - do_test("opt-objc-exception") - - -@slow +@skip def test_reftest_fail_crash(): """Test from old log parser""" do_test("reftest-fail-crash") -@slow +@skip def test_reftest_jserror(): """Test from old log parser""" do_test("reftest-jserror") -@slow +@skip def test_reftest_opt_fail(): """Test from old log parser""" do_test("reftest-opt-fail") -@slow +@skip def test_reftest_timeout(): """Test from old log parser""" do_test("reftest-timeout") -@slow +@skip def test_tinderbox_exception(): """Test from old log parser""" do_test("tinderbox-exception") +@skip def test_xpcshell_crash(): """Test from old log parser""" do_test("xpcshell-crash") +@skip def test_xpcshell_multiple(): """Test from old log parser""" do_test("xpcshell-multiple") +@skip def test_xpcshell_timeout(): """Test from old log parser""" do_test("xpcshell-timeout") +@skip +# This test is not actually testing truncation of lines - remove def test_extreme_log_line_length_truncation(): """This log has lines that are huge. Ensure we truncate the lines to 100""" do_test("mozilla-central_ubuntu64_hw_test-androidx86-set-4-bm103-tests1-linux-build369") +@skip def test_too_many_error_lines_truncation(): """This log has a large number of lines that match the error regex. Ensure we truncate to 100 lines.""" do_test("large-number-of-error-lines") +@skip def test_taskcluster_missing_finish_marker(): """ A log from a Taskcluster job, where there was an infrastructure problem, diff --git a/tests/log_parser/test_performance_artifact_builder.py b/tests/log_parser/test_performance_artifact_builder.py index bdda5e6ee..1913094de 100644 --- a/tests/log_parser/test_performance_artifact_builder.py +++ b/tests/log_parser/test_performance_artifact_builder.py @@ -3,7 +3,7 @@ from jsonschema import validate from tests.test_utils import add_log_response from treeherder.log_parser.artifactbuildercollection import ArtifactBuilderCollection -from treeherder.log_parser.artifactbuilders import BuildbotPerformanceDataArtifactBuilder +from treeherder.log_parser.artifactbuilders import PerformanceDataArtifactBuilder from treeherder.log_parser.utils import PERFHERDER_SCHEMA @@ -21,7 +21,7 @@ def test_performance_log_parsing(): ]: url = add_log_response(logfile) - builder = BuildbotPerformanceDataArtifactBuilder(url=url) + builder = PerformanceDataArtifactBuilder(url=url) lpc = ArtifactBuilderCollection(url, builders=[builder]) lpc.parse() act = lpc.artifacts[builder.name] diff --git a/tests/model/test_classified_failure.py b/tests/model/test_classified_failure.py index c0e7aeb79..b98d31a37 100644 --- a/tests/model/test_classified_failure.py +++ b/tests/model/test_classified_failure.py @@ -81,7 +81,7 @@ def test_update_autoclassification_bug(test_job, test_job_2, classified_failures mark_best_classification(text_log_errors[0], classified_failure) assert classified_failure.bug_number is None - metadata = TextLogErrorMetadata.objects.get(text_log_error__step__job=test_job_2) + metadata = TextLogErrorMetadata.objects.get(text_log_error__job=test_job_2) metadata.failure_line = FailureLine.objects.get(pk=3) metadata.save() diff --git a/tests/sample_data/artifacts/text_log_summary.json b/tests/sample_data/artifacts/text_log_summary.json index 5fb572b53..2a33adcc0 100644 --- a/tests/sample_data/artifacts/text_log_summary.json +++ b/tests/sample_data/artifacts/text_log_summary.json @@ -1,180 +1,23 @@ { "blob": { - "step_data": { - "steps": [ - { - "errors": [], - "name": "set props: master", - "started": "2015-04-15 05:25:03.168328", - "started_linenumber": 8, - "finished_linenumber": 10, - "finished": "2015-04-15 05:25:03.168795", - "result": "success" - }, - { - "errors": [], - "name": "set props: basedir", - "started": "2015-04-15 05:25:03.169099", - "started_linenumber": 12, - "finished_linenumber": 40, - "finished": "2015-04-15 05:25:03.597219", - "result": "success" - }, - { - "errors": [], - "name": "downloading to buildprops.json", - "started": "2015-04-15 05:25:03.597542", - "started_linenumber": 42, - "finished_linenumber": 43, - "finished": "2015-04-15 05:25:03.726142", - "result": "success" - }, - { - "errors": [], - "name": "'rm -rf ...'", - "started": "2015-04-15 05:25:03.726523", - "started_linenumber": 45, - "finished_linenumber": 71, - "finished": "2015-04-15 05:25:03.777120", - "result": "success" - }, - { - "errors": [], - "name": "set props: script_repo_url", - "started": "2015-04-15 05:25:03.777445", - "started_linenumber": 73, - "finished_linenumber": 75, - "finished": "2015-04-15 05:25:03.777817", - "result": "success" - }, - { - "errors": [], - "name": "'bash -c ...'", - "started": "2015-04-15 05:25:03.778747", - "started_linenumber": 77, - "finished_linenumber": 114, - "finished": "2015-04-15 05:25:03.945448", - "result": "success" - }, - { - "errors": [], - "name": "set props: script_repo_revision script_repo_url", - "started": "2015-04-15 05:25:03.945809", - "started_linenumber": 116, - "finished_linenumber": 146, - "finished": "2015-04-15 05:25:04.682022", - "result": "success" - }, - { - "errors": [], - "name": "'rm -rf ...'", - "started": "2015-04-15 05:25:04.682572", - "started_linenumber": 148, - "finished_linenumber": 174, - "finished": "2015-04-15 05:25:05.278125", - "result": "success" - }, - { - "errors": [], - "name": "'hg clone ...'", - "started": "2015-04-15 05:25:05.278437", - "started_linenumber": 176, - "finished_linenumber": 210, - "finished": "2015-04-15 05:25:11.964370", - "result": "success" - }, - { - "errors": [], - "name": "'hg update ...'", - "started": "2015-04-15 05:25:11.964712", - "started_linenumber": 212, - "finished_linenumber": 239, - "finished": "2015-04-15 05:25:12.506740", - "result": "success" - }, - { - "errors": [], - "name": "set props: script_repo_revision", - "started": "2015-04-15 05:25:12.507514", - "started_linenumber": 241, - "finished_linenumber": 269, - "finished": "2015-04-15 05:25:12.700263", - "result": "success" - }, - { - "errors": [], - "name": "downloading to oauth.txt", - "started": "2015-04-15 05:25:12.700568", - "started_linenumber": 271, - "finished_linenumber": 272, - "finished": "2015-04-15 05:25:12.730239", - "result": "success" - }, - { - "errors": [], - "name": "tinderboxprint_script_revlink", - "started": "2015-04-15 05:25:12.730485", - "started_linenumber": 274, - "finished_linenumber": 276, - "finished": "2015-04-15 05:25:12.730832", - "result": "success" - }, - { - "errors": [ - { - "line": "05:35:49 INFO - 2018 INFO TEST-UNEXPECTED-FAIL | dom/indexedDB/test/test_transaction_lifetimes.html | Should be able to get objectStore - expected PASS", - "linenumber": 8151 - }, - { - "line": "05:35:49 INFO - 2019 INFO TEST-UNEXPECTED-FAIL | dom/indexedDB/test/test_transaction_lifetimes.html | Should be able to get index - expected PASS", - "linenumber": 8152 - }, - { - "line": "05:35:49 INFO - 2023 INFO TEST-UNEXPECTED-FAIL | dom/indexedDB/test/test_transaction_lifetimes.html | Ordering is correct. - expected PASS", - "linenumber": 8156 - }, - { - "line": "05:35:49 INFO - 2024 INFO TEST-UNEXPECTED-FAIL | dom/indexedDB/test/test_transaction_lifetimes.html | Worker: uncaught exception [http://mochi.test:8888/tests/dom/indexedDB/test/unit/test_transaction_lifetimes.js:45]: ': InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable' - expected PASS", - "linenumber": 8157 - } - ], - "name": "'/tools/buildbot/bin/python scripts/scripts/desktop_unittest.py ...' warnings", - "started": "2015-04-15 05:25:12.731202", - "started_linenumber": 278, - "finished_linenumber": 9248, - "finished": "2015-04-15 05:36:51.808779", - "result": "testfailed" - }, - { - "errors": [], - "name": "set props: build_url blobber_files", - "started": "2015-04-15 05:36:51.812718", - "started_linenumber": 9250, - "finished_linenumber": 9280, - "finished": "2015-04-15 05:36:51.871786", - "result": "success" - }, - { - "errors": [], - "name": "'rm -f ...'", - "started": "2015-04-15 05:36:51.872124", - "started_linenumber": 9282, - "finished_linenumber": 9308, - "finished": "2015-04-15 05:36:51.927004", - "result": "success" - }, - { - "errors": [], - "name": "reboot skipped", - "started": "2015-04-15 05:36:51.927332", - "started_linenumber": 9310, - "finished_linenumber": 9311, - "finished": "2015-04-15 05:36:51.927750", - "result": "skipped" - } - ], - "errors_truncated": false - }, + "errors": [ + { + "line": "05:35:49 INFO - 2018 INFO TEST-UNEXPECTED-FAIL | dom/indexedDB/test/test_transaction_lifetimes.html | Should be able to get objectStore - expected PASS", + "linenumber": 8151 + }, + { + "line": "05:35:49 INFO - 2019 INFO TEST-UNEXPECTED-FAIL | dom/indexedDB/test/test_transaction_lifetimes.html | Should be able to get index - expected PASS", + "linenumber": 8152 + }, + { + "line": "05:35:49 INFO - 2023 INFO TEST-UNEXPECTED-FAIL | dom/indexedDB/test/test_transaction_lifetimes.html | Ordering is correct. - expected PASS", + "linenumber": 8156 + }, + { + "line": "05:35:49 INFO - 2024 INFO TEST-UNEXPECTED-FAIL | dom/indexedDB/test/test_transaction_lifetimes.html | Worker: uncaught exception [http://mochi.test:8888/tests/dom/indexedDB/test/unit/test_transaction_lifetimes.js:45]: ': InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable' - expected PASS", + "linenumber": 8157 + } + ], "logurl": "http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/2015/04/2015-04-15-03-02-06-mozilla-central/mozilla-central_snowleopard_test-mochitest-2-bm107-tests1-macosx-build128.txt.gz" }, "type": "json", diff --git a/tests/sample_data/logs/crash-1.logview.json b/tests/sample_data/logs/crash-1.logview.json index 29f6fdbff..fa9254d79 100644 --- a/tests/sample_data/logs/crash-1.logview.json +++ b/tests/sample_data/logs/crash-1.logview.json @@ -1,70 +1,21 @@ { - "step_data": { - "steps": [ - { - "errors": [], - "name": "set props: revision", - "started": "2013-06-05 12:51:48.767751", - "started_linenumber": 8, - "finished_linenumber": 10, - "finished": "2013-06-05 12:51:48.768393", - "result": "success" - }, - { - "errors": [], - "name": "set props: who", - "started": "2013-06-05 12:51:48.768881", - "started_linenumber": 12, - "finished_linenumber": 14, - "finished": "2013-06-05 12:51:48.769473", - "result": "success" - }, - { - "errors": [ - { - "line": "Assertion failure: !(addr & GC_CELL_MASK), at e:/builds/moz2_slave/mozilla-central-win32-debug/build/js/src/jsgc.cpp:425", - "linenumber": 38435 - }, - { - "line": "NEXT ERROR <#err1> TEST-UNEXPECTED-FAIL | /tests/dom/tests/mochitest/ajax/jquery/test_jQuery.html | Exited with code -1073741819 during test run", - "linenumber": 38443 - }, - { - "line": "PROCESS-CRASH | /tests/dom/tests/mochitest/ajax/jquery/test_jQuery.html | application crashed (minidump found)", - "linenumber": 38446 - }, - { - "line": "TEST-UNEXPECTED-FAIL | automationutils.processLeakLog() | missing output line for total leaks!", - "linenumber": 39592 - } - ], - "name": "'python mochitest/runtests.py ...' warnings", - "started": "2013-06-05 12:54:55.232364", - "started_linenumber": 16, - "finished_linenumber": 39838, - "finished": "2013-06-05 13:15:39.235146", - "result": "testfailed" - }, - { - "errors": [], - "name": "'rm -rf ...'", - "started": "2013-06-05 13:15:39.244545", - "started_linenumber": 39840, - "finished_linenumber": 39884, - "finished": "2013-06-05 13:16:04.014823", - "result": "success" - }, - { - "errors": [], - "name": "maybe rebooting slave lost", - "started": "2013-06-05 13:16:04.015405", - "started_linenumber": 39886, - "finished_linenumber": 39888, - "finished": "2013-06-05 13:16:04.963614", - "result": "success" - } - ], - "errors_truncated": false - }, + "errors": [ + { + "line": "Assertion failure: !(addr & GC_CELL_MASK), at e:/builds/moz2_slave/mozilla-central-win32-debug/build/js/src/jsgc.cpp:425", + "linenumber": 38435 + }, + { + "line": "NEXT ERROR <#err1> TEST-UNEXPECTED-FAIL | /tests/dom/tests/mochitest/ajax/jquery/test_jQuery.html | Exited with code -1073741819 during test run", + "linenumber": 38443 + }, + { + "line": "PROCESS-CRASH | /tests/dom/tests/mochitest/ajax/jquery/test_jQuery.html | application crashed (minidump found)", + "linenumber": 38446 + }, + { + "line": "TEST-UNEXPECTED-FAIL | automationutils.processLeakLog() | missing output line for total leaks!", + "linenumber": 39592 + } + ], "logurl": "http://my-log.mozilla.org/crash-1.txt.gz" } diff --git a/tests/sample_data/logs/jsreftest-fail.logview.json b/tests/sample_data/logs/jsreftest-fail.logview.json index 31850ff99..49e0dd6f1 100644 --- a/tests/sample_data/logs/jsreftest-fail.logview.json +++ b/tests/sample_data/logs/jsreftest-fail.logview.json @@ -1,262 +1,213 @@ { - "logurl": "http://my-log.mozilla.org/jsreftest-fail.txt.gz", - "step_data": { - "steps": [ - { - "name": "set props: revision", - "started": "2013-06-05 12:51:48.767751", - "started_linenumber": 8, - "errors": [], - "finished": "2013-06-05 12:51:48.768393", - "finished_linenumber": 10, - "result": "success" - }, - { - "name": "set props: who", - "started": "2013-06-05 12:51:48.768881", - "started_linenumber": 12, - "errors": [], - "finished": "2013-06-05 12:51:48.769473", - "finished_linenumber": 14, - "result": "success" - }, - { - "name": "'python mochitest/runtests.py ...' warnings", - "started": "2013-06-05 12:54:55.232364", - "started_linenumber": 16, - "errors": [ - { - "linenumber": 26994, - "line": "TypeError: invalid XML name [0]" - }, - { - "linenumber": 77596, - "line": "NEXT ERROR <#err1> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 6 of test -" - }, - { - "linenumber": 77603, - "line": "NEXT ERROR <#err2> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 7 of test -" - }, - { - "linenumber": 77610, - "line": "NEXT ERROR <#err3> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 8 of test -" - }, - { - "linenumber": 77617, - "line": "NEXT ERROR <#err4> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 9 of test -" - }, - { - "linenumber": 77624, - "line": "NEXT ERROR <#err5> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 10 of test -" - }, - { - "linenumber": 77631, - "line": "NEXT ERROR <#err6> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 11 of test -" - }, - { - "linenumber": 77638, - "line": "NEXT ERROR <#err7> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 12 of test -" - }, - { - "linenumber": 77645, - "line": "REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 13 of test -" - }, - { - "linenumber": 77653, - "line": "REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 14 of test -" - }, - { - "linenumber": 77660, - "line": "REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 15 of test -" - }, - { - "linenumber": 80893, - "line": "568786: \"Assertion failure: !(attrs & (JSPROP_GETTER | JSPROP_SETTER)),\" with Object.defineProperty" - }, - { - "linenumber": 84107, - "line": "ReferenceError: foo is not defined" - }, - { - "linenumber": 84550, - "line": "InternalError: script stack space quota is exhausted" - }, - { - "linenumber": 85826, - "line": "SyntaxError: property name a appears more than once in object literal" - }, - { - "linenumber": 85828, - "line": "SyntaxError: property name 1 appears more than once in object literal" - }, - { - "linenumber": 85830, - "line": "TypeError: redeclaration of const 5" - }, - { - "linenumber": 85928, - "line": "TypeError: variable v redeclares argument" - }, - { - "linenumber": 86154, - "line": "TypeError: redeclaration of const document" - }, - { - "linenumber": 86697, - "line": "InternalError: script stack space quota is exhausted" - }, - { - "linenumber": 86703, - "line": "InternalError: script stack space quota is exhausted" - }, - { - "linenumber": 88372, - "line": "InternalError: too much recursion" - }, - { - "linenumber": 88421, - "line": "TypeError: anonymous function does not always return a value" - }, - { - "linenumber": 88423, - "line": "TypeError: anonymous function does not always return a value" - }, - { - "linenumber": 88683, - "line": "SyntaxError: return not in function" - }, - { - "linenumber": 89077, - "line": "SyntaxError: syntax error" - }, - { - "linenumber": 89686, - "line": "STATUS: Do not assert: Assertion failed: \"need a way to EOT now, since this is trace end\": 0" - }, - { - "linenumber": 89991, - "line": "ReferenceError: a is not defined | undefined | 45" - }, - { - "linenumber": 90260, - "line": "TypeError: z is not a function" - }, - { - "linenumber": 90266, - "line": "SyntaxError: return not in function" - }, - { - "linenumber": 90710, - "line": "TypeError: 6 is not a function" - }, - { - "linenumber": 90770, - "line": "TypeError: p.z = [1].some(function (y) {return y > 0;}) ? 4 : [6] is not a function" - }, - { - "linenumber": 91497, - "line": "TypeError: (void 0) is undefined" - }, - { - "linenumber": 91634, - "line": "ReferenceError: d is not defined" - }, - { - "linenumber": 91635, - "line": "ReferenceError: d is not defined" - }, - { - "linenumber": 91866, - "line": "TypeError: [15].some([].watch) is not a function" - }, - { - "linenumber": 91927, - "line": "TypeError: null has no properties" - }, - { - "linenumber": 92096, - "line": "TypeError: (void 0) is undefined" - }, - { - "linenumber": 92113, - "line": "TypeError: already executing generator iter.send" - }, - { - "linenumber": 92119, - "line": "TypeError: already executing generator iter.next" - }, - { - "linenumber": 92125, - "line": "TypeError: already executing generator iter.close" - }, - { - "linenumber": 92395, - "line": "SyntaxError: let declaration not directly within block" - }, - { - "linenumber": 92401, - "line": "SyntaxError: let declaration not directly within block" - }, - { - "linenumber": 92407, - "line": "SyntaxError: let declaration not directly within block" - }, - { - "linenumber": 92413, - "line": "SyntaxError: let declaration not directly within block" - }, - { - "linenumber": 92523, - "line": "ReferenceError: d is not defined" - }, - { - "linenumber": 92549, - "line": "TypeError: missing argument 1 when calling function watch" - }, - { - "linenumber": 92998, - "line": "TypeError: [] is not a function" - }, - { - "linenumber": 93044, - "line": "TypeError: XML filter is applied to non-XML value NaN" - }, - { - "linenumber": 93552, - "line": "TypeError: null has no properties" - }, - { - "linenumber": 93661, - "line": "STATUS: Assertion failure: staticLevel == script->staticLevel, at ../jsobj.cpp" - }, - { - "linenumber": 99204, - "line": "580200: Assertion failure enumerating own properties of proxy returning duplicated own property name" - } - ], - "finished": "2013-06-05 13:15:39.235146", - "finished_linenumber": 99347, - "result": "testfailed" - }, - { - "name": "'rm -rf ...'", - "started": "2013-06-05 13:15:39.244545", - "started_linenumber": 99349, - "errors": [], - "finished": "2013-06-05 13:16:04.014823", - "finished_linenumber": 99393, - "result": "success" - }, - { - "name": "maybe rebooting slave lost", - "started": "2013-06-05 13:16:04.015405", - "started_linenumber": 99395, - "errors": [], - "finished": "2013-06-05 13:16:04.963614", - "finished_linenumber": 99397, - "result": "success" - } - ], - "errors_truncated": false - } + "errors": [ + { + "linenumber": 26994, + "line": "TypeError: invalid XML name [0]" + }, + { + "linenumber": 77596, + "line": "NEXT ERROR <#err1> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 6 of test -" + }, + { + "linenumber": 77603, + "line": "NEXT ERROR <#err2> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 7 of test -" + }, + { + "linenumber": 77610, + "line": "NEXT ERROR <#err3> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 8 of test -" + }, + { + "linenumber": 77617, + "line": "NEXT ERROR <#err4> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 9 of test -" + }, + { + "linenumber": 77624, + "line": "NEXT ERROR <#err5> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 10 of test -" + }, + { + "linenumber": 77631, + "line": "NEXT ERROR <#err6> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 11 of test -" + }, + { + "linenumber": 77638, + "line": "NEXT ERROR <#err7> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 12 of test -" + }, + { + "linenumber": 77645, + "line": "REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 13 of test -" + }, + { + "linenumber": 77653, + "line": "REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 14 of test -" + }, + { + "linenumber": 77660, + "line": "REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 15 of test -" + }, + { + "linenumber": 80893, + "line": "568786: \"Assertion failure: !(attrs & (JSPROP_GETTER | JSPROP_SETTER)),\" with Object.defineProperty" + }, + { + "linenumber": 84107, + "line": "ReferenceError: foo is not defined" + }, + { + "linenumber": 84550, + "line": "InternalError: script stack space quota is exhausted" + }, + { + "linenumber": 85826, + "line": "SyntaxError: property name a appears more than once in object literal" + }, + { + "linenumber": 85828, + "line": "SyntaxError: property name 1 appears more than once in object literal" + }, + { + "linenumber": 85830, + "line": "TypeError: redeclaration of const 5" + }, + { + "linenumber": 85928, + "line": "TypeError: variable v redeclares argument" + }, + { + "linenumber": 86154, + "line": "TypeError: redeclaration of const document" + }, + { + "linenumber": 86697, + "line": "InternalError: script stack space quota is exhausted" + }, + { + "linenumber": 86703, + "line": "InternalError: script stack space quota is exhausted" + }, + { + "linenumber": 88372, + "line": "InternalError: too much recursion" + }, + { + "linenumber": 88421, + "line": "TypeError: anonymous function does not always return a value" + }, + { + "linenumber": 88423, + "line": "TypeError: anonymous function does not always return a value" + }, + { + "linenumber": 88683, + "line": "SyntaxError: return not in function" + }, + { + "linenumber": 89077, + "line": "SyntaxError: syntax error" + }, + { + "linenumber": 89686, + "line": "STATUS: Do not assert: Assertion failed: \"need a way to EOT now, since this is trace end\": 0" + }, + { + "linenumber": 89991, + "line": "ReferenceError: a is not defined | undefined | 45" + }, + { + "linenumber": 90260, + "line": "TypeError: z is not a function" + }, + { + "linenumber": 90266, + "line": "SyntaxError: return not in function" + }, + { + "linenumber": 90710, + "line": "TypeError: 6 is not a function" + }, + { + "linenumber": 90770, + "line": "TypeError: p.z = [1].some(function (y) {return y > 0;}) ? 4 : [6] is not a function" + }, + { + "linenumber": 91497, + "line": "TypeError: (void 0) is undefined" + }, + { + "linenumber": 91634, + "line": "ReferenceError: d is not defined" + }, + { + "linenumber": 91635, + "line": "ReferenceError: d is not defined" + }, + { + "linenumber": 91866, + "line": "TypeError: [15].some([].watch) is not a function" + }, + { + "linenumber": 91927, + "line": "TypeError: null has no properties" + }, + { + "linenumber": 92096, + "line": "TypeError: (void 0) is undefined" + }, + { + "linenumber": 92113, + "line": "TypeError: already executing generator iter.send" + }, + { + "linenumber": 92119, + "line": "TypeError: already executing generator iter.next" + }, + { + "linenumber": 92125, + "line": "TypeError: already executing generator iter.close" + }, + { + "linenumber": 92395, + "line": "SyntaxError: let declaration not directly within block" + }, + { + "linenumber": 92401, + "line": "SyntaxError: let declaration not directly within block" + }, + { + "linenumber": 92407, + "line": "SyntaxError: let declaration not directly within block" + }, + { + "linenumber": 92413, + "line": "SyntaxError: let declaration not directly within block" + }, + { + "linenumber": 92523, + "line": "ReferenceError: d is not defined" + }, + { + "linenumber": 92549, + "line": "TypeError: missing argument 1 when calling function watch" + }, + { + "linenumber": 92998, + "line": "TypeError: [] is not a function" + }, + { + "linenumber": 93044, + "line": "TypeError: XML filter is applied to non-XML value NaN" + }, + { + "linenumber": 93552, + "line": "TypeError: null has no properties" + }, + { + "linenumber": 93661, + "line": "STATUS: Assertion failure: staticLevel == script->staticLevel, at ../jsobj.cpp" + }, + { + "linenumber": 99204, + "line": "580200: Assertion failure enumerating own properties of proxy returning duplicated own property name" + } + ], + "logurl": "http://my-log.mozilla.org/jsreftest-fail.txt.gz" } diff --git a/tests/sample_data/logs/mozilla-central-win32-pgo-bm85-build1-build111.logview.json b/tests/sample_data/logs/mozilla-central-win32-pgo-bm85-build1-build111.logview.json deleted file mode 100644 index 4f834ca72..000000000 --- a/tests/sample_data/logs/mozilla-central-win32-pgo-bm85-build1-build111.logview.json +++ /dev/null @@ -1,503 +0,0 @@ -{ - "step_data": { - "steps": [ - { - "errors": [], - "name": "set props: basedir", - "started": "2014-06-29 22:30:16.350054", - "started_linenumber": 8, - "finished_linenumber": 91, - "finished": "2014-06-29 22:30:17.733586", - "result": "success" - }, - { - "errors": [], - "name": "set props: hashType", - "started": "2014-06-29 22:30:17.733997", - "started_linenumber": 93, - "finished_linenumber": 95, - "finished": "2014-06-29 22:30:17.734323", - "result": "success" - }, - { - "errors": [], - "name": "set props: builddir", - "started": "2014-06-29 22:30:17.734607", - "started_linenumber": 97, - "finished_linenumber": 180, - "finished": "2014-06-29 22:30:17.852754", - "result": "success" - }, - { - "errors": [], - "name": "clobber build tools", - "started": "2014-06-29 22:30:17.853076", - "started_linenumber": 182, - "finished_linenumber": 263, - "finished": "2014-06-29 22:30:29.974564", - "result": "success" - }, - { - "errors": [], - "name": "clone build tools", - "started": "2014-06-29 22:30:29.975158", - "started_linenumber": 265, - "finished_linenumber": 353, - "finished": "2014-06-29 22:30:44.923107", - "result": "success" - }, - { - "errors": [], - "name": "set props: toolsdir", - "started": "2014-06-29 22:30:44.923506", - "started_linenumber": 355, - "finished_linenumber": 438, - "finished": "2014-06-29 22:30:45.044162", - "result": "success" - }, - { - "errors": [], - "name": "no change", - "started": "2014-06-29 22:30:45.045078", - "started_linenumber": 440, - "finished_linenumber": 522, - "finished": "2014-06-29 22:30:45.166864", - "result": "success" - }, - { - "errors": [], - "name": "checking clobber times", - "started": "2014-06-29 22:30:45.167229", - "started_linenumber": 524, - "finished_linenumber": 712, - "finished": "2014-06-29 22:40:58.302111", - "result": "success" - }, - { - "errors": [], - "name": "set props: purge_actual purge_target", - "started": "2014-06-29 22:40:58.302908", - "started_linenumber": 714, - "finished_linenumber": 811, - "finished": "2014-06-29 22:41:00.825003", - "result": "success" - }, - { - "errors": [], - "name": "set_buildids", - "started": "2014-06-29 22:41:00.825666", - "started_linenumber": 813, - "finished_linenumber": 814, - "finished": "2014-06-29 22:41:00.825811", - "result": "success" - }, - { - "errors": [], - "name": "set props: toolsdir", - "started": "2014-06-29 22:41:00.826350", - "started_linenumber": 816, - "finished_linenumber": 899, - "finished": "2014-06-29 22:41:00.948217", - "result": "success" - }, - { - "errors": [], - "name": "set props: basedir", - "started": "2014-06-29 22:41:00.948537", - "started_linenumber": 901, - "finished_linenumber": 984, - "finished": "2014-06-29 22:41:01.066839", - "result": "success" - }, - { - "errors": [], - "name": "remove mozharness", - "started": "2014-06-29 22:41:01.067220", - "started_linenumber": 986, - "finished_linenumber": 1067, - "finished": "2014-06-29 22:41:01.185636", - "result": "success" - }, - { - "errors": [], - "name": "checkout mozharness", - "started": "2014-06-29 22:41:01.185958", - "started_linenumber": 1069, - "finished_linenumber": 1159, - "finished": "2014-06-29 22:41:06.592065", - "result": "success" - }, - { - "errors": [], - "name": "updating mozharness to production", - "started": "2014-06-29 22:41:06.593516", - "started_linenumber": 1161, - "finished_linenumber": 1243, - "finished": "2014-06-29 22:41:07.116755", - "result": "success" - }, - { - "errors": [], - "name": "delete old package", - "started": "2014-06-29 22:41:07.117128", - "started_linenumber": 1245, - "finished_linenumber": 1339, - "finished": "2014-06-29 22:41:07.635397", - "result": "success" - }, - { - "errors": [], - "name": "downloading to buildprops.json", - "started": "2014-06-29 22:41:07.636162", - "started_linenumber": 1341, - "finished_linenumber": 1342, - "finished": "2014-06-29 22:41:07.757331", - "result": "success" - }, - { - "errors": [], - "name": "'python c:/builds/moz2_slave/m-cen-w32-pgo-0000000000000000/tools/buildfarm/utils/retry.py ...'", - "started": "2014-06-29 22:41:07.757876", - "started_linenumber": 1344, - "finished_linenumber": 1517, - "finished": "2014-06-29 22:53:53.500864", - "result": "success" - }, - { - "errors": [], - "name": "set props: got_revision", - "started": "2014-06-29 22:53:53.503996", - "started_linenumber": 1519, - "finished_linenumber": 1601, - "finished": "2014-06-29 22:53:53.723762", - "result": "success" - }, - { - "errors": [], - "name": "set props: comments", - "started": "2014-06-29 22:53:53.724120", - "started_linenumber": 1603, - "finished_linenumber": 1605, - "finished": "2014-06-29 22:53:53.724565", - "result": "success" - }, - { - "errors": [], - "name": "got mozconfig", - "started": "2014-06-29 22:53:53.724904", - "started_linenumber": 1607, - "finished_linenumber": 1691, - "finished": "2014-06-29 22:53:54.184027", - "result": "success" - }, - { - "errors": [], - "name": "'cat .mozconfig'", - "started": "2014-06-29 22:53:54.184825", - "started_linenumber": 1693, - "finished_linenumber": 1785, - "finished": "2014-06-29 22:53:54.304847", - "result": "success" - }, - { - "errors": [], - "name": "'sh c:/builds/moz2_slave/m-cen-w32-pgo-0000000000000000/tools/scripts/tooltool/tooltool_wrapper.sh ...'", - "started": "2014-06-29 22:53:54.305271", - "started_linenumber": 1787, - "finished_linenumber": 1910, - "finished": "2014-06-29 22:53:56.138113", - "result": "success" - }, - { - "errors": [], - "name": "remove old nonce", - "started": "2014-06-29 22:53:56.138958", - "started_linenumber": 1912, - "finished_linenumber": 1993, - "finished": "2014-06-29 22:53:56.257351", - "result": "success" - }, - { - "errors": [], - "name": "downloading to token", - "started": "2014-06-29 22:53:56.257721", - "started_linenumber": 1995, - "finished_linenumber": 2000, - "finished": "2014-06-29 22:53:56.469662", - "result": "success" - }, - { - "errors": [], - "name": "compile", - "started": "2014-06-29 22:53:56.470289", - "started_linenumber": 2002, - "finished_linenumber": 57536, - "finished": "2014-06-30 02:21:57.813004", - "result": "success" - }, - { - "errors": [], - "name": "set props: vsize testresults", - "started": "2014-06-30 02:21:57.815584", - "started_linenumber": 57538, - "finished_linenumber": 57622, - "finished": "2014-06-30 02:21:57.958564", - "result": "success" - }, - { - "errors": [], - "name": "set props: buildid", - "started": "2014-06-30 02:21:57.958855", - "started_linenumber": 57624, - "finished_linenumber": 57707, - "finished": "2014-06-30 02:22:00.177483", - "result": "success" - }, - { - "errors": [], - "name": "set props: sourcestamp", - "started": "2014-06-30 02:22:00.177859", - "started_linenumber": 57709, - "finished_linenumber": 57792, - "finished": "2014-06-30 02:22:00.298879", - "result": "success" - }, - { - "errors": [], - "name": "downloading to properties.json", - "started": "2014-06-30 02:22:00.299227", - "started_linenumber": 57794, - "finished_linenumber": 57795, - "finished": "2014-06-30 02:22:00.313580", - "result": "success" - }, - { - "errors": [], - "name": "graph server post results complete", - "started": "2014-06-30 02:22:00.314328", - "started_linenumber": 57797, - "finished_linenumber": 57896, - "finished": "2014-06-30 02:22:01.356388", - "result": "success" - }, - { - "errors": [], - "name": "'python c:/builds/moz2_slave/m-cen-w32-pgo-0000000000000000/build/build/pymake/make.py ...'", - "started": "2014-06-30 02:22:01.357389", - "started_linenumber": 57898, - "finished_linenumber": 58630, - "finished": "2014-06-30 02:27:10.574663", - "result": "success" - }, - { - "errors": [], - "name": "'python c:/builds/moz2_slave/m-cen-w32-pgo-0000000000000000/build/build/pymake/make.py ...'", - "started": "2014-06-30 02:27:10.575695", - "started_linenumber": 58632, - "finished_linenumber": 59131, - "finished": "2014-06-30 02:34:37.112183", - "result": "success" - }, - { - "errors": [], - "name": "'python c:/builds/moz2_slave/m-cen-w32-pgo-0000000000000000/build/build/pymake/make.py ...'", - "started": "2014-06-30 02:34:37.113149", - "started_linenumber": 59133, - "finished_linenumber": 63272, - "finished": "2014-06-30 02:36:25.733582", - "result": "success" - }, - { - "errors": [], - "name": "find filepath", - "started": "2014-06-30 02:36:25.734713", - "started_linenumber": 63274, - "finished_linenumber": 63356, - "finished": "2014-06-30 02:36:50.759546", - "result": "success" - }, - { - "errors": [], - "name": "set props: packageFilename", - "started": "2014-06-30 02:36:50.759940", - "started_linenumber": 63358, - "finished_linenumber": 63441, - "finished": "2014-06-30 02:36:50.883981", - "result": "success" - }, - { - "errors": [], - "name": "set props: packageSize", - "started": "2014-06-30 02:36:50.884836", - "started_linenumber": 63443, - "finished_linenumber": 63526, - "finished": "2014-06-30 02:36:51.003225", - "result": "success" - }, - { - "errors": [], - "name": "set props: packageHash", - "started": "2014-06-30 02:36:51.003640", - "started_linenumber": 63528, - "finished_linenumber": 63611, - "finished": "2014-06-30 02:36:51.727337", - "result": "success" - }, - { - "errors": [], - "name": "set props: filepath", - "started": "2014-06-30 02:36:51.728149", - "started_linenumber": 63613, - "finished_linenumber": 63696, - "finished": "2014-06-30 02:36:51.852435", - "result": "success" - }, - { - "errors": [], - "name": "'python c:/builds/moz2_slave/m-cen-w32-pgo-0000000000000000/build/build/pymake/make.py ...'", - "started": "2014-06-30 02:36:51.853240", - "started_linenumber": 63698, - "finished_linenumber": 67508, - "finished": "2014-06-30 02:38:19.792708", - "result": "success" - }, - { - "errors": [], - "name": "find filepath", - "started": "2014-06-30 02:38:19.797776", - "started_linenumber": 67510, - "finished_linenumber": 67592, - "finished": "2014-06-30 02:38:20.178990", - "result": "success" - }, - { - "errors": [], - "name": "set props: installerFilename", - "started": "2014-06-30 02:38:20.179426", - "started_linenumber": 67594, - "finished_linenumber": 67677, - "finished": "2014-06-30 02:38:20.299869", - "result": "success" - }, - { - "errors": [], - "name": "set props: installerSize", - "started": "2014-06-30 02:38:20.300615", - "started_linenumber": 67679, - "finished_linenumber": 67762, - "finished": "2014-06-30 02:38:20.422898", - "result": "success" - }, - { - "errors": [], - "name": "set props: installerHash", - "started": "2014-06-30 02:38:20.423321", - "started_linenumber": 67764, - "finished_linenumber": 67847, - "finished": "2014-06-30 02:38:20.746602", - "result": "success" - }, - { - "errors": [], - "name": "set props: filepath", - "started": "2014-06-30 02:38:20.747658", - "started_linenumber": 67849, - "finished_linenumber": 67932, - "finished": "2014-06-30 02:38:20.866610", - "result": "success" - }, - { - "errors": [], - "name": "set props: buildid", - "started": "2014-06-30 02:38:20.867042", - "started_linenumber": 67934, - "finished_linenumber": 68017, - "finished": "2014-06-30 02:38:20.988577", - "result": "success" - }, - { - "errors": [], - "name": "set props: appVersion", - "started": "2014-06-30 02:38:20.989188", - "started_linenumber": 68019, - "finished_linenumber": 68102, - "finished": "2014-06-30 02:38:21.111717", - "result": "success" - }, - { - "errors": [], - "name": "set props: appName", - "started": "2014-06-30 02:38:21.112102", - "started_linenumber": 68104, - "finished_linenumber": 68187, - "finished": "2014-06-30 02:38:21.235722", - "result": "success" - }, - { - "errors": [], - "name": "set props: symbolsUrl packageUrl testsUrl jsshellUrl", - "started": "2014-06-30 02:38:21.236747", - "started_linenumber": 68189, - "finished_linenumber": 68366, - "finished": "2014-06-30 02:38:44.118836", - "result": "success" - }, - { - "errors": [], - "name": "set build property skipped", - "started": "2014-06-30 02:38:44.120204", - "started_linenumber": 68368, - "finished_linenumber": 68369, - "finished": "2014-06-30 02:38:44.120762", - "result": "skipped" - }, - { - "errors": [], - "name": "sendchange", - "started": "2014-06-30 02:38:44.121114", - "started_linenumber": 68371, - "finished_linenumber": 68480, - "finished": "2014-06-30 02:38:51.041903", - "result": "success" - }, - { - "errors": [], - "name": "sendchange", - "started": "2014-06-30 02:38:51.042816", - "started_linenumber": 68482, - "finished_linenumber": 68591, - "finished": "2014-06-30 02:38:51.425600", - "result": "success" - }, - { - "errors": [], - "name": "'python c:/builds/moz2_slave/m-cen-w32-pgo-0000000000000000/build/build/pymake/make.py ...'", - "started": "2014-06-30 02:38:51.426344", - "started_linenumber": 68593, - "finished_linenumber": 70179, - "finished": "2014-06-30 02:40:35.920512", - "result": "success" - }, - { - "errors": [], - "name": "check test complete", - "started": "2014-06-30 02:40:35.921976", - "started_linenumber": 70181, - "finished_linenumber": 80063, - "finished": "2014-06-30 02:45:56.094867", - "result": "success" - }, - { - "errors": [], - "name": "maybe rebooting slave lost", - "started": "2014-06-30 02:45:56.099903", - "started_linenumber": 80065, - "finished_linenumber": 80067, - "finished": "2014-06-30 02:45:56.743970", - "result": "success" - } - ], - "errors_truncated": false - }, - "logurl": "http://my-log.mozilla.org/mozilla-central-win32-pgo-bm85-build1-build111.txt.gz" -} diff --git a/tests/sample_data/logs/mozilla-central_fedora-b2g_test-crashtest-1-bm54-tests1-linux-build50.jobartifact.json b/tests/sample_data/logs/mozilla-central_fedora-b2g_test-crashtest-1-bm54-tests1-linux-build50.jobartifact.json deleted file mode 100644 index f33171828..000000000 --- a/tests/sample_data/logs/mozilla-central_fedora-b2g_test-crashtest-1-bm54-tests1-linux-build50.jobartifact.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "job_details": [ - { - "url": "http://hg.mozilla.org/build/mozharness/rev/c43ba6cb3db3", - "content_type": "link", - "value": "http://hg.mozilla.org/build/mozharness/rev/c43ba6cb3db3", - "title": "mozharness_revlink" - }, - { - "content_type": "raw_html", - "value": "810/0/22", - "title": "crashtest" - } - ], - "logurl": "http://my-log.mozilla.org/mozilla-central_fedora-b2g_test-crashtest-1-bm54-tests1-linux-build50.txt.gz" -} diff --git a/tests/sample_data/logs/mozilla-central_fedora-b2g_test-crashtest-1-bm54-tests1-linux-build50.logview.json b/tests/sample_data/logs/mozilla-central_fedora-b2g_test-crashtest-1-bm54-tests1-linux-build50.logview.json deleted file mode 100644 index 274630f5d..000000000 --- a/tests/sample_data/logs/mozilla-central_fedora-b2g_test-crashtest-1-bm54-tests1-linux-build50.logview.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "step_data": { - "steps": [ - { - "errors": [], - "name": "set props: master", - "started": "2013-06-05 12:39:57.838527", - "started_linenumber": 8, - "finished_linenumber": 10, - "finished": "2013-06-05 12:39:57.839226", - "result": "success" - }, - { - "errors": [], - "name": "set props: basedir", - "started": "2013-06-05 12:39:57.839702", - "started_linenumber": 12, - "finished_linenumber": 42, - "finished": "2013-06-05 12:39:58.346114", - "result": "success" - }, - { - "errors": [], - "name": "downloading to buildprops.json", - "started": "2013-06-05 12:39:58.346573", - "started_linenumber": 44, - "finished_linenumber": 45, - "finished": "2013-06-05 12:39:58.614586", - "result": "success" - }, - { - "errors": [], - "name": "'rm -rf ...'", - "started": "2013-06-05 12:39:58.615003", - "started_linenumber": 47, - "finished_linenumber": 75, - "finished": "2013-06-05 12:39:58.723069", - "result": "success" - }, - { - "errors": [], - "name": "'rm -rf ...'", - "started": "2013-06-05 12:39:58.723521", - "started_linenumber": 77, - "finished_linenumber": 105, - "finished": "2013-06-05 12:39:58.831972", - "result": "success" - }, - { - "errors": [], - "name": "'hg clone ...'", - "started": "2013-06-05 12:39:58.832419", - "started_linenumber": 107, - "finished_linenumber": 142, - "finished": "2013-06-05 12:40:01.114413", - "result": "success" - }, - { - "errors": [], - "name": "'hg update ...'", - "started": "2013-06-05 12:40:01.114870", - "started_linenumber": 144, - "finished_linenumber": 173, - "finished": "2013-06-05 12:40:01.335999", - "result": "success" - }, - { - "errors": [], - "name": "set props: script_repo_revision", - "started": "2013-06-05 12:40:01.336478", - "started_linenumber": 175, - "finished_linenumber": 205, - "finished": "2013-06-05 12:40:01.520234", - "result": "success" - }, - { - "errors": [], - "name": "tinderboxprint_script_revlink", - "started": "2013-06-05 12:40:01.520734", - "started_linenumber": 207, - "finished_linenumber": 209, - "finished": "2013-06-05 12:40:01.521320", - "result": "success" - }, - { - "errors": [], - "name": "'/tools/buildbot/bin/python scripts/scripts/b2g_emulator_unittest.py ...'", - "started": "2013-06-05 12:40:01.521797", - "started_linenumber": 211, - "finished_linenumber": 3369, - "finished": "2013-06-05 12:57:55.646752", - "result": "success" - }, - { - "errors": [], - "name": "set props: build_url", - "started": "2013-06-05 12:57:55.659998", - "started_linenumber": 3371, - "finished_linenumber": 3401, - "finished": "2013-06-05 12:57:55.793402", - "result": "success" - }, - { - "errors": [], - "name": "reboot slave lost", - "started": "2013-06-05 12:57:55.793914", - "started_linenumber": 3403, - "finished_linenumber": 3433, - "finished": "2013-06-05 12:58:55.994641", - "result": "success" - } - ], - "errors_truncated": false - }, - "logurl": "http://my-log.mozilla.org/mozilla-central_fedora-b2g_test-crashtest-1-bm54-tests1-linux-build50.txt.gz" -} diff --git a/tests/sample_data/logs/mozilla-central_mountainlion_test-mochitest-2-bm77-tests1-macosx-build141.jobartifact.json b/tests/sample_data/logs/mozilla-central_mountainlion_test-mochitest-2-bm77-tests1-macosx-build141.jobartifact.json deleted file mode 100644 index 45257d2dd..000000000 --- a/tests/sample_data/logs/mozilla-central_mountainlion_test-mochitest-2-bm77-tests1-macosx-build141.jobartifact.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "job_details": [ - { - "url": "http://hg.mozilla.org/build/mozharness/rev/c43ba6cb3db3", - "content_type": "link", - "value": "http://hg.mozilla.org/build/mozharness/rev/c43ba6cb3db3", - "title": "mozharness_revlink" - }, - { - "content_type": "raw_html", - "value": "206415/0/18500", - "title": "mochitest-plain2" - } - ], - "logurl": "http://my-log.mozilla.org/mozilla-central_mountainlion_test-mochitest-2-bm77-tests1-macosx-build141.txt.gz" -} diff --git a/tests/sample_data/logs/mozilla-central_mountainlion_test-mochitest-2-bm77-tests1-macosx-build141.logview.json b/tests/sample_data/logs/mozilla-central_mountainlion_test-mochitest-2-bm77-tests1-macosx-build141.logview.json deleted file mode 100644 index db41d4738..000000000 --- a/tests/sample_data/logs/mozilla-central_mountainlion_test-mochitest-2-bm77-tests1-macosx-build141.logview.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "step_data": { - "steps": [ - { - "errors": [], - "name": "set props: master", - "started": "2013-06-05 12:55:02.793687", - "started_linenumber": 8, - "finished_linenumber": 10, - "finished": "2013-06-05 12:55:02.794485", - "result": "success" - }, - { - "errors": [], - "name": "set props: basedir", - "started": "2013-06-05 12:55:02.794985", - "started_linenumber": 12, - "finished_linenumber": 36, - "finished": "2013-06-05 12:55:03.579905", - "result": "success" - }, - { - "errors": [], - "name": "downloading to buildprops.json", - "started": "2013-06-05 12:55:03.580420", - "started_linenumber": 38, - "finished_linenumber": 39, - "finished": "2013-06-05 12:55:05.429410", - "result": "success" - }, - { - "errors": [], - "name": "'rm -rf ...'", - "started": "2013-06-05 12:55:05.429870", - "started_linenumber": 41, - "finished_linenumber": 63, - "finished": "2013-06-05 12:55:05.711713", - "result": "success" - }, - { - "errors": [], - "name": "'rm -rf ...'", - "started": "2013-06-05 12:55:05.712188", - "started_linenumber": 65, - "finished_linenumber": 87, - "finished": "2013-06-05 12:55:05.951055", - "result": "success" - }, - { - "errors": [], - "name": "'hg clone ...'", - "started": "2013-06-05 12:55:05.951563", - "started_linenumber": 89, - "finished_linenumber": 118, - "finished": "2013-06-05 12:55:08.587665", - "result": "success" - }, - { - "errors": [], - "name": "'hg update ...'", - "started": "2013-06-05 12:55:08.588162", - "started_linenumber": 120, - "finished_linenumber": 143, - "finished": "2013-06-05 12:55:09.070938", - "result": "success" - }, - { - "errors": [], - "name": "set props: script_repo_revision", - "started": "2013-06-05 12:55:09.071436", - "started_linenumber": 145, - "finished_linenumber": 169, - "finished": "2013-06-05 12:55:09.553968", - "result": "success" - }, - { - "errors": [], - "name": "tinderboxprint_script_revlink", - "started": "2013-06-05 12:55:09.554462", - "started_linenumber": 171, - "finished_linenumber": 173, - "finished": "2013-06-05 12:55:09.555053", - "result": "success" - }, - { - "errors": [], - "name": "'/tools/buildbot/bin/python scripts/scripts/desktop_unittest.py ...'", - "started": "2013-06-05 12:55:09.555542", - "started_linenumber": 175, - "finished_linenumber": 11552, - "finished": "2013-06-05 13:02:38.681825", - "result": "success" - }, - { - "errors": [], - "name": "set props: build_url", - "started": "2013-06-05 13:02:38.687346", - "started_linenumber": 11554, - "finished_linenumber": 11578, - "finished": "2013-06-05 13:02:38.876303", - "result": "success" - }, - { - "errors": [], - "name": "reboot slave lost", - "started": "2013-06-05 13:02:38.876850", - "started_linenumber": 11580, - "finished_linenumber": 11609, - "finished": "2013-06-05 13:03:00.115654", - "result": "success" - } - ], - "errors_truncated": false - }, - "logurl": "http://my-log.mozilla.org/mozilla-central_mountainlion_test-mochitest-2-bm77-tests1-macosx-build141.txt.gz" -} diff --git a/tests/sample_data/logs/mozilla-central_ubuntu64_hw_test-androidx86-set-4-bm103-tests1-linux-build369.logview.json b/tests/sample_data/logs/mozilla-central_ubuntu64_hw_test-androidx86-set-4-bm103-tests1-linux-build369.logview.json index 78b7d652f..70b842942 100644 --- a/tests/sample_data/logs/mozilla-central_ubuntu64_hw_test-androidx86-set-4-bm103-tests1-linux-build369.logview.json +++ b/tests/sample_data/logs/mozilla-central_ubuntu64_hw_test-androidx86-set-4-bm103-tests1-linux-build369.logview.json @@ -1,143 +1,13 @@ { - "step_data": { - "steps": [ - { - "errors": [], - "name": "set props: master", - "started": "2014-07-17 08:45:18.801609", - "started_linenumber": 8, - "finished_linenumber": 10, - "finished": "2014-07-17 08:45:18.802011", - "result": "success" - }, - { - "errors": [], - "name": "set props: basedir", - "started": "2014-07-17 08:45:18.802295", - "started_linenumber": 12, - "finished_linenumber": 56, - "finished": "2014-07-17 08:45:18.854874", - "result": "success" - }, - { - "errors": [], - "name": "downloading to buildprops.json", - "started": "2014-07-17 08:45:18.855272", - "started_linenumber": 58, - "finished_linenumber": 59, - "finished": "2014-07-17 08:45:18.904210", - "result": "success" - }, - { - "errors": [], - "name": "'rm -rf ...'", - "started": "2014-07-17 08:45:18.904577", - "started_linenumber": 61, - "finished_linenumber": 103, - "finished": "2014-07-17 08:45:18.943479", - "result": "success" - }, - { - "errors": [], - "name": "'rm -rf ...'", - "started": "2014-07-17 08:45:18.943846", - "started_linenumber": 105, - "finished_linenumber": 147, - "finished": "2014-07-17 08:45:19.043322", - "result": "success" - }, - { - "errors": [], - "name": "'hg clone ...'", - "started": "2014-07-17 08:45:19.043748", - "started_linenumber": 149, - "finished_linenumber": 198, - "finished": "2014-07-17 08:45:21.830887", - "result": "success" - }, - { - "errors": [], - "name": "'hg update ...'", - "started": "2014-07-17 08:45:21.831343", - "started_linenumber": 200, - "finished_linenumber": 243, - "finished": "2014-07-17 08:45:22.037742", - "result": "success" - }, - { - "errors": [], - "name": "set props: script_repo_revision", - "started": "2014-07-17 08:45:22.038178", - "started_linenumber": 245, - "finished_linenumber": 289, - "finished": "2014-07-17 08:45:22.126650", - "result": "success" - }, - { - "errors": [], - "name": "downloading to oauth.txt", - "started": "2014-07-17 08:45:22.126969", - "started_linenumber": 291, - "finished_linenumber": 292, - "finished": "2014-07-17 08:45:22.140342", - "result": "success" - }, - { - "errors": [], - "name": "tinderboxprint_script_revlink", - "started": "2014-07-17 08:45:22.140752", - "started_linenumber": 294, - "finished_linenumber": 296, - "finished": "2014-07-17 08:45:22.141210", - "result": "success" - }, - { - "errors": [ - { - "line": "09:14:00 INFO - org.json.JSONException: Unterminated string at character 23963 of {\"reason\":\"android-anr-report\",\"slug\":\"5e99c087-ebb5-4091-b5c8-75bd0889509c\",\"payload\":{\"ver\":1,\"simpleMeasurements\":{\"uptime\":0},\"info\":{\"reason\":\"android-anr-report\",\"OS\":\"Android\",\"version\":\"17\",\"appID\":\"{aa3c5121-dab2-40e2-81ca-7ea25febc110}\",\"appVersion\":\"33.0a1\",\"appName\":\"Fennec\",\"appBuildID\":\"20140717073317\",\"appUpdateChannel\":\"default\",\"platformBuildID\":\"20140717073317\",\"locale\":\"en-US\",\"cpucount\":1,\"", - "linenumber": 3544 - }, - { - "line": "09:14:00 INFO - 17 INFO TEST-UNEXPECTED-FAIL | testANRReporter | Exception caught - org.json.JSONException: Unterminated string at character 23963 of {\"reason\":\"android-anr-report\",\"slug\":\"5e99c087-ebb5-4091-b5c8-75bd0889509c\",\"payload\":{\"ver\":1,\"simpleMeasurements\":{\"uptime\":0},\"info\":{\"reason\":\"android-anr-report\",\"OS\":\"Android\",\"version\":\"17\",\"appID\":\"{aa3c5121-dab2-40e2-81ca-7ea25febc110}\",\"appVersion\":\"33.0a1\",\"appName\":\"Fennec\",\"appBuildID\":\"20140717073317\",\"appUpdateChannel\":\"default", - "linenumber": 3571 - } - ], - "name": "'/tools/buildbot/bin/python scripts/scripts/android_emulator_unittest.py ...' warnings", - "started": "2014-07-17 08:45:22.141524", - "started_linenumber": 298, - "finished_linenumber": 10231, - "finished": "2014-07-17 09:18:15.066397", - "result": "testfailed" - }, - { - "errors": [], - "name": "set props: blobber_manifest_url build_url", - "started": "2014-07-17 09:18:15.071084", - "started_linenumber": 10233, - "finished_linenumber": 10279, - "finished": "2014-07-17 09:18:15.266212", - "result": "success" - }, - { - "errors": [], - "name": "'rm -f ...'", - "started": "2014-07-17 09:18:15.266604", - "started_linenumber": 10281, - "finished_linenumber": 10323, - "finished": "2014-07-17 09:18:15.290870", - "result": "success" - }, - { - "errors": [], - "name": "reboot slave lost", - "started": "2014-07-17 09:18:15.291165", - "started_linenumber": 10325, - "finished_linenumber": 10369, - "finished": "2014-07-17 09:18:22.104200", - "result": "success" - } - ], - "errors_truncated": false - }, + "errors": [ + { + "line": "09:14:00 INFO - org.json.JSONException: Unterminated string at character 23963 of {\"reason\":\"android-anr-report\",\"slug\":\"5e99c087-ebb5-4091-b5c8-75bd0889509c\",\"payload\":{\"ver\":1,\"simpleMeasurements\":{\"uptime\":0},\"info\":{\"reason\":\"android-anr-report\",\"OS\":\"Android\",\"version\":\"17\",\"appID\":\"{aa3c5121-dab2-40e2-81ca-7ea25febc110}\",\"appVersion\":\"33.0a1\",\"appName\":\"Fennec\",\"appBuildID\":\"20140717073317\",\"appUpdateChannel\":\"default\",\"platformBuildID\":\"20140717073317\",\"locale\":\"en-US\",\"cpucount\":1,\"", + "linenumber": 3544 + }, + { + "line": "09:14:00 INFO - 17 INFO TEST-UNEXPECTED-FAIL | testANRReporter | Exception caught - org.json.JSONException: Unterminated string at character 23963 of {\"reason\":\"android-anr-report\",\"slug\":\"5e99c087-ebb5-4091-b5c8-75bd0889509c\",\"payload\":{\"ver\":1,\"simpleMeasurements\":{\"uptime\":0},\"info\":{\"reason\":\"android-anr-report\",\"OS\":\"Android\",\"version\":\"17\",\"appID\":\"{aa3c5121-dab2-40e2-81ca-7ea25febc110}\",\"appVersion\":\"33.0a1\",\"appName\":\"Fennec\",\"appBuildID\":\"20140717073317\",\"appUpdateChannel\":\"default", + "linenumber": 3571 + } + ], "logurl": "http://my-log.mozilla.org/mozilla-central_ubuntu64_hw_test-androidx86-set-4-bm103-tests1-linux-build369.txt.gz" } diff --git a/tests/sample_data/logs/mozilla-esr17_xp_test_pgo-mochitest-browser-chrome-bm74-tests1-windows-build12.logview.json b/tests/sample_data/logs/mozilla-esr17_xp_test_pgo-mochitest-browser-chrome-bm74-tests1-windows-build12.logview.json index 0105dbe95..90d88054b 100644 --- a/tests/sample_data/logs/mozilla-esr17_xp_test_pgo-mochitest-browser-chrome-bm74-tests1-windows-build12.logview.json +++ b/tests/sample_data/logs/mozilla-esr17_xp_test_pgo-mochitest-browser-chrome-bm74-tests1-windows-build12.logview.json @@ -1,224 +1,13 @@ { - "step_data": { - "steps": [ - { - "errors": [], - "name": "set props: revision", - "started": "2013-06-05 12:51:48.767751", - "started_linenumber": 8, - "finished_linenumber": 10, - "finished": "2013-06-05 12:51:48.768393", - "result": "success" - }, - { - "errors": [], - "name": "set props: who", - "started": "2013-06-05 12:51:48.768881", - "started_linenumber": 12, - "finished_linenumber": 14, - "finished": "2013-06-05 12:51:48.769473", - "result": "success" - }, - { - "errors": [], - "name": "set props: basedir", - "started": "2013-06-05 12:51:48.769970", - "started_linenumber": 16, - "finished_linenumber": 62, - "finished": "2013-06-05 12:51:50.898723", - "result": "success" - }, - { - "errors": [], - "name": "set props: hashType", - "started": "2013-06-05 12:51:50.899244", - "started_linenumber": 64, - "finished_linenumber": 110, - "finished": "2013-06-05 12:51:51.050525", - "result": "success" - }, - { - "errors": [], - "name": "set props: builddir", - "started": "2013-06-05 12:51:51.051012", - "started_linenumber": 112, - "finished_linenumber": 158, - "finished": "2013-06-05 12:51:51.285053", - "result": "success" - }, - { - "errors": [], - "name": "clobber build tools", - "started": "2013-06-05 12:51:51.285559", - "started_linenumber": 160, - "finished_linenumber": 204, - "finished": "2013-06-05 12:52:04.344452", - "result": "success" - }, - { - "errors": [], - "name": "clone build tools", - "started": "2013-06-05 12:52:04.344949", - "started_linenumber": 206, - "finished_linenumber": 257, - "finished": "2013-06-05 12:52:27.906228", - "result": "success" - }, - { - "errors": [], - "name": "set props: toolsdir", - "started": "2013-06-05 12:52:27.906738", - "started_linenumber": 259, - "finished_linenumber": 305, - "finished": "2013-06-05 12:52:28.096555", - "result": "success" - }, - { - "errors": [], - "name": "set props: purge_actual purge_target", - "started": "2013-06-05 12:52:28.097052", - "started_linenumber": 307, - "finished_linenumber": 373, - "finished": "2013-06-05 12:52:28.689661", - "result": "success" - }, - { - "errors": [], - "name": "'rm -rf ...'", - "started": "2013-06-05 12:52:28.690156", - "started_linenumber": 375, - "finished_linenumber": 419, - "finished": "2013-06-05 12:53:56.014058", - "result": "success" - }, - { - "errors": [], - "name": "download", - "started": "2013-06-05 12:53:56.014651", - "started_linenumber": 421, - "finished_linenumber": 484, - "finished": "2013-06-05 12:54:02.983974", - "result": "success" - }, - { - "errors": [], - "name": "unpack", - "started": "2013-06-05 12:54:02.984470", - "started_linenumber": 486, - "finished_linenumber": 530, - "finished": "2013-06-05 12:54:06.858348", - "result": "success" - }, - { - "errors": [], - "name": "set props: exepath", - "started": "2013-06-05 12:54:06.858854", - "started_linenumber": 532, - "finished_linenumber": 534, - "finished": "2013-06-05 12:54:06.859521", - "result": "success" - }, - { - "errors": [], - "name": "set props: exedir", - "started": "2013-06-05 12:54:06.859991", - "started_linenumber": 536, - "finished_linenumber": 538, - "finished": "2013-06-05 12:54:06.860629", - "result": "success" - }, - { - "errors": [], - "name": "set props: toolsdir", - "started": "2013-06-05 12:54:06.861112", - "started_linenumber": 540, - "finished_linenumber": 586, - "finished": "2013-06-05 12:54:07.047366", - "result": "success" - }, - { - "errors": [], - "name": "set props: symbols_url", - "started": "2013-06-05 12:54:07.047887", - "started_linenumber": 588, - "finished_linenumber": 590, - "finished": "2013-06-05 12:54:07.048555", - "result": "success" - }, - { - "errors": [], - "name": "download", - "started": "2013-06-05 12:54:07.049041", - "started_linenumber": 592, - "finished_linenumber": 665, - "finished": "2013-06-05 12:54:22.389733", - "result": "success" - }, - { - "errors": [], - "name": "set props: buildid", - "started": "2013-06-05 12:54:22.390374", - "started_linenumber": 667, - "finished_linenumber": 714, - "finished": "2013-06-05 12:54:22.547237", - "result": "success" - }, - { - "errors": [], - "name": "'python.exe c:/talos-slave/test/tools/scripts/support/mouse_and_screen_resolution.py ...'", - "started": "2013-06-05 12:54:22.547836", - "started_linenumber": 716, - "finished_linenumber": 761, - "finished": "2013-06-05 12:54:23.359326", - "result": "success" - }, - { - "errors": [], - "name": "unpack tests", - "started": "2013-06-05 12:54:23.359896", - "started_linenumber": 763, - "finished_linenumber": 807, - "finished": "2013-06-05 12:54:55.231690", - "result": "success" - }, - { - "errors": [ - { - "line": "TEST-UNEXPECTED-FAIL | chrome://mochitests/content/browser/dom/tests/browser/browser_ConsoleAPITests.js | Exception thrown in CO_observe: TypeError: Components.utils.isXrayWrapper is not a function", - "linenumber": 26745 - }, - { - "line": "TEST-UNEXPECTED-FAIL | chrome://mochitests/content/browser/dom/tests/browser/browser_ConsoleAPITests.js | Test timed out", - "linenumber": 26752 - } - ], - "name": "'python mochitest/runtests.py ...' warnings", - "started": "2013-06-05 12:54:55.232364", - "started_linenumber": 809, - "finished_linenumber": 54531, - "finished": "2013-06-05 13:15:39.235146", - "result": "testfailed" - }, - { - "errors": [], - "name": "'rm -rf ...'", - "started": "2013-06-05 13:15:39.244545", - "started_linenumber": 54533, - "finished_linenumber": 54577, - "finished": "2013-06-05 13:16:04.014823", - "result": "success" - }, - { - "errors": [], - "name": "maybe rebooting slave lost", - "started": "2013-06-05 13:16:04.015405", - "started_linenumber": 54579, - "finished_linenumber": 54581, - "finished": "2013-06-05 13:16:04.963614", - "result": "success" - } - ], - "errors_truncated": false - }, + "errors": [ + { + "line": "TEST-UNEXPECTED-FAIL | chrome://mochitests/content/browser/dom/tests/browser/browser_ConsoleAPITests.js | Exception thrown in CO_observe: TypeError: Components.utils.isXrayWrapper is not a function", + "linenumber": 26745 + }, + { + "line": "TEST-UNEXPECTED-FAIL | chrome://mochitests/content/browser/dom/tests/browser/browser_ConsoleAPITests.js | Test timed out", + "linenumber": 26752 + } + ], "logurl": "http://my-log.mozilla.org/mozilla-esr17_xp_test_pgo-mochitest-browser-chrome-bm74-tests1-windows-build12.txt.gz" } diff --git a/tests/sample_data/logs/mozilla-inbound_ubuntu64_vm-debug_test-mochitest-other-bm53-tests1-linux-build122.logview.json b/tests/sample_data/logs/mozilla-inbound_ubuntu64_vm-debug_test-mochitest-other-bm53-tests1-linux-build122.logview.json index 2166fa880..41e545b46 100644 --- a/tests/sample_data/logs/mozilla-inbound_ubuntu64_vm-debug_test-mochitest-other-bm53-tests1-linux-build122.logview.json +++ b/tests/sample_data/logs/mozilla-inbound_ubuntu64_vm-debug_test-mochitest-other-bm53-tests1-linux-build122.logview.json @@ -1,165 +1,53 @@ { - "step_data": { - "steps": [ - { - "errors": [], - "name": "set props: master", - "started": "2013-06-05 12:44:58.842738", - "started_linenumber": 8, - "finished_linenumber": 10, - "finished": "2013-06-05 12:44:58.843804", - "result": "success" - }, - { - "errors": [], - "name": "set props: basedir", - "started": "2013-06-05 12:44:58.844579", - "started_linenumber": 12, - "finished_linenumber": 52, - "finished": "2013-06-05 12:44:58.975106", - "result": "success" - }, - { - "errors": [], - "name": "downloading to buildprops.json", - "started": "2013-06-05 12:44:58.975618", - "started_linenumber": 54, - "finished_linenumber": 55, - "finished": "2013-06-05 12:44:59.037644", - "result": "success" - }, - { - "errors": [], - "name": "'rm -rf ...'", - "started": "2013-06-05 12:44:59.038141", - "started_linenumber": 57, - "finished_linenumber": 95, - "finished": "2013-06-05 12:44:59.112857", - "result": "success" - }, - { - "errors": [], - "name": "'rm -rf ...'", - "started": "2013-06-05 12:44:59.113592", - "started_linenumber": 97, - "finished_linenumber": 135, - "finished": "2013-06-05 12:44:59.201908", - "result": "success" - }, - { - "errors": [], - "name": "'hg clone ...'", - "started": "2013-06-05 12:44:59.202642", - "started_linenumber": 137, - "finished_linenumber": 182, - "finished": "2013-06-05 12:45:02.180652", - "result": "success" - }, - { - "errors": [], - "name": "'hg update ...'", - "started": "2013-06-05 12:45:02.181421", - "started_linenumber": 184, - "finished_linenumber": 223, - "finished": "2013-06-05 12:45:02.421021", - "result": "success" - }, - { - "errors": [], - "name": "set props: script_repo_revision", - "started": "2013-06-05 12:45:02.421566", - "started_linenumber": 225, - "finished_linenumber": 265, - "finished": "2013-06-05 12:45:02.558016", - "result": "success" - }, - { - "errors": [], - "name": "tinderboxprint_script_revlink", - "started": "2013-06-05 12:45:02.558553", - "started_linenumber": 267, - "finished_linenumber": 269, - "finished": "2013-06-05 12:45:02.559173", - "result": "success" - }, - { - "errors": [ - { - "line": "12:46:31 INFO - Assertion failure: pNew->iVersion == pSub->iVersion, at ../../../storage/src/TelemetryVFS.cpp:357", - "linenumber": 825 - }, - { - "line": "12:46:31 WARNING - TEST-UNEXPECTED-FAIL | automation.py | Exited with code 11 during test run", - "linenumber": 826 - }, - { - "line": "12:46:37 WARNING - PROCESS-CRASH | automation.py | application crashed [@ xOpen]", - "linenumber": 829 - }, - { - "line": "12:46:38 ERROR - Return code: 1", - "linenumber": 1600 - }, - { - "line": "12:46:40 INFO - Assertion failure: pNew->iVersion == pSub->iVersion, at ../../../storage/src/TelemetryVFS.cpp:357", - "linenumber": 1632 - }, - { - "line": "12:46:40 WARNING - TEST-UNEXPECTED-FAIL | automation.py | Exited with code 11 during test run", - "linenumber": 1633 - }, - { - "line": "12:46:46 WARNING - PROCESS-CRASH | automation.py | application crashed [@ xOpen]", - "linenumber": 1636 - }, - { - "line": "12:46:46 ERROR - Return code: 1", - "linenumber": 2283 - }, - { - "line": "12:46:48 INFO - Assertion failure: pNew->iVersion == pSub->iVersion, at ../../../storage/src/TelemetryVFS.cpp:357", - "linenumber": 2315 - }, - { - "line": "12:46:48 WARNING - TEST-UNEXPECTED-FAIL | automation.py | Exited with code 11 during test run", - "linenumber": 2316 - }, - { - "line": "12:46:55 WARNING - PROCESS-CRASH | automation.py | application crashed [@ xOpen]", - "linenumber": 2319 - }, - { - "line": "12:46:55 ERROR - Return code: 1", - "linenumber": 3062 - } - ], - "name": "'/tools/buildbot/bin/python scripts/scripts/desktop_unittest.py ...' warnings", - "started": "2013-06-05 12:45:02.559674", - "started_linenumber": 271, - "finished_linenumber": 3070, - "finished": "2013-06-05 12:46:55.430095", - "result": "testfailed" - }, - { - "errors": [], - "name": "set props: build_url symbols_url", - "started": "2013-06-05 12:46:55.431212", - "started_linenumber": 3072, - "finished_linenumber": 3114, - "finished": "2013-06-05 12:46:55.479840", - "result": "success" - }, - { - "errors": [], - "name": "reboot slave lost", - "started": "2013-06-05 12:46:55.480585", - "started_linenumber": 3116, - "finished_linenumber": 3118, - "finished": "2013-06-05 12:46:57.867188", - "result": "success" - } - ], - "errors_truncated": false - }, + "errors": [ + { + "line": "12:46:31 INFO - Assertion failure: pNew->iVersion == pSub->iVersion, at ../../../storage/src/TelemetryVFS.cpp:357", + "linenumber": 825 + }, + { + "line": "12:46:31 WARNING - TEST-UNEXPECTED-FAIL | automation.py | Exited with code 11 during test run", + "linenumber": 826 + }, + { + "line": "12:46:37 WARNING - PROCESS-CRASH | automation.py | application crashed [@ xOpen]", + "linenumber": 829 + }, + { + "line": "12:46:38 ERROR - Return code: 1", + "linenumber": 1600 + }, + { + "line": "12:46:40 INFO - Assertion failure: pNew->iVersion == pSub->iVersion, at ../../../storage/src/TelemetryVFS.cpp:357", + "linenumber": 1632 + }, + { + "line": "12:46:40 WARNING - TEST-UNEXPECTED-FAIL | automation.py | Exited with code 11 during test run", + "linenumber": 1633 + }, + { + "line": "12:46:46 WARNING - PROCESS-CRASH | automation.py | application crashed [@ xOpen]", + "linenumber": 1636 + }, + { + "line": "12:46:46 ERROR - Return code: 1", + "linenumber": 2283 + }, + { + "line": "12:46:48 INFO - Assertion failure: pNew->iVersion == pSub->iVersion, at ../../../storage/src/TelemetryVFS.cpp:357", + "linenumber": 2315 + }, + { + "line": "12:46:48 WARNING - TEST-UNEXPECTED-FAIL | automation.py | Exited with code 11 during test run", + "linenumber": 2316 + }, + { + "line": "12:46:55 WARNING - PROCESS-CRASH | automation.py | application crashed [@ xOpen]", + "linenumber": 2319 + }, + { + "line": "12:46:55 ERROR - Return code: 1", + "linenumber": 3062 + } + ], "logurl": "http://my-log.mozilla.org/mozilla-inbound_ubuntu64_vm-debug_test-mochitest-other-bm53-tests1-linux-build122.txt.gz" } diff --git a/tests/sample_data/logs/opt-objc-exception.logview.json b/tests/sample_data/logs/opt-objc-exception.logview.json index 6b9a85c2e..3c2a2be7c 100644 --- a/tests/sample_data/logs/opt-objc-exception.logview.json +++ b/tests/sample_data/logs/opt-objc-exception.logview.json @@ -1,66 +1,17 @@ { - "logurl": "http://my-log.mozilla.org/opt-objc-exception.txt.gz", - "step_data": { - "steps": [ - { - "name": "set props: revision", - "started": "2013-06-05 12:51:48.767751", - "started_linenumber": 8, - "errors": [], - "finished": "2013-06-05 12:51:48.768393", - "finished_linenumber": 10, - "result": "success" - }, - { - "name": "set props: who", - "started": "2013-06-05 12:51:48.768881", - "started_linenumber": 12, - "errors": [], - "finished": "2013-06-05 12:51:48.769473", - "finished_linenumber": 14, - "result": "success" - }, - { - "name": "'python mochitest/runtests.py ...' warnings", - "started": "2013-06-05 12:54:55.232364", - "started_linenumber": 16, - "errors": [ - { - "linenumber": 24056, - "line": " SimpleTest._logResult(test, \"TEST-PASS\", \"TEST-UNEXPECTED-FAIL\");" - }, - { - "linenumber": 24084, - "line": " SimpleTest._logResult(test, \"TEST-UNEXPECTED-PASS\", \"TEST-KNOWN-FAIL\");" - }, - { - "linenumber": 48743, - "line": "2010-09-23 14:48:01.299 firefox-bin[319:10b] *** Assertion failure in -[NSNextStepFrame lockFocus], /SourceCache/AppKit/AppKit-949.54/AppKit.subproj/NSView.m:4755" - } - ], - "finished": "2013-06-05 13:15:39.235146", - "finished_linenumber": 48792, - "result": "testfailed" - }, - { - "name": "'rm -rf ...'", - "started": "2013-06-05 13:15:39.244545", - "started_linenumber": 48794, - "errors": [], - "finished": "2013-06-05 13:16:04.014823", - "finished_linenumber": 48838, - "result": "success" - }, - { - "name": "maybe rebooting slave lost", - "started": "2013-06-05 13:16:04.015405", - "started_linenumber": 48840, - "errors": [], - "finished": "2013-06-05 13:16:04.963614", - "finished_linenumber": 48842, - "result": "success" - } - ], - "errors_truncated": false - } + "errors": [ + { + "linenumber": 24056, + "line": " SimpleTest._logResult(test, \"TEST-PASS\", \"TEST-UNEXPECTED-FAIL\");" + }, + { + "linenumber": 24084, + "line": " SimpleTest._logResult(test, \"TEST-UNEXPECTED-PASS\", \"TEST-KNOWN-FAIL\");" + }, + { + "linenumber": 48743, + "line": "2010-09-23 14:48:01.299 firefox-bin[319:10b] *** Assertion failure in -[NSNextStepFrame lockFocus], /SourceCache/AppKit/AppKit-949.54/AppKit.subproj/NSView.m:4755" + } + ], + "logurl": "http://my-log.mozilla.org/opt-objc-exception.txt.gz" } diff --git a/tests/ui/job-view/Filtering_test.jsx b/tests/ui/job-view/Filtering_test.jsx index c156e2c47..33e0dd964 100644 --- a/tests/ui/job-view/Filtering_test.jsx +++ b/tests/ui/job-view/Filtering_test.jsx @@ -186,7 +186,7 @@ describe('Filtering', () => { [], ); fetchMock.get( - getProjectUrl('/jobs/259537372/text_log_steps/', 'autoland'), + getProjectUrl('/jobs/259537372/text_log_errors/', 'autoland'), [], ); }); diff --git a/tests/ui/job-view/details/PinBoard_test.jsx b/tests/ui/job-view/details/PinBoard_test.jsx index 11c0af22b..12200122b 100644 --- a/tests/ui/job-view/details/PinBoard_test.jsx +++ b/tests/ui/job-view/details/PinBoard_test.jsx @@ -41,7 +41,7 @@ describe('DetailsPanel', () => { fetchMock.get(getProjectUrl('/jobs/259537372/', repoName), jobList.data[1]); fetchMock.get(getProjectUrl('/note/?job_id=259537372', repoName), []); fetchMock.get( - getProjectUrl('/jobs/259537372/text_log_steps/', repoName), + getProjectUrl('/jobs/259537372/text_log_errors/', repoName), [], ); fetchMock.get( diff --git a/tests/ui/mock/full_job.json b/tests/ui/mock/full_job.json index 0fc7f8c0e..3b0c91fa3 100644 --- a/tests/ui/mock/full_job.json +++ b/tests/ui/mock/full_job.json @@ -36,7 +36,7 @@ "resource_uri": "/api/project/try/jobs/303550431/", "logs": [ { - "name": "builds-4h", + "name": "live_backing_log", "url": "https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/O5YBAWwxRfuZ_UlRJS5Rqg/runs/0/artifacts/public/logs/live_backing.log" }, { diff --git a/tests/ui/push-health/details/DetailsPanel_test.jsx b/tests/ui/push-health/details/DetailsPanel_test.jsx index 09db05600..68f0f1bc1 100644 --- a/tests/ui/push-health/details/DetailsPanel_test.jsx +++ b/tests/ui/push-health/details/DetailsPanel_test.jsx @@ -49,7 +49,7 @@ describe('DetailsPanel', () => { '[taskcluster 2020-05-27 22:09:41.219Z] Task ID: WhN846qNQPin_jnGyF3w-g\n' + '[taskcluster 2020-05-27 22:09:41.219Z] Worker ID: i-04f0e9fbffe5a9186\n', ); - fetchMock.get(getProjectUrl('/jobs/285852125/text_log_steps/', 'try'), [ + fetchMock.get(getProjectUrl('/jobs/285852125/text_log_errors/', 'try'), [ { id: 639432541, errors: [ diff --git a/tests/ui/shared/FailureSummaryTab_test.jsx b/tests/ui/shared/FailureSummaryTab_test.jsx index d62f28747..78e064374 100644 --- a/tests/ui/shared/FailureSummaryTab_test.jsx +++ b/tests/ui/shared/FailureSummaryTab_test.jsx @@ -37,7 +37,7 @@ describe('FailureSummaryTab', () => { logViewerFullUrl="ber/baz" addBug={() => {}} pinJob={() => {}} - repoName="autoland" + repoName={repoName} /> ); diff --git a/tests/webapp/api/test_jobs_api.py b/tests/webapp/api/test_jobs_api.py index 1c32dc9a8..40dea4b7a 100644 --- a/tests/webapp/api/test_jobs_api.py +++ b/tests/webapp/api/test_jobs_api.py @@ -5,7 +5,7 @@ from dateutil import parser from django.urls import reverse from rest_framework.status import HTTP_400_BAD_REQUEST -from treeherder.model.models import Job, TextLogError, TextLogStep +from treeherder.model.models import Job, TextLogError @pytest.mark.parametrize( @@ -209,111 +209,10 @@ def test_job_detail_not_found(client, test_repository): assert resp.status_code == 404 -def test_text_log_steps_and_errors(client, test_job): - - TextLogStep.objects.create( - job=test_job, - name='step1', - started=datetime.datetime.utcfromtimestamp(0), - finished=datetime.datetime.utcfromtimestamp(100), - started_line_number=1, - finished_line_number=100, - result=TextLogStep.SUCCESS, - ) - step2 = TextLogStep.objects.create( - job=test_job, - name='step2', - started=datetime.datetime.utcfromtimestamp(101), - finished=datetime.datetime.utcfromtimestamp(200), - started_line_number=101, - finished_line_number=200, - result=TextLogStep.TEST_FAILED, - ) - TextLogError.objects.create(job=test_job, step=step2, line='failure 1', line_number=101) - TextLogError.objects.create(job=test_job, step=step2, line='failure 2', line_number=102) - resp = client.get( - reverse( - "jobs-text-log-steps", kwargs={"project": test_job.repository.name, "pk": test_job.id} - ) - ) - assert resp.status_code == 200 - assert resp.json() == [ - { - 'errors': [], - 'finished': '1970-01-01T00:01:40', - 'finished_line_number': 100, - 'id': 1, - 'name': 'step1', - 'result': 'success', - 'started': '1970-01-01T00:00:00', - 'started_line_number': 1, - }, - { - 'errors': [ - { - 'id': 1, - 'job': 1, - 'line': 'failure 1', - 'line_number': 101, - 'bug_suggestions': { - 'search': 'failure 1', - 'search_terms': ['failure 1'], - 'bugs': {'open_recent': [], 'all_others': []}, - 'line_number': 101, - }, - 'metadata': None, - 'matches': [], - 'classified_failures': [], - }, - { - 'id': 2, - 'job': 1, - 'line': 'failure 2', - 'line_number': 102, - 'bug_suggestions': { - 'search': 'failure 2', - 'search_terms': ['failure 2'], - 'bugs': {'open_recent': [], 'all_others': []}, - 'line_number': 102, - }, - 'metadata': None, - 'matches': [], - 'classified_failures': [], - }, - ], - 'finished': '1970-01-01T00:03:20', - 'finished_line_number': 200, - 'id': 2, - 'name': 'step2', - 'result': 'testfailed', - 'started': '1970-01-01T00:01:41', - 'started_line_number': 101, - }, - ] - - def test_text_log_errors(client, test_job): - TextLogStep.objects.create( - job=test_job, - name='step1', - started=datetime.datetime.utcfromtimestamp(0), - finished=datetime.datetime.utcfromtimestamp(100), - started_line_number=1, - finished_line_number=100, - result=TextLogStep.SUCCESS, - ) - step2 = TextLogStep.objects.create( - job=test_job, - name='step2', - started=datetime.datetime.utcfromtimestamp(101), - finished=datetime.datetime.utcfromtimestamp(200), - started_line_number=101, - finished_line_number=200, - result=TextLogStep.TEST_FAILED, - ) - TextLogError.objects.create(job=test_job, step=step2, line='failure 1', line_number=101) - TextLogError.objects.create(job=test_job, step=step2, line='failure 2', line_number=102) + TextLogError.objects.create(job=test_job, line='failure 1', line_number=101) + TextLogError.objects.create(job=test_job, line='failure 2', line_number=102) resp = client.get( reverse( "jobs-text-log-errors", kwargs={"project": test_job.repository.name, "pk": test_job.id} diff --git a/treeherder/autoclassify/autoclassify.py b/treeherder/autoclassify/autoclassify.py index 745f85093..29f7cb169 100644 --- a/treeherder/autoclassify/autoclassify.py +++ b/treeherder/autoclassify/autoclassify.py @@ -50,8 +50,8 @@ def match_errors(job, matchers=None): return all_errors = set( - TextLogError.objects.filter(step__job=job, classified_failures=None).prefetch_related( - 'step', '_metadata', '_metadata__failure_line' + TextLogError.objects.filter(job=job, classified_failures=None).prefetch_related( + '_metadata', '_metadata__failure_line' ) ) errors = [t for t in all_errors if t.metadata and t.metadata.failure_line] diff --git a/treeherder/autoclassify/matchers.py b/treeherder/autoclassify/matchers.py index 167af867a..d77cb4d93 100644 --- a/treeherder/autoclassify/matchers.py +++ b/treeherder/autoclassify/matchers.py @@ -32,7 +32,7 @@ def precise_matcher(text_log_error): } qwargs = Q(text_log_error___metadata__best_classification=None) & ( Q(text_log_error___metadata__best_is_verified=True) - | Q(text_log_error__step__job=text_log_error.step.job) + | Q(text_log_error__job=text_log_error.job) ) qs = ( TextLogErrorMatch.objects.filter(**f) @@ -74,7 +74,7 @@ def crash_signature_matcher(text_log_error): } qwargs = Q(text_log_error___metadata__best_classification=None) & ( Q(text_log_error___metadata__best_is_verified=True) - | Q(text_log_error__step__job=text_log_error.step.job) + | Q(text_log_error__job=text_log_error.job) ) qs = ( TextLogErrorMatch.objects.filter(**f) diff --git a/treeherder/config/settings.py b/treeherder/config/settings.py index dbba37214..c286b789f 100644 --- a/treeherder/config/settings.py +++ b/treeherder/config/settings.py @@ -423,7 +423,7 @@ BZ_DATETIME_FORMAT = '%Y-%m-%dT%H:%M:%SZ' COMMENTER_API_KEY = env("BUG_COMMENTER_API_KEY", default=None) # Log Parsing -PARSER_MAX_STEP_ERROR_LINES = 100 +MAX_ERROR_LINES = 100 FAILURE_LINES_CUTOFF = 35 # Perfherder diff --git a/treeherder/etl/artifact.py b/treeherder/etl/artifact.py index 7b78c7c69..865f2652a 100644 --- a/treeherder/etl/artifact.py +++ b/treeherder/etl/artifact.py @@ -1,6 +1,5 @@ import logging -import dateutil.parser import simplejson as json from django.db import transaction from django.db.utils import IntegrityError @@ -8,7 +7,7 @@ from django.db.utils import IntegrityError from treeherder.etl.perf import store_performance_artifact from treeherder.etl.text import astral_filter from treeherder.model import error_summary -from treeherder.model.models import Job, TextLogError, TextLogStep +from treeherder.model.models import Job, TextLogError logger = logging.getLogger(__name__) @@ -17,38 +16,15 @@ def store_text_log_summary_artifact(job, text_log_summary_artifact): """ Store the contents of the text log summary artifact """ - step_data = json.loads(text_log_summary_artifact['blob'])['step_data'] - result_map = {v: k for (k, v) in TextLogStep.RESULTS} + errors = json.loads(text_log_summary_artifact['blob'])['errors'] + with transaction.atomic(): - for step in step_data['steps']: - name = step['name'][: TextLogStep._meta.get_field('name').max_length] - # process start/end times if we have them - # we currently don't support timezones in treeherder, so - # just ignore that when importing/updating the bug to avoid - # a ValueError (though by default the text log summaries - # we produce should have time expressed in UTC anyway) - time_kwargs = {} - for tkey in ('started', 'finished'): - if step.get(tkey): - time_kwargs[tkey] = dateutil.parser.parse(step[tkey], ignoretz=True) - - log_step = TextLogStep.objects.create( - job=job, - started_line_number=step['started_linenumber'], - finished_line_number=step['finished_linenumber'], - name=name, - result=result_map[step['result']], - **time_kwargs, + for error in errors: + obj, created = TextLogError.objects.get_or_create( + job=job, line_number=error['linenumber'], line=astral_filter(error['line']), ) - - if step.get('errors'): - for error in step['errors']: - TextLogError.objects.create( - job=job, - step=log_step, - line_number=error['linenumber'], - line=astral_filter(error['line']), - ) + if not created: + logger.warning('duplicate error lines processed for job %s', job.id) # get error summary immediately (to warm the cache) error_summary.get_error_summary(job) diff --git a/treeherder/log_parser/artifactbuildercollection.py b/treeherder/log_parser/artifactbuildercollection.py index 9095c477d..706cad86f 100644 --- a/treeherder/log_parser/artifactbuildercollection.py +++ b/treeherder/log_parser/artifactbuildercollection.py @@ -4,7 +4,7 @@ import newrelic.agent from treeherder.utils.http import make_request -from .artifactbuilders import BuildbotLogViewArtifactBuilder, BuildbotPerformanceDataArtifactBuilder +from .artifactbuilders import LogViewerArtifactBuilder, PerformanceDataArtifactBuilder from .parsers import EmptyPerformanceData logger = logging.getLogger(__name__) @@ -39,13 +39,13 @@ ArtifactBuilderBase * parser * Passes lines the ``Parser`` -BuildbotLogViewArtifactBuilder +LogViewerArtifactBuilder ------------- * Parses out content for use in a visual Log Parser * Parsers: -* StepParser, which has its own ErrorParser +* ErrorParser -BuildbotPerformanceDataArtifactBuilder +PerformanceDataArtifactBuilder ------------- * Builds an artifact from performance data * Parsers: @@ -72,8 +72,8 @@ BuildbotPerformanceDataArtifactBuilder else: # use the defaults self.builders = [ - BuildbotLogViewArtifactBuilder(url=self.url), - BuildbotPerformanceDataArtifactBuilder(url=self.url), + LogViewerArtifactBuilder(url=self.url), + PerformanceDataArtifactBuilder(url=self.url), ] def parse(self): diff --git a/treeherder/log_parser/artifactbuilders.py b/treeherder/log_parser/artifactbuilders.py index c4c167a28..e758ebd56 100644 --- a/treeherder/log_parser/artifactbuilders.py +++ b/treeherder/log_parser/artifactbuilders.py @@ -1,13 +1,13 @@ import logging -from .parsers import PerformanceParser, StepParser +from .parsers import PerformanceParser, ErrorParser logger = logging.getLogger(__name__) class ArtifactBuilderBase: """ - Base class for all Buildbot log parsers. + Base class for all log parsers. The child class will be designed to create a particular type of artifact. @@ -61,17 +61,17 @@ class ArtifactBuilderBase: return self.artifact -class BuildbotLogViewArtifactBuilder(ArtifactBuilderBase): +class LogViewerArtifactBuilder(ArtifactBuilderBase): """Makes the artifact for the structured log viewer.""" def __init__(self, url=None): """Construct artifact builder for the log viewer""" super().__init__(url) - self.parser = StepParser() + self.parser = ErrorParser() self.name = "text_log_summary" -class BuildbotPerformanceDataArtifactBuilder(ArtifactBuilderBase): +class PerformanceDataArtifactBuilder(ArtifactBuilderBase): """Makes the artifact for performance data.""" def __init__(self, url=None): diff --git a/treeherder/log_parser/crossreference.py b/treeherder/log_parser/crossreference.py index 6b4ed7193..262458de3 100644 --- a/treeherder/log_parser/crossreference.py +++ b/treeherder/log_parser/crossreference.py @@ -39,7 +39,7 @@ def crossreference_job(job): @transaction.atomic def _crossreference(job): failure_lines = FailureLine.objects.filter(job_guid=job.guid) - text_log_errors = TextLogError.objects.filter(step__job=job).order_by('line_number') + text_log_errors = TextLogError.objects.filter(job=job).order_by('line_number') if not failure_lines and text_log_errors: return False diff --git a/treeherder/log_parser/parsers.py b/treeherder/log_parser/parsers.py index 8f2b550e7..9256e6b0f 100644 --- a/treeherder/log_parser/parsers.py +++ b/treeherder/log_parser/parsers.py @@ -39,227 +39,6 @@ class ParserBase: return self.artifact -class StepParser(ParserBase): - """ - Parse out individual job steps within a log. - - Step format: - "steps": [ - { - "errors": [], - "name": "set props: master", # the name of the process on start line - "started": "2013-06-05 12:39:57.838527", - "started_linenumber": 8, - "finished_linenumber": 10, - "finished": "2013-06-05 12:39:57.839226", - "result": 0 - }, - ... - ] - """ - - # Matches the half-dozen 'key: value' header lines printed at the start of each - # Buildbot job log. The list of keys are taken from: - # https://hg.mozilla.org/build/buildbotcustom/file/644c3860300a/bin/log_uploader.py#l126 - RE_HEADER_LINE = re.compile( - r'(?:builder|slave|starttime|results|buildid|builduid|revision): .*' - ) - # Step marker lines, eg: - # ========= Started foo (results: 0, elapsed: 0 secs) (at 2015-08-17 02:33:56.353866) ========= - # ========= Finished foo (results: 0, elapsed: 0 secs) (at 2015-08-17 02:33:56.354301) ========= - RE_STEP_MARKER = re.compile( - r'={9} (?PStarted|Finished) (?P.*?) ' - r'\(results: (?P\d+), elapsed: .*?\) ' - r'\(at (?P.*?)\)' - ) - - # Legacy result code to name mapping inherited from buildbot (duplicated in TextLogStep) - # TODO: Likely remove this and step handling entirely now that Taskcluster doesn't have steps. - RESULT_DICT = { - 0: "success", - 1: "testfailed", - 2: "busted", - 3: "skipped", - 4: "exception", - 5: "retry", - 6: "usercancel", - 7: "superseded", - } - - STATES = { - # The initial state until we record the first step. - "awaiting_first_step": 0, - # We've started a step, but not yet seen the end of it. - "step_in_progress": 1, - # We've seen the end of the previous step. - "step_finished": 2, - } - # date format in a step started/finished header - DATE_FORMAT = '%Y-%m-%d %H:%M:%S.%f' - - def __init__(self): - """Setup the artifact to hold the header lines.""" - super().__init__("step_data") - self.stepnum = -1 - self.artifact = {"steps": [], "errors_truncated": False} - self.sub_parser = ErrorParser() - self.state = self.STATES['awaiting_first_step'] - - def parse_line(self, line, lineno): - """Parse a single line of the log. - - We have to handle both buildbot style logs as well as Taskcluster logs. The latter - attempt to emulate the buildbot logs, but don't accurately do so, partly due - to the way logs are generated in Taskcluster (ie: on the workers themselves). - - Buildbot logs: - - builder: ... - slave: ... - starttime: ... - results: ... - buildid: ... - builduid: ... - revision: ... - - ======= ======= - - ======= ======= - - ======= ======= - - ======= ======= - - Taskcluster logs (a worst-case example): - - - ======= ======= - - ======= ======= - - ======= ======= - - - As can be seen above, Taskcluster logs can have (a) log output that falls between - step markers, and (b) content at the end of the log, that is not followed by a - final finish step marker. We handle this by creating generic placeholder steps to - hold the log output that is not enclosed by step markers, and then by cleaning up - the final step in finish_parse() once all lines have been parsed. - """ - if not line.strip(): - # Skip whitespace-only lines, since they will never contain an error line, - # so are not of interest. This also avoids creating spurious unnamed steps - # (which occurs when we find content outside of step markers) for the - # newlines that separate the steps in Buildbot logs. - return - - if self.state == self.STATES['awaiting_first_step'] and self.RE_HEADER_LINE.match(line): - # The "key: value" job metadata header lines that appear at the top of - # Buildbot logs would result in the creation of an unnamed step at the - # start of the job, unless we skip them. (Which is not desired, since - # the lines are metadata and not test/build output.) - return - - step_marker_match = self.RE_STEP_MARKER.match(line) - - if not step_marker_match: - # This is a normal log line, rather than a step marker. (The common case.) - if self.state != self.STATES['step_in_progress']: - # We don't have an in-progress step, so need to start one, even though this - # isn't a "step started" marker line. We therefore create a new generic step, - # since we have no way of finding out the step metadata. This case occurs - # for the Taskcluster logs where content can fall between step markers. - self.start_step(lineno) - # Parse the line for errors, which if found, will be associated with the current step. - self.sub_parser.parse_line(line, lineno) - return - - # This is either a "step started" or "step finished" marker line, eg: - # ========= Started foo (results: 0, elapsed: 0 secs) (at 2015-08-17 02:33:56.353866) ========= - # ========= Finished foo (results: 0, elapsed: 0 secs) (at 2015-08-17 02:33:56.354301) ========= - - if step_marker_match.group('marker_type') == 'Started': - if self.state == self.STATES['step_in_progress']: - # We're partway through a step (ie: haven't seen a "step finished" marker line), - # but have now reached the "step started" marker for the next step. Before we - # can start the new step, we have to clean up the previous one - albeit using - # generic step metadata, since there was no "step finished" marker. This occurs - # in Taskcluster's logs when content falls between the step marker lines. - self.end_step(lineno) - # Start a new step using the extracted step metadata. - self.start_step( - lineno, - name=step_marker_match.group('name'), - timestamp=step_marker_match.group('timestamp'), - ) - return - - # This is a "step finished" marker line. - - if self.state != self.STATES['step_in_progress']: - # We're not in the middle of a step, so can't finish one. Just ignore the marker line. - return - - # Close out the current step using the extracted step metadata. - self.end_step( - lineno, - timestamp=step_marker_match.group('timestamp'), - result_code=int(step_marker_match.group('result_code')), - ) - - def start_step(self, lineno, name="Unnamed step", timestamp=None): - """Create a new step and update the state to reflect we're now in the middle of a step.""" - self.state = self.STATES['step_in_progress'] - self.stepnum += 1 - self.steps.append( - {"name": name, "started": timestamp, "started_linenumber": lineno, "errors": [],} - ) - - def end_step(self, lineno, timestamp=None, result_code=None): - """Fill in the current step's summary and update the state to show the current step has ended.""" - self.state = self.STATES['step_finished'] - step_errors = self.sub_parser.get_artifact() - step_error_count = len(step_errors) - if step_error_count > settings.PARSER_MAX_STEP_ERROR_LINES: - step_errors = step_errors[: settings.PARSER_MAX_STEP_ERROR_LINES] - self.artifact["errors_truncated"] = True - self.current_step.update( - { - "finished": timestamp, - "finished_linenumber": lineno, - # Whilst the result code is present on both the start and end buildbot-style step - # markers, for Taskcluster logs the start marker line lies about the result, since - # the log output is unbuffered, so Taskcluster does not know the real result at - # that point. As such, we only set the result when ending a step. - "result": self.RESULT_DICT.get(result_code, "unknown"), - "errors": step_errors, - } - ) - # reset the sub_parser for the next step - self.sub_parser.clear() - - def finish_parse(self, last_lineno_seen): - """Clean-up/summary tasks run at the end of parsing.""" - if self.state == self.STATES['step_in_progress']: - # We've reached the end of the log without seeing the final "step finish" - # marker, which would normally have triggered updating the step. As such we - # must manually close out the current step, so things like result, finish - # time are set for it. This ensures that the error summary for Taskcluster - # infra failures actually lists the error that occurs at the - # end of the log. - self.end_step(last_lineno_seen) - - @property - def steps(self): - """Return the list of steps in the artifact""" - return self.artifact["steps"] - - @property - def current_step(self): - """Return the current step in the artifact""" - return self.steps[self.stepnum] - - class ErrorParser(ParserBase): """A generic error detection sub-parser""" @@ -339,6 +118,9 @@ class ErrorParser(ParserBase): def parse_line(self, line, lineno): """Check a single line for an error. Keeps track of the linenumber""" + + if len(self.artifact) >= settings.MAX_ERROR_LINES: + return # TaskCluster logs are a bit wonky. # # TaskCluster logs begin with output coming from TaskCluster itself, diff --git a/treeherder/log_parser/tasks.py b/treeherder/log_parser/tasks.py index 12518cec1..593f365e9 100644 --- a/treeherder/log_parser/tasks.py +++ b/treeherder/log_parser/tasks.py @@ -32,7 +32,7 @@ def parse_logs(job_id, job_log_ids, priority): parser_tasks = { "errorsummary_json": store_failure_lines, - "live_backing_log": parse_unstructured_log, + "live_backing_log": post_log_artifacts, } # We don't want to stop parsing logs for most Exceptions however we still @@ -95,14 +95,6 @@ def parse_logs(job_id, job_log_ids, priority): job.save() -def parse_unstructured_log(job_log): - """ - Call ArtifactBuilderCollection on the given job. - """ - logger.debug('Running parse_unstructured_log for job %s', job_log.job.id) - post_log_artifacts(job_log) - - def store_failure_lines(job_log): """Store the failure lines from a log corresponding to the structured errorsummary file.""" diff --git a/treeherder/model/error_summary.py b/treeherder/model/error_summary.py index 4878782d5..542919d3c 100644 --- a/treeherder/model/error_summary.py +++ b/treeherder/model/error_summary.py @@ -1,5 +1,6 @@ import logging import re +import newrelic.agent from django.core.cache import cache @@ -32,7 +33,7 @@ def get_error_summary(job): # don't cache or do anything if we have no text log errors to get # results for - errors = TextLogError.objects.filter(step__job=job) + errors = TextLogError.objects.filter(job=job) if not errors: return [] @@ -40,7 +41,12 @@ def get_error_summary(job): term_cache = {} error_summary = [bug_suggestions_line(err, term_cache) for err in errors] - cache.set(cache_key, error_summary, BUG_SUGGESTION_CACHE_TIMEOUT) + + try: + cache.set(cache_key, error_summary, BUG_SUGGESTION_CACHE_TIMEOUT) + except Exception as e: + newrelic.agent.record_custom_event('error caching error_summary for job', job.id) + logger.error('error caching error_summary for job %s: %s', job.id, e, exc_info=True) return error_summary diff --git a/treeherder/model/models.py b/treeherder/model/models.py index 6174a229e..87b3d0d95 100644 --- a/treeherder/model/models.py +++ b/treeherder/model/models.py @@ -566,7 +566,7 @@ class Job(models.Model): return False classified_error_count = TextLogError.objects.filter( - _metadata__best_classification__isnull=False, step__job=self + _metadata__best_classification__isnull=False, job=self ).count() if classified_error_count == 0: @@ -586,7 +586,7 @@ class Job(models.Model): instances are set to True. """ unverified_errors = TextLogError.objects.filter( - _metadata__best_is_verified=False, step__job=self + _metadata__best_is_verified=False, job=self ).count() if unverified_errors: @@ -621,7 +621,7 @@ class Job(models.Model): """ If this Job has a single TextLogError line, return that TextLogError. - Some Jobs only have one related [via TextLogStep] TextLogError. This + Some Jobs only have one related TextLogError. This method checks if this Job is one of those (returning None if not) by: * checking the number of related TextLogErrors * counting the number of search results for the single TextLogError @@ -631,7 +631,7 @@ class Job(models.Model): If all these checks pass the TextLogError is returned, any failure returns None. """ try: - text_log_error = TextLogError.objects.get(step__job=self) + text_log_error = TextLogError.objects.get(job=self) except (TextLogError.DoesNotExist, TextLogError.MultipleObjectsReturned): return None @@ -912,8 +912,7 @@ class JobNote(models.Model): # TODO: Decide whether this should change now that we're no longer mirroring. bug_numbers = set( ClassifiedFailure.objects.filter( - best_for_errors__text_log_error__step__job=job, - best_for_errors__best_is_verified=True, + best_for_errors__text_log_error__job=job, best_for_errors__best_is_verified=True, ) .exclude(bug_number=None) .exclude(bug_number=0) @@ -1267,7 +1266,7 @@ class TextLogError(models.Model): unique_together = ('step', 'line_number') def __str__(self): - return "{0} {1}".format(self.id, self.step.job.id) + return "{0} {1}".format(self.id, self.job.id) @property def metadata(self): diff --git a/treeherder/webapp/api/intermittents_view.py b/treeherder/webapp/api/intermittents_view.py index 7d902fc27..8fe788745 100644 --- a/treeherder/webapp/api/intermittents_view.py +++ b/treeherder/webapp/api/intermittents_view.py @@ -81,9 +81,9 @@ class FailuresByBug(generics.ListAPIView): ) lines = TextLogError.objects.filter( - step__job_id__in=self.queryset.values_list('job_id', flat=True), + job_id__in=self.queryset.values_list('job_id', flat=True), line__contains='TEST-UNEXPECTED-FAIL', - ).values_list('step__job_id', 'line') + ).values_list('job_id', 'line') grouped_lines = defaultdict(list) for job_id, line in lines: diff --git a/treeherder/webapp/api/jobs.py b/treeherder/webapp/api/jobs.py index 1023962e9..845f1e090 100644 --- a/treeherder/webapp/api/jobs.py +++ b/treeherder/webapp/api/jobs.py @@ -375,6 +375,7 @@ class JobsProjectViewSet(viewsets.ViewSet): return Response(response_body) + # TODO remove @action(detail=True, methods=['get']) def text_log_steps(self, request, project, pk=None): """ @@ -397,14 +398,14 @@ class JobsProjectViewSet(viewsets.ViewSet): @action(detail=True, methods=['get']) def text_log_errors(self, request, project, pk=None): """ - Gets a list of steps associated with this job + Gets a list of error lines associated with this job """ try: job = Job.objects.get(repository__name=project, id=pk) except Job.DoesNotExist: return Response("No job with id: {0}".format(pk), status=HTTP_404_NOT_FOUND) textlog_errors = ( - TextLogError.objects.filter(step__job=job) + TextLogError.objects.filter(job=job) .select_related("_metadata", "_metadata__failure_line") .prefetch_related("classified_failures", "matches") .order_by('id') diff --git a/ui/helpers/url.js b/ui/helpers/url.js index 178735968..fc312899b 100644 --- a/ui/helpers/url.js +++ b/ui/helpers/url.js @@ -31,6 +31,8 @@ export const repoEndpoint = '/repository/'; export const tcAuthCallbackUrl = '/taskcluster-auth.html'; +export const textLogErrorsEndpoint = '/text_log_errors/'; + export const getRunnableJobsURL = function getRunnableJobsURL( decisionTask, rootUrl, diff --git a/ui/job-view/details/tabs/SimilarJobsTab.jsx b/ui/job-view/details/tabs/SimilarJobsTab.jsx index 7ce60e256..01e8ff3fe 100644 --- a/ui/job-view/details/tabs/SimilarJobsTab.jsx +++ b/ui/job-view/details/tabs/SimilarJobsTab.jsx @@ -8,11 +8,12 @@ import { Button } from 'reactstrap'; import { thMaxPushFetchSize } from '../../../helpers/constants'; import { toDateStr, toShortDateStr } from '../../../helpers/display'; import { addAggregateFields, getBtnClass } from '../../../helpers/job'; -import { getJobsUrl } from '../../../helpers/url'; +import { getJobsUrl, textLogErrorsEndpoint } from '../../../helpers/url'; import JobModel from '../../../models/job'; import PushModel from '../../../models/push'; -import TextLogStepModel from '../../../models/textLogStep'; import { notify } from '../../redux/stores/notifications'; +import { getProjectJobUrl } from '../../../helpers/location'; +import { getData } from '../../../helpers/http'; class SimilarJobsTab extends React.Component { constructor(props) { @@ -124,19 +125,19 @@ class SimilarJobsTab extends React.Component { showJobInfo = (job) => { const { repoName, classificationMap } = this.props; - JobModel.get(repoName, job.id).then((nextJob) => { + JobModel.get(repoName, job.id).then(async (nextJob) => { addAggregateFields(nextJob); nextJob.failure_classification = classificationMap[nextJob.failure_classification_id]; // retrieve the list of error lines - TextLogStepModel.get(nextJob.id).then((textLogSteps) => { - nextJob.error_lines = textLogSteps.reduce( - (acc, step) => [...acc, ...step.errors], - [], - ); - this.setState({ selectedSimilarJob: nextJob }); - }); + const { data, failureStatus } = await getData( + getProjectJobUrl(textLogErrorsEndpoint, nextJob.id), + ); + if (!failureStatus && data.length) { + nextJob.error_lines = data; + } + this.setState({ selectedSimilarJob: nextJob }); }); }; diff --git a/ui/logviewer/App.jsx b/ui/logviewer/App.jsx index 8499925fa..b0158c6a9 100644 --- a/ui/logviewer/App.jsx +++ b/ui/logviewer/App.jsx @@ -4,14 +4,23 @@ import { LazyLog } from 'react-lazylog'; import isEqual from 'lodash/isEqual'; import { Collapse } from 'reactstrap'; -import { getAllUrlParams, getUrlParam, setUrlParam } from '../helpers/location'; +import { + getAllUrlParams, + getUrlParam, + setUrlParam, + getProjectJobUrl, +} from '../helpers/location'; import { scrollToLine } from '../helpers/utils'; import { isReftest } from '../helpers/job'; -import { getJobsUrl, getReftestUrl, getArtifactsUrl } from '../helpers/url'; +import { + getJobsUrl, + getReftestUrl, + getArtifactsUrl, + textLogErrorsEndpoint, +} from '../helpers/url'; import { getData } from '../helpers/http'; import JobModel from '../models/job'; import PushModel from '../models/push'; -import TextLogStepModel from '../models/textLogStep'; import JobDetails from '../shared/JobDetails'; import JobInfo from '../shared/JobInfo'; import RepositoryModel from '../models/repository'; @@ -50,7 +59,7 @@ class App extends React.PureComponent { }; } - componentDidMount() { + async componentDidMount() { const { repoName, jobId } = this.state; const repoPromise = RepositoryModel.getList(); @@ -148,9 +157,12 @@ class App extends React.PureComponent { }); }); - TextLogStepModel.get(jobId).then((textLogSteps) => { - const stepErrors = textLogSteps.length ? textLogSteps[0].errors : []; - const errors = stepErrors.map((error) => ({ + const { data, failureStatus } = await getData( + getProjectJobUrl(textLogErrorsEndpoint, jobId), + ); + + if (!failureStatus && data.length) { + const errors = data.map((error) => ({ line: error.line, lineNumber: error.line_number + 1, })); @@ -163,7 +175,7 @@ class App extends React.PureComponent { errorLinesCss(errors); this.setState({ errors }); this.setSelectedLine(highlight, true); - }); + } } onHighlight = (range) => { diff --git a/ui/models/textLogErrors.js b/ui/models/textLogErrors.js deleted file mode 100644 index 66ac6f42c..000000000 --- a/ui/models/textLogErrors.js +++ /dev/null @@ -1,20 +0,0 @@ -import { getApiUrl } from '../helpers/url'; -import { update } from '../helpers/http'; - -const uri = getApiUrl('/text-log-error/'); - -export default class TextLogErrorsModel { - constructor(data) { - if (data.metadata === null) { - data.metadata = {}; - } - Object.assign(this, data); - } - - static verifyMany(body) { - if (!body.length) { - return Promise.resolve(); - } - return update(uri, body); - } -} diff --git a/ui/models/textLogStep.js b/ui/models/textLogStep.js deleted file mode 100644 index d96a6951d..000000000 --- a/ui/models/textLogStep.js +++ /dev/null @@ -1,9 +0,0 @@ -import { getProjectJobUrl } from '../helpers/location'; - -export default class TextLogStepModel { - static get(jobId) { - return fetch(getProjectJobUrl('/text_log_steps/', jobId)).then((resp) => - resp.json(), - ); - } -} diff --git a/ui/shared/tabs/LogviewerTab.jsx b/ui/shared/tabs/LogviewerTab.jsx index 51167c6fa..3559f97d9 100644 --- a/ui/shared/tabs/LogviewerTab.jsx +++ b/ui/shared/tabs/LogviewerTab.jsx @@ -4,9 +4,10 @@ import { LazyLog } from 'react-lazylog'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faExpand, faFileAlt } from '@fortawesome/free-solid-svg-icons'; -import TextLogStepModel from '../../models/textLogStep'; -import { getLogViewerUrl } from '../../helpers/url'; +import { getLogViewerUrl, textLogErrorsEndpoint } from '../../helpers/url'; import { errorLinesCss } from '../../helpers/display'; +import { getData } from '../../helpers/http'; +import { getProjectJobUrl } from '../../helpers/location'; class LogviewerTab extends React.PureComponent { constructor(props) { @@ -17,30 +18,35 @@ class LogviewerTab extends React.PureComponent { }; } - componentDidMount() { + async componentDidMount() { const { - selectedTaskFull: { id: taskId }, + selectedTaskFull: { id: jobId }, } = this.props; - TextLogStepModel.get(taskId).then((textLogSteps) => { - const stepErrors = textLogSteps.length ? textLogSteps[0].errors : []; - const logErrors = stepErrors.map((error) => ({ + const { data, failureStatus } = await getData( + getProjectJobUrl(textLogErrorsEndpoint, jobId), + ); + if (!failureStatus && data.length) { + const logErrors = data.map((error) => ({ line: error.line, lineNumber: error.line_number + 1, })); + const firstErrorLineNumber = logErrors.length ? [logErrors[0].lineNumber] : null; errorLinesCss(logErrors); this.setState({ highlight: firstErrorLineNumber }); - }); + } } render() { const { selectedTaskFull, repoName } = this.props; const { highlight } = this.state; - const { url } = selectedTaskFull.logs[0]; + const { url } = selectedTaskFull.logs.find( + (log) => log.name === 'live_backing_log', + ); return (
diff --git a/ui/shared/tabs/failureSummary/ErrorsList.jsx b/ui/shared/tabs/failureSummary/ErrorsList.jsx index 4698c4efd..4b6cadc40 100644 --- a/ui/shared/tabs/failureSummary/ErrorsList.jsx +++ b/ui/shared/tabs/failureSummary/ErrorsList.jsx @@ -2,11 +2,9 @@ import React from 'react'; import PropTypes from 'prop-types'; export default function ErrorsList(props) { - const errorListItem = props.errors.map((error, key) => ( -
  • - {error.name} : {error.result}. + const errorListItem = props.errors.map((error) => ( +
  • + {error.line} No Bug Suggestions Available.
    - Unsuccessful Execution Steps + Failure Lines
      {errorListItem}
  • ); diff --git a/ui/shared/tabs/failureSummary/FailureSummaryTab.jsx b/ui/shared/tabs/failureSummary/FailureSummaryTab.jsx index 14286203b..cd815723f 100644 --- a/ui/shared/tabs/failureSummary/FailureSummaryTab.jsx +++ b/ui/shared/tabs/failureSummary/FailureSummaryTab.jsx @@ -9,10 +9,12 @@ import { getBugUrl, getLogViewerUrl, getReftestUrl, + textLogErrorsEndpoint, } from '../../../helpers/url'; import BugFiler from '../../BugFiler'; import BugSuggestionsModel from '../../../models/bugSuggestions'; -import TextLogStepModel from '../../../models/textLogStep'; +import { getData } from '../../../helpers/http'; +import { getProjectJobUrl } from '../../../helpers/location'; import ErrorsList from './ErrorsList'; import ListItem from './ListItem'; @@ -77,7 +79,7 @@ class FailureSummaryTab extends React.Component { if (!selectedJob) { return; } - BugSuggestionsModel.get(selectedJob.id).then((suggestions) => { + BugSuggestionsModel.get(selectedJob.id).then(async (suggestions) => { suggestions.forEach((suggestion) => { suggestion.bugs.too_many_open_recent = suggestion.bugs.open_recent.length > thBugSuggestionLimit; @@ -98,20 +100,21 @@ class FailureSummaryTab extends React.Component { // the log (we can do this asynchronously, it should normally be // fast) if (!suggestions.length) { - TextLogStepModel.get(selectedJob.id).then((textLogSteps) => { - const errors = textLogSteps - .filter((step) => step.result !== 'success') - .map((step) => ({ - name: step.name, - result: step.result, - logViewerUrl: getLogViewerUrl( - selectedJob.id, - repoName, - step.finished_line_number, - ), - })); + const { data, failureStatus } = await getData( + getProjectJobUrl(textLogErrorsEndpoint, selectedJob.id), + ); + if (!failureStatus && data.length) { + const errors = data.map((error) => ({ + line: error.line, + line_number: error.line_number, + logViewerUrl: getLogViewerUrl( + selectedJob.id, + repoName, + error.line_number, + ), + })); this.setState({ errors }); - }); + } } this.setState({ bugSuggestionsLoading: false, suggestions }, () => {