def testDisable(self): with self._test_trace(disable=False): with open(self._log_path, 'r') as f: self.assertTrue(trace_event.trace_is_enabled()) trace_event.trace_disable() self.assertEquals(len(json.loads(f.read() + ']')), 1) self.assertFalse(trace_event.trace_is_enabled())
def StopAgentTracing(self): if not self._is_tracing_controllable: return assert trace_event.trace_is_enabled(), 'Tracing not running' trace_event.trace_disable() assert not trace_event.trace_is_enabled( ), 'Tracing didnt disable properly.'
def RunTests(self): # Affinitize the tests. if self._test_instance.trace_output: assert not trace_event.trace_is_enabled( ), 'Tracing already running.' trace_event.trace_enable(self._test_instance.trace_output + '.json') self._SplitTestsByAffinity() if not self._test_buckets and not self._no_device_tests: raise local_device_test_run.NoTestsError() def run_no_devices_tests(): if not self._no_device_tests: return [] s = HostTestShard(self._env, self._test_instance, self._no_device_tests, retries=3, timeout=self._timeout) return [s.RunTestsOnShard()] def device_shard_helper(shard_id): if device_status.IsBlacklisted(str(self._devices[shard_id]), self._env.blacklist): logging.warning( 'Device %s is not active. Will not create shard %s.', str(self._devices[shard_id]), shard_id) return None s = DeviceTestShard(self._env, self._test_instance, self._devices[shard_id], shard_id, self._test_buckets[shard_id], retries=self._env.max_tries, timeout=self._timeout) return s.RunTestsOnShard() def run_devices_tests(): if not self._test_buckets: return [] if self._devices is None: self._devices = self._GetAllDevices( self._env.devices, self._test_instance.known_devices_file) device_indices = range( min(len(self._devices), len(self._test_buckets))) shards = parallelizer.Parallelizer(device_indices).pMap( device_shard_helper) return [x for x in shards.pGet(self._timeout) if x is not None] host_test_results, device_test_results = reraiser_thread.RunAsync( [run_no_devices_tests, run_devices_tests]) if self._test_instance.trace_output: assert trace_event.trace_is_enabled(), 'Tracing not running.' trace_event.trace_disable() local_device_test_run.LocalDeviceTestRun._JsonToTrace( self._test_instance.trace_output + '.json', self._test_instance.trace_output) return host_test_results + device_test_results
def testDisable(self): _old_multiprocessing_process = multiprocessing.Process with self._test_trace(disable=False): with open(self._log_path, 'r') as f: self.assertTrue(trace_event.trace_is_enabled()) self.assertEqual(multiprocessing.Process, multiprocessing_shim.ProcessShim) trace_event.trace_disable() self.assertEqual(multiprocessing.Process, _old_multiprocessing_process) self.assertEquals(len(json.loads(f.read() + ']')), 1) self.assertFalse(trace_event.trace_is_enabled())
def StartAgentTracing(self, config, timeout): self._is_tracing_controllable = self._IsTracingControllable() if not self._is_tracing_controllable: return False tf = tempfile.NamedTemporaryFile(delete=False) self._trace_log = tf.name tf.close() del config # unused del timeout # unused assert not trace_event.trace_is_enabled(), 'Tracing already running.' trace_event.trace_enable(self._trace_log) assert trace_event.trace_is_enabled(), 'Tracing didn\'t enable properly.' return True
def RunTests(self): # Affinitize the tests. if self._test_instance.trace_output: assert not trace_event.trace_is_enabled(), 'Tracing already running.' trace_event.trace_enable(self._test_instance.trace_output + '.json') self._SplitTestsByAffinity() if not self._test_buckets and not self._no_device_tests: raise local_device_test_run.NoTestsError() def run_no_devices_tests(): if not self._no_device_tests: return [] s = HostTestShard(self._env, self._test_instance, self._no_device_tests, retries=3, timeout=self._timeout) return [s.RunTestsOnShard()] def device_shard_helper(shard_id): if device_status.IsBlacklisted( str(self._devices[shard_id]), self._env.blacklist): logging.warning('Device %s is not active. Will not create shard %s.', str(self._devices[shard_id]), shard_id) return None s = DeviceTestShard(self._env, self._test_instance, self._devices[shard_id], shard_id, self._test_buckets[shard_id], retries=self._env.max_tries, timeout=self._timeout) return s.RunTestsOnShard() def run_devices_tests(): if not self._test_buckets: return [] if self._devices is None: self._devices = self._GetAllDevices( self._env.devices, self._test_instance.known_devices_file) device_indices = range(min(len(self._devices), len(self._test_buckets))) shards = parallelizer.Parallelizer(device_indices).pMap( device_shard_helper) return [x for x in shards.pGet(self._timeout) if x is not None] host_test_results, device_test_results = reraiser_thread.RunAsync( [run_no_devices_tests, run_devices_tests]) if self._test_instance.trace_output: assert trace_event.trace_is_enabled(), 'Tracing not running.' trace_event.trace_disable() local_device_test_run.LocalDeviceTestRun._JsonToTrace( self._test_instance.trace_output + '.json', self._test_instance.trace_output) return host_test_results + device_test_results
def DisableTracing(self): if not trace_event.trace_is_enabled(): logging.warning('Tracing is not running.') else: trace_event.trace_disable() self._JsonToTrace(self._trace_output + '.json', self._trace_output)
def CollectAgentTraceData(self, trace_data_builder): if not self._is_tracing_controllable: return assert not trace_event.trace_is_enabled(), 'Stop tracing before collection.' with open(self._trace_log, 'r') as fp: data = ast.literal_eval(fp.read() + ']') trace_data_builder.SetTraceFor(trace_data_module.TELEMETRY_PART, { "traceEvents": data, "metadata": { # TODO(charliea): For right now, we use "TELEMETRY" as the clock # domain to guarantee that Telemetry is given its own clock # domain. Telemetry isn't really a clock domain, though: it's a # system that USES a clock domain like LINUX_CLOCK_MONOTONIC or # WIN_QPC. However, there's a chance that a Telemetry controller # running on Linux (using LINUX_CLOCK_MONOTONIC) is interacting with # an Android phone (also using LINUX_CLOCK_MONOTONIC, but on a # different machine). The current logic collapses clock domains # based solely on the clock domain string, but we really should to # collapse based on some (device ID, clock domain ID) tuple. Giving # Telemetry its own clock domain is a work-around for this. "clock-domain": "TELEMETRY", "iteration-info": (self._iteration_info.AsDict() if self._iteration_info else {}), } }) try: os.remove(self._trace_log) self._trace_log = None except OSError: logging.exception('Error when deleting %s, will try again at exit.', self._trace_log) def DeleteAtExit(path): os.remove(path) atexit_with_log.Register(DeleteAtExit, self._trace_log) self._trace_log = None
def StopAgentTracing(self, trace_data_builder): if not self._is_tracing_controllable: return assert trace_event.trace_is_enabled(), 'Tracing not running' trace_event.trace_disable() assert not trace_event.trace_is_enabled(), 'Tracing didnt disable properly.' with open(self._trace_log, 'r') as fp: data = ast.literal_eval(fp.read() + ']') trace_data_builder.AddEventsTo(trace_data_module.TELEMETRY_PART, data) try: os.remove(self._trace_log) self._trace_log = None except OSError: logging.exception('Error when deleting %s, will try again at exit.', self._trace_log) def DeleteAtExit(path): os.remove(path) atexit.register(DeleteAtExit, self._trace_log) self._trace_log = None
def testEnable(self): with self._test_trace(): with open(self._log_path, 'r') as f: log_output = json.loads(f.read() + ']') self.assertEquals(len(log_output), 1) self.assertTrue(trace_event.trace_is_enabled()) log_output = log_output.pop() self.assertEquals(log_output['category'], 'process_argv') self.assertEquals(log_output['name'], 'process_argv') self.assertTrue(log_output['args']['argv']) self.assertEquals(log_output['ph'], 'M')
def CollectAgentTraceData(self, trace_data_builder): if not self._is_tracing_controllable: return assert not trace_event.trace_is_enabled(), 'Stop tracing before collection.' with open(self._trace_log, 'r') as fp: data = ast.literal_eval(fp.read() + ']') trace_data_builder.AddEventsTo(trace_data_module.TELEMETRY_PART, data) try: os.remove(self._trace_log) self._trace_log = None except OSError: logging.exception('Error when deleting %s, will try again at exit.', self._trace_log) def DeleteAtExit(path): os.remove(path) atexit_with_log.Register(DeleteAtExit, self._trace_log) self._trace_log = None
def CollectAgentTraceData(self, trace_data_builder): if not self._is_tracing_controllable: return assert not trace_event.trace_is_enabled( ), 'Stop tracing before collection.' with open(self._trace_log, 'r') as fp: data = ast.literal_eval(fp.read() + ']') trace_data_builder.AddEventsTo(trace_data_module.TELEMETRY_PART, data) try: os.remove(self._trace_log) self._trace_log = None except OSError: logging.exception( 'Error when deleting %s, will try again at exit.', self._trace_log) def DeleteAtExit(path): os.remove(path) atexit_with_log.Register(DeleteAtExit, self._trace_log) self._trace_log = None
def StopAgentTracing(self): if not self._is_tracing_controllable: return assert trace_event.trace_is_enabled(), 'Tracing not running' trace_event.trace_disable() assert not trace_event.trace_is_enabled(), 'Tracing didnt disable properly.'
def IsAgentEnabled(): """Returns True if the agent is currently enabled and tracing.""" return trace_event.trace_is_enabled()
def testIsEnabledTrue(self): with self._test_trace(): self.assertTrue(trace_event.trace_is_enabled())
def testIsEnabledFalse(self): self.assertFalse(trace_event.trace_is_enabled())
def EnableTracing(self): if trace_event.trace_is_enabled(): logging.warning('Tracing is already running.') else: trace_event.trace_enable(self._trace_output)
def DisableTracing(): if not trace_event.trace_is_enabled(): logging.warning('Tracing is not running.') else: trace_event.trace_disable()
def is_tracing(self): return trace_event.trace_is_enabled()