From 5c4fb5eab709e256a49708264eb75bd9ac283a43 Mon Sep 17 00:00:00 2001 From: Profiler Team Date: Wed, 15 Apr 2026 13:18:07 -0700 Subject: [PATCH] Add screenshot tests for the overview page to catch UI regressions PiperOrigin-RevId: 900313630 --- frontend/app/common/constants/BUILD | 1 + frontend/app/common/constants/testing.ts | 191 +++++++++++++++++- frontend/app/components/overview_page/BUILD | 32 +++ .../chrome-linux/overview_page.png | Bin 0 -> 34593 bytes 4 files changed, 222 insertions(+), 2 deletions(-) create mode 100644 frontend/scuba_goldens/chrome-linux/overview_page.png diff --git a/frontend/app/common/constants/BUILD b/frontend/app/common/constants/BUILD index a841c0d95..64a3d7d35 100644 --- a/frontend/app/common/constants/BUILD +++ b/frontend/app/common/constants/BUILD @@ -31,6 +31,7 @@ ts_library( "testing.ts", ], deps = [ + "@npm//@types/google.visualization", "@org_xprof//frontend/app/common/interfaces", ], ) diff --git a/frontend/app/common/constants/testing.ts b/frontend/app/common/constants/testing.ts index 06f2f4aa3..63c36672a 100644 --- a/frontend/app/common/constants/testing.ts +++ b/frontend/app/common/constants/testing.ts @@ -1,4 +1,8 @@ -import {DataTableCellValue, SimpleDataTable} from 'org_xprof/frontend/app/common/interfaces/data_table'; +import { + DataTableCellValue, + OverviewPageDataTuple, + SimpleDataTable, +} from 'org_xprof/frontend/app/common/interfaces/data_table'; class DataTableForTesting { // Note the constructor takes a js object (not a literal string) @@ -303,6 +307,189 @@ export const GVIZ_FOR_TESTING = { return dt; }, sum() {}, - } + }, + }, +}; + +/** Mock overview page data for testing. */ +export const OVERVIEW_PAGE_DATA: OverviewPageDataTuple = [ + { + 'cols': [ + {'id': 'operation', 'label': 'Operation', 'type': 'string'}, + {'id': 'flopRate', 'label': 'GFLOPs/Sec', 'type': 'number'}, + ], + 'rows': [ + {'c': [{'v': 'InfeedQueue/dequeue'}, {'v': 0}]}, + {'c': [{'v': 'all-reduce.958'}, {'v': 1.39586}]}, + ], + 'p': { + 'device_idle_time_percent': '1.1%', + 'host_idle_time_percent': '59.7%', + 'remark_color': 'black', + }, + }, + { + 'cols': [ + {'id': 'step', 'label': 'Step', 'type': 'string'}, + {'id': 'infeedTimeMs', 'label': 'Infeed (in ms)', 'type': 'number'}, + ], + 'rows': [ + {'c': [{'v': '1'}, {'v': 0.1886}]}, + {'c': [{'v': '2'}, {'v': 0.18938}]}, + ], + 'p': { + 'compute_ms_average': '84.46', + 'idle_ms_average': '0.19', + 'input_ms_average': '0.00', + 'step_time_graph_column_ids': 'step,infeedTimeMs', + }, }, + { + 'p': { + 'host_count': '1', + 'tpu_core_count': '2', + 'is_training': 'true', + }, + }, + { + 'p': { + 'bottleneck': 'device', + 'statement': '(1) Your program is NOT input-bound.', + }, + }, + {}, + {'p': {'total_naps_line_0': '5.21 NAPs'}}, + { + 'cols': [ + {'id': 'severity', 'label': 'severity', 'type': 'string'}, + {'id': 'message', 'label': 'message', 'type': 'string'}, + ], + 'rows': [ + {'c': [{'v': 'ERROR'}, {'v': 'error1'}]}, + {'c': [{'v': 'ERROR'}, {'v': 'error2'}]}, + ], + }, + {}, + { + 'p': { + 'decode_step_time_us_avg': '100', + }, + }, +]; + +/** Mock inference latency data for testing. */ +export const INFERENCE_LATENCY_DATA: SimpleDataTable = { + 'cols': [ + { + 'id': 'percentile', + 'label': 'Percentile', + 'type': 'string', + }, + { + 'id': 'hostTimeMs', + 'label': 'Host time (in ms)', + 'type': 'number', + }, + { + 'id': 'deviceTimeMs', + 'label': 'Device time (in ms)', + 'type': 'number', + }, + { + 'id': 'hostDeviceCommunicationTimeMs', + 'label': 'Host-device communication time (in ms)', + 'type': 'number', + }, + { + 'id': 'total', + 'label': 'Total', + 'type': 'string', + }, + ], + 'rows': [ + { + 'c': [ + {'v': 'Avg'}, + {'v': '1.1'}, + {'v': '8.477'}, + {'v': '0.2'}, + {'v': '9.777'}, + ], + }, + { + 'c': [ + {'v': '50.0%'}, + {'v': '1.1'}, + {'v': '8.513'}, + {'v': '0.1'}, + {'v': '9.713'}, + ], + }, + ], }; + +/** Mock overview page data for screenshot testing. */ +export const OVERVIEW_PAGE_DATA_FOR_SCREENSHOT: OverviewPageDataTuple = [ + { + 'cols': [ + {'id': 'operation', 'label': 'Operation', 'type': 'string'}, + {'id': 'flopRate', 'label': 'GFLOPs/Sec', 'type': 'number'}, + ], + 'rows': [ + {'c': [{'v': 'InfeedQueue/dequeue'}, {'v': 0}]}, + {'c': [{'v': 'all-reduce.958'}, {'v': 1.39586}]}, + ], + 'p': { + 'device_idle_time_percent': '1.1%', + 'host_idle_time_percent': '59.7%', + 'mxu_utilization_percent': '45.2', + 'device_duty_cycle_percent': '88.5', + 'hbm_utilization_percent': '32.1', + 'remark_color': 'black', + }, + }, + { + 'cols': [ + {'id': 'step', 'label': 'Step', 'type': 'string'}, + {'id': 'infeedTimeMs', 'label': 'Infeed (in ms)', 'type': 'number'}, + ], + 'rows': [ + {'c': [{'v': '1'}, {'v': 84.1}]}, + {'c': [{'v': '2'}, {'v': 85.2}]}, + {'c': [{'v': '3'}, {'v': 83.9}]}, + {'c': [{'v': '4'}, {'v': 86.5}]}, + {'c': [{'v': '5'}, {'v': 84.8}]}, + {'c': [{'v': '6'}, {'v': 85.1}]}, + {'c': [{'v': '7'}, {'v': 84.2}]}, + {'c': [{'v': '8'}, {'v': 85.5}]}, + {'c': [{'v': '9'}, {'v': 84.7}]}, + {'c': [{'v': '10'}, {'v': 85.0}]}, + ], + 'p': { + 'steptime_ms_average': '84.46', + 'steptime_ms_standard_deviation': '1.2', + 'compute_ms_average': '84.46', + 'idle_ms_average': '0.19', + 'input_ms_average': '0.00', + 'step_time_graph_column_ids': 'step,infeedTimeMs', + }, + }, + { + 'p': { + 'host_count': '1', + 'tpu_core_count': '2', + 'is_training': 'true', + }, + }, + { + 'p': { + 'bottleneck': 'device', + 'statement': '(1) Your program is NOT input-bound.', + }, + }, + {}, + {'p': {'total_naps_line_0': '5.21 NAPs'}}, + {}, + {}, + {}, +]; diff --git a/frontend/app/components/overview_page/BUILD b/frontend/app/components/overview_page/BUILD index c4a0b2824..9c7f1cb73 100644 --- a/frontend/app/components/overview_page/BUILD +++ b/frontend/app/components/overview_page/BUILD @@ -43,3 +43,35 @@ sass_binary( "@org_xprof//frontend/app/styles:common", ], ) + +filegroup( + name = "scuba_goldens", + srcs = glob(["scuba_goldens/**/*.png"]), +) + +xprof_ng_module( + name = "screenshot_tests", + testonly = True, + srcs = [ + "overview_page_screenshot_test.ts", + ], + tags = ["requires-net:external"], + deps = [ + ":overview_page", + "//javascript/angular2/testing/catalyst/async", + # ksf, + "@npm//@angular/core", + "@org_xprof//frontend/app/common/angular:angular_platform-browser_animation", + "@npm//@angular/router", + "@npm//rxjs", + "@npm//safevalues", + "//third_party/javascript/safevalues/dom", + "//third_party/javascript/typings/jasmine", + "@org_xprof//frontend/app/common/constants:testing", + "@org_xprof//frontend/app/common/interfaces", + "@org_xprof//frontend/app/common/utils:testing", + "@org_xprof//frontend/app/components/smart_suggestion", + "@org_xprof//frontend/app/services/data_service_v2:data_service_v2_interface", + "@org_xprof//frontend/app/store", + ], +) diff --git a/frontend/scuba_goldens/chrome-linux/overview_page.png b/frontend/scuba_goldens/chrome-linux/overview_page.png new file mode 100644 index 0000000000000000000000000000000000000000..d58973fa59b5592163c6d8758ee78feaf4095d60 GIT binary patch literal 34593 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®AagWa896Nu8gB`iK1Us|HomUd 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

KUzAy}2sDdDC*nbBa&qQ?&a@H5J15Bmq*M<0Cm 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 literal 0 HcmV?d00001