blob: e5e0f3bd2d703195eaf6d479f158bb8abac340eb [file] [log] [blame]
# Copyright 2020 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import time
import os
import json
import statistics
import sys
from common import TestDriver
from common import IntegrationTest
HISTOGRAMS = [
'TFLiteExperiment.Observer.TFLitePredictor.Null',
'TFLiteExperiment.Observer.TFLitePredictor.EvaluationRequested',
'TFLiteExperiment.Observer.Finish',
'TFLiteExperiment.Observer.TFLitePredictor.InputSetTime',
'TFLiteExperiment.Observer.TFLitePredictor.EvaluationTime',
'PageLoad.PaintTiming.NavigationToFirstContentfulPaint',
'PageLoad.PaintTiming.NavigationToLargestContentfulPaint',
]
URL_LOOP_NUM = 10
class TFLiteKeyedServiceTest(IntegrationTest):
def _set_tflite_experiment_config(self, test_driver):
if test_driver._flags.tflite_model:
test_driver.AddChromeArg("--tflite-model-path=%s" %
test_driver._flags.tflite_model)
if test_driver._flags.tflite_experiment_log:
test_driver.AddChromeArg("--tflite-experiment-log-path=%s" %
test_driver._flags.tflite_experiment_log)
test_driver.AddChromeArg('--tflite-predictor-num-threads=%s' %
str(test_driver._flags.tflite_num_threads))
# Log histogram for url using test_driver logger.
def _log_histogram(self, test_driver, histogram, url, is_tflite):
log_dict = {}
log_dict["url"] = url
if is_tflite:
log_dict['tflite'] = 'true'
else:
log_dict['tflite'] = 'false'
histogram_value = test_driver.GetBrowserHistogram(histogram)
test_driver._logger.info(histogram_value)
if not histogram_value:
return
bucket_list = []
for bucket in histogram_value['buckets']:
bucket_val = (bucket['low'] + bucket['high']) / 2
for loop in range(bucket['count']):
bucket_list.append(bucket_val)
std_val = statistics.stdev(bucket_list)
mean_val = statistics.mean(bucket_list)
if histogram == 'TFLiteExperiment.Observer.TFLitePredictor.EvaluationTime':
log_dict['name'] = 'Evaluation Std'
log_dict['value'] = std_val
test_driver._logger.info(log_dict)
log_dict['name'] = 'Evaluation Mean'
log_dict['value'] = mean_val
test_driver._logger.info(log_dict)
elif histogram == 'TFLiteExperiment.Observer.TFLitePredictor.InputSetTime':
log_dict['name'] = 'InputSet Std'
log_dict['value'] = std_val
test_driver._logger.info(log_dict)
log_dict['name'] = 'InputSet Mean'
log_dict['value'] = mean_val
test_driver._logger.info(log_dict)
elif histogram == 'PageLoad.PaintTiming.NavigationToFirstContentfulPaint':
log_dict['name'] = 'FirstContent Std'
log_dict['value'] = std_val
test_driver._logger.info(log_dict)
log_dict['name'] = 'FirstContent Mean'
log_dict['value'] = mean_val
test_driver._logger.info(log_dict)
elif histogram == 'PageLoad.PaintTiming.NavigationToLargestContentfulPaint':
log_dict['name'] = 'LargestContent Std'
log_dict['value'] = std_val
test_driver._logger.info(log_dict)
log_dict['name'] = 'LargestContent Mean'
log_dict['value'] = mean_val
test_driver._logger.info(log_dict)
def _get_url_list(self, test_driver):
if not test_driver:
return []
if not test_driver._flags.url_list:
return []
url_list = []
with open(test_driver._flags.url_list, 'r') as f:
line = f.readline()
while (line):
url_list.append(line)
line = f.readline()
return url_list
def _open_new_tab(self, test_driver, url):
test_driver._driver.execute_script('window.open(' ');')
test_driver._driver.switch_to.window(
test_driver._driver.window_handles[1])
test_driver._driver.get(url)
test_driver._driver.switch_to.window(
test_driver._driver.window_handles[0])
test_driver._driver.close()
test_driver._driver.switch_to.window(
test_driver._driver.window_handles[0])
# Records content load timing.
def _keyed_service_test(self, tflite_enabled):
with TestDriver() as test_driver:
url_list = self._get_url_list(test_driver)
for url in url_list:
with TestDriver() as test_driver:
if tflite_enabled:
self._set_tflite_experiment_config(test_driver)
test_driver.ClearCache()
test_driver.LoadURL(url, timeout=120)
for loop in range(URL_LOOP_NUM):
self._open_new_tab(test_driver, url)
for histogram in HISTOGRAMS:
self._log_histogram(test_driver,
histogram,
url,
is_tflite=tflite_enabled)
# Records content load timing when TFLite Keyed Service
# is enabled.
def test_with_tflite(self):
self._keyed_service_test(tflite_enabled=True)
# Records content load timing when TFLite Keyed Service
# is disabled.
def test_no_tflite(self):
self._keyed_service_test(tflite_enabled=False)
# Records content load timing with running
# with and without tflite.
def test_in_order(self):
url_list = self._get_url_list(TestDriver())
for url in url_list:
# Test with TFLite.
with TestDriver() as test_driver_1:
self._set_tflite_experiment_config(test_driver_1)
test_driver_1.ClearCache()
test_driver_1.LoadURL(url, timeout=120)
for loop in range(URL_LOOP_NUM):
self._open_new_tab(test_driver_1, url)
for histogram in HISTOGRAMS:
self._log_histogram(test_driver_1,
histogram,
url,
is_tflite=True)
# Test without TFLite.
with TestDriver() as test_driver_2:
test_driver_2.ClearCache()
test_driver_2.LoadURL(url, timeout=120)
for loop in range(URL_LOOP_NUM):
self._open_new_tab(test_driver_2, url)
for histogram in HISTOGRAMS:
self._log_histogram(test_driver_2,
histogram,
url,
is_tflite=False)
if __name__ == '__main__':
IntegrationTest.RunAllTests()