Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(80)

Side by Side Diff: build/android/pylib/gtest/test_package_apk.py

Issue 20649002: [Android] Dedup content_browsertests test setup from gtests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed bulach's comments Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 """Defines TestPackageApk to help run APK-based native tests.""" 5 """Defines TestPackageApk to help run APK-based native tests."""
6 6
7 import logging 7 import logging
8 import os 8 import os
9 import shlex 9 import shlex
10 import sys 10 import sys
11 import tempfile 11 import tempfile
12 import time 12 import time
13 13
14 from pylib import android_commands 14 from pylib import android_commands
15 from pylib import cmd_helper
15 from pylib import constants 16 from pylib import constants
16 from pylib import pexpect 17 from pylib import pexpect
17 from pylib.android_commands import errors 18 from pylib.android_commands import errors
18 19
19 from test_package import TestPackage 20 from test_package import TestPackage
20 21
21 22
22 class TestPackageApk(TestPackage): 23 class TestPackageApk(TestPackage):
23 """A helper class for running APK-based native tests.""" 24 """A helper class for running APK-based native tests."""
24 25
25 def __init__(self, adb, device, suite_path_full, tool, test_apk_package_name, 26 def __init__(self, suite_name, build_type):
26 test_activity_name, command_line_file):
27 """ 27 """
28 Args: 28 Args:
29 adb: ADB interface the tests are using. 29 suite_name: Name of the test suite (e.g. base_unittests).
30 device: Device to run the tests. 30 build_type: 'Release' or 'Debug'.
31 suite_path_full: Absolute path to a specific test suite to run,
32 empty to run all.
33 Ex: '/foo/bar/base_unittests-debug.apk', for which
34 self.suite_path_full = '/foo/bar/base_unittests-debug.apk'
35 self.suite_path = '/foo/bar/base_unittests-debug'
36 self.suite_basename = 'base_unittests'
37 self.suite_dirname = '/foo/bar'
38 tool: Name of the Valgrind tool.
39 test_apk_package_name: Apk package name for tests running in APKs.
40 test_activity_name: Test activity to invoke for APK tests.
41 command_line_file: Filename to use to pass arguments to tests.
42 """ 31 """
43 TestPackage.__init__(self, adb, device, suite_path_full, tool) 32 TestPackage.__init__(self, suite_name)
44 self._test_apk_package_name = test_apk_package_name 33 product_dir = os.path.join(cmd_helper.OutDirectory.get(), build_type)
45 self._test_activity_name = test_activity_name 34 if suite_name == 'content_browsertests':
46 self._command_line_file = command_line_file 35 self.suite_path = os.path.join(
36 product_dir, 'apks', '%s.apk' % suite_name)
37 self._test_apk_package_name = constants.BROWSERTEST_TEST_PACKAGE_NAME
38 self._test_activity_name = constants.BROWSERTEST_TEST_ACTIVITY_NAME
39 self._command_line_file = constants.BROWSERTEST_COMMAND_LINE_FILE
40 else:
41 self.suite_path = os.path.join(
42 product_dir, '%s_apk' % suite_name, '%s-debug.apk' % suite_name)
43 self._test_apk_package_name = constants.GTEST_TEST_PACKAGE_NAME
44 self._test_activity_name = constants.GTEST_TEST_ACTIVITY_NAME
45 self._command_line_file = constants.GTEST_COMMAND_LINE_FILE
47 46
48 def _CreateCommandLineFileOnDevice(self, options): 47 def _CreateCommandLineFileOnDevice(self, adb, options):
49 command_line_file = tempfile.NamedTemporaryFile() 48 command_line_file = tempfile.NamedTemporaryFile()
50 # GTest expects argv[0] to be the executable path. 49 # GTest expects argv[0] to be the executable path.
51 command_line_file.write(self.suite_basename + ' ' + options) 50 command_line_file.write(self.suite_name + ' ' + options)
52 command_line_file.flush() 51 command_line_file.flush()
53 self.adb.PushIfNeeded(command_line_file.name, 52 adb.PushIfNeeded(command_line_file.name,
54 constants.TEST_EXECUTABLE_DIR + '/' + 53 constants.TEST_EXECUTABLE_DIR + '/' +
55 self._command_line_file) 54 self._command_line_file)
56 55
57 def _GetGTestReturnCode(self):
58 return None
59
60 def _GetFifo(self): 56 def _GetFifo(self):
61 # The test.fifo path is determined by: 57 # The test.fifo path is determined by:
62 # testing/android/java/src/org/chromium/native_test/ 58 # testing/android/java/src/org/chromium/native_test/
63 # ChromeNativeTestActivity.java and 59 # ChromeNativeTestActivity.java and
64 # testing/android/native_test_launcher.cc 60 # testing/android/native_test_launcher.cc
65 return '/data/data/' + self._test_apk_package_name + '/files/test.fifo' 61 return '/data/data/' + self._test_apk_package_name + '/files/test.fifo'
66 62
67 def _ClearFifo(self): 63 def _ClearFifo(self, adb):
68 self.adb.RunShellCommand('rm -f ' + self._GetFifo()) 64 adb.RunShellCommand('rm -f ' + self._GetFifo())
69 65
70 def _WatchFifo(self, timeout, logfile=None): 66 def _WatchFifo(self, adb, timeout, logfile=None):
71 for i in range(10): 67 for i in range(10):
72 if self.adb.FileExistsOnDevice(self._GetFifo()): 68 if adb.FileExistsOnDevice(self._GetFifo()):
73 logging.info('Fifo created.') 69 logging.info('Fifo created.')
74 break 70 break
75 time.sleep(i) 71 time.sleep(i)
76 else: 72 else:
77 raise errors.DeviceUnresponsiveError( 73 raise errors.DeviceUnresponsiveError(
78 'Unable to find fifo on device %s ' % self._GetFifo()) 74 'Unable to find fifo on device %s ' % self._GetFifo())
79 args = shlex.split(self.adb.Adb()._target_arg) 75 args = shlex.split(adb.Adb()._target_arg)
80 args += ['shell', 'cat', self._GetFifo()] 76 args += ['shell', 'cat', self._GetFifo()]
81 return pexpect.spawn('adb', args, timeout=timeout, logfile=logfile) 77 return pexpect.spawn('adb', args, timeout=timeout, logfile=logfile)
82 78
83 def _StartActivity(self): 79 def _StartActivity(self, adb):
84 self.adb.StartActivity( 80 adb.StartActivity(
85 self._test_apk_package_name, 81 self._test_apk_package_name,
86 self._test_activity_name, 82 self._test_activity_name,
87 wait_for_completion=True, 83 wait_for_completion=True,
88 action='android.intent.action.MAIN', 84 action='android.intent.action.MAIN',
89 force_stop=True) 85 force_stop=True)
90 86
91 def _GetTestSuiteBaseName(self): 87 #override
92 """Returns the base name of the test suite.""" 88 def ClearApplicationState(self, adb):
93 # APK test suite names end with '-debug.apk' 89 adb.ClearApplicationState(self._test_apk_package_name)
94 return os.path.basename(self.suite_path).rsplit('-debug', 1)[0]
95 90
96 #override 91 #override
97 def ClearApplicationState(self): 92 def CreateCommandLineFileOnDevice(self, adb, test_filter, test_arguments):
98 self.adb.ClearApplicationState(self._test_apk_package_name) 93 self._CreateCommandLineFileOnDevice(
94 adb, '--gtest_filter=%s %s' % (test_filter, test_arguments))
99 95
100 #override 96 #override
101 def CreateCommandLineFileOnDevice(self, test_filter, test_arguments): 97 def GetAllTests(self, adb):
102 self._CreateCommandLineFileOnDevice( 98 self._CreateCommandLineFileOnDevice(adb, '--gtest_list_tests')
103 '--gtest_filter=%s %s' % (test_filter, test_arguments))
104
105 #override
106 def GetAllTests(self):
107 self._CreateCommandLineFileOnDevice('--gtest_list_tests')
108 try: 99 try:
109 self.tool.SetupEnvironment() 100 self.tool.SetupEnvironment()
110 # Clear and start monitoring logcat. 101 # Clear and start monitoring logcat.
111 self._ClearFifo() 102 self._ClearFifo(adb)
112 self._StartActivity() 103 self._StartActivity(adb)
113 # Wait for native test to complete. 104 # Wait for native test to complete.
114 p = self._WatchFifo(timeout=30 * self.tool.GetTimeoutScale()) 105 p = self._WatchFifo(adb, timeout=30 * self.tool.GetTimeoutScale())
115 p.expect('<<ScopedMainEntryLogger') 106 p.expect('<<ScopedMainEntryLogger')
116 p.close() 107 p.close()
117 finally: 108 finally:
118 self.tool.CleanUpEnvironment() 109 self.tool.CleanUpEnvironment()
119 # We need to strip the trailing newline. 110 # We need to strip the trailing newline.
120 content = [line.rstrip() for line in p.before.splitlines()] 111 content = [line.rstrip() for line in p.before.splitlines()]
121 return self._ParseGTestListTests(content) 112 return self._ParseGTestListTests(content)
122 113
123 #override 114 #override
124 def SpawnTestProcess(self): 115 def SpawnTestProcess(self, adb):
125 try: 116 try:
126 self.tool.SetupEnvironment() 117 self.tool.SetupEnvironment()
127 self._ClearFifo() 118 self._ClearFifo(adb)
128 self._StartActivity() 119 self._StartActivity(adb)
129 finally: 120 finally:
130 self.tool.CleanUpEnvironment() 121 self.tool.CleanUpEnvironment()
131 logfile = android_commands.NewLineNormalizer(sys.stdout) 122 logfile = android_commands.NewLineNormalizer(sys.stdout)
132 return self._WatchFifo(timeout=10, logfile=logfile) 123 return self._WatchFifo(adb, timeout=10, logfile=logfile)
133 124
134 #override 125 #override
135 def Install(self): 126 def Install(self, adb):
136 self.tool.CopyFiles() 127 self.tool.CopyFiles()
137 self.adb.ManagedInstall(self.suite_path_full, False, 128 adb.ManagedInstall(self.suite_path, False,
138 package_name=self._test_apk_package_name) 129 package_name=self._test_apk_package_name)
139
OLDNEW
« no previous file with comments | « build/android/pylib/gtest/test_package.py ('k') | build/android/pylib/gtest/test_package_exe.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698