From 360693582eb26e4d98b0abce8683b7d4b142c9a3 Mon Sep 17 00:00:00 2001 From: Nathan Froyd Date: Thu, 26 Sep 2013 15:25:54 -0400 Subject: [PATCH] add --flush-cache option to runtest.py This patch is in service of bug 896019; I don't know what's involved with getting tests to run featuring this option. --- bin/runtest.py | 3 ++- src/eideticker/eideticker/options.py | 2 ++ src/eideticker/eideticker/runner.py | 14 +++++++++++++- src/eideticker/eideticker/runtest.py | 3 ++- src/eideticker/eideticker/test.py | 4 +++- 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/bin/runtest.py b/bin/runtest.py index 449c385..ef702f5 100755 --- a/bin/runtest.py +++ b/bin/runtest.py @@ -59,7 +59,8 @@ def main(args=sys.argv[1:]): no_capture=options.no_capture, capture_area=options.capture_area, capture_file=options.capture_file, - sync_time=options.sync_time) + sync_time=options.sync_time, + flush_caches=options.flush_caches) # save logs if applicable testlog.save_logs(http_request_log_path=options.request_log_file, diff --git a/src/eideticker/eideticker/options.py b/src/eideticker/eideticker/options.py index 9239d44..618ca78 100644 --- a/src/eideticker/eideticker/options.py +++ b/src/eideticker/eideticker/options.py @@ -66,6 +66,8 @@ def __init__(self, **kwargs): default="{}", help="Extra profile preference for Firefox browsers. " "Must be passed in as a JSON dictionary") + self.add_option("--flush-caches", action="store_true", dest="flush_caches", + help="Flush operating system caches before running tests") def parse_args(self): (options, args) = CaptureOptionParser.parse_args(self) diff --git a/src/eideticker/eideticker/runner.py b/src/eideticker/eideticker/runner.py index 0217cc2..28b4a1a 100644 --- a/src/eideticker/eideticker/runner.py +++ b/src/eideticker/eideticker/runner.py @@ -20,7 +20,7 @@ class AndroidBrowserRunner(log.LoggingMixin): def __init__(self, dm, appname, url, tmpdir, preinitialize_user_profile=False, open_url_after_launch=False, enable_profiling=False, gecko_profiler_addon_dir=None, extra_prefs={}, - extra_env_vars={}): + extra_env_vars={}, flush_caches=False): self.dm = dm self.appname = appname self.url = url @@ -32,6 +32,7 @@ def __init__(self, dm, appname, url, tmpdir, preinitialize_user_profile=False, self.extra_prefs = extra_prefs self.remote_profile_dir = None self.extra_env_vars = extra_env_vars + self.flush_caches = flush_caches activity_mappings = { 'com.android.browser': '.BrowserActivity', @@ -137,6 +138,14 @@ def initialize_user_profile(self): time.sleep(10) self.dm.killProcess(self.appname) + def maybe_flush_caches(self): + if self.flush_caches: + self.log("Flushing caches") + output = self.dm.shellCheckOutput(["sh", "-c", + "echo 3 > /proc/sys/vm/drop_caches"], + root=True) + self.log(output) + def start(self): self.log("Starting %s... " % self.appname) @@ -159,16 +168,19 @@ def start(self): self.launch_fennec(mozEnv, url) else: self.is_profiling = False # never profiling with non-fennec browsers + self.maybe_flush_caches() self.dm.launchApplication(self.appname, self.activity, self.intent, url=url) def open_url(self): + self.maybe_flush_caches() self.dm.launchApplication(self.appname, self.activity, self.intent, url=self.url, failIfRunning=False) def launch_fennec(self, mozEnv, url): # sometimes fennec fails to start, so we'll try three times... for i in range(3): + self.maybe_flush_caches() self.log("Launching %s (try %s of 3)" % (self.appname, i+1)) try: self.dm.launchFennec(self.appname, url=url, mozEnv=mozEnv, diff --git a/src/eideticker/eideticker/runtest.py b/src/eideticker/eideticker/runtest.py index 304ea4b..03d4960 100644 --- a/src/eideticker/eideticker/runtest.py +++ b/src/eideticker/eideticker/runtest.py @@ -15,7 +15,7 @@ def run_test(testkey, capture_device, appname, capture_name, request_log_file=None, actions_log_file=None, log_checkerboard_stats=False, extra_env_vars={}, capture_area=None, no_capture=False, capture_file=None, - sync_time=True): + sync_time=True, flush_caches=False): testinfo = get_testinfo(testkey) print "Testinfo: %s" % testinfo @@ -84,6 +84,7 @@ def run_test(testkey, capture_device, appname, capture_name, testpath_rel = testpath_rel, device = device, actions = actions, extra_prefs = extra_prefs, extra_env_vars = extra_env_vars, + flush_caches = flush_caches, capture_file = capture_file, capture_controller = capture_controller, capture_metadata = capture_metadata, diff --git a/src/eideticker/eideticker/test.py b/src/eideticker/eideticker/test.py index 5587afd..9d162d6 100644 --- a/src/eideticker/eideticker/test.py +++ b/src/eideticker/eideticker/test.py @@ -298,6 +298,7 @@ class AndroidWebTest(WebTest): def __init__(self, testinfo, appname = None, extra_prefs = {}, extra_env_vars = {}, + flush_caches = False, profile_file = None, gecko_profiler_addon_dir = None, log_checkerboard_stats = False, @@ -337,7 +338,8 @@ def __init__(self, testinfo, appname = None, extra_prefs = {}, enable_profiling=bool(self.profile_file), gecko_profiler_addon_dir=gecko_profiler_addon_dir, extra_prefs=self.extra_prefs, - extra_env_vars=extra_env_vars) + extra_env_vars=extra_env_vars, + flush_caches=flush_caches) def cleanup(self): # Clean up checkerboard logging preferences