def run(self): """run power collection thread. Query all |_ctrls| as much as possible during |_rate| interval before reporting the mean of those samples as one data point. Timestamp is taken at the end of |_rate| interval. """ while not self._stop_signal.is_set(): start = time.time() end = start + self._rate loop_end = end - self.BUFFER temp_stats = stats_manager.StatsManager() while start < loop_end: # Setting duration to _ as this PowerTracker does not need duration # to calculate for how long to sleep. sample_tuples, _ = self._sample_ctrls(self._ctrls) for domain, sample in sample_tuples: temp_stats.AddSample(domain, sample) start = time.time() temp_stats.CalculateStats() temp_summary = temp_stats.GetSummary() samples = [(measurement, summary['mean']) for measurement, summary in temp_summary.items()] self._stats.AddSamples(samples) # Sleep until the end of the sample rate self._stop_signal.wait(max(0, end - time.time()))
def test_MakeUniqueFName(self): data = stats_manager.StatsManager() testfile = os.path.join(self.tempdir, 'testfile.txt') with open(testfile, 'w') as f: f.write('') expected_fname = os.path.join(self.tempdir, 'testfile0.txt') self.assertEqual(expected_fname, data._MakeUniqueFName(testfile))
def test_SaveSummaryJSONSMID(self): """SaveSummaryJSON uses the smid when creating output filename.""" identifier = 'ec' self.data = stats_manager.StatsManager(smid=identifier) self._populate_mock_stats() fname = os.path.basename(self.data.SaveSummaryJSON(self.tempdir)) self.assertTrue(fname.startswith(identifier))
def test_SummaryToStringTitle(self): """Title shows up in SummaryToString if title specified.""" title = 'titulo' data = stats_manager.StatsManager(title=title) self._populate_mock_stats() summary_str = data.SummaryToString() self.assertIn(title, summary_str)
def test_SaveRawDataSMID(self): """SaveRawData uses the smid when creating output filename.""" identifier = 'ec' self.data = stats_manager.StatsManager(smid=identifier) self._populate_mock_stats() files = self.data.SaveRawData(self.tempdir) for fname in files: self.assertTrue(os.path.basename(fname).startswith(identifier))
def test_SummaryToStringHideDomains(self): """Keys indicated in hide_domains are not printed in the summary.""" data = stats_manager.StatsManager(hide_domains=['A-domain']) data.AddSample('A-domain', 17) data.AddSample('B-domain', 17) data.CalculateStats() summary_str = data.SummaryToString() self.assertIn('B-domain', summary_str) self.assertNotIn('A-domain', summary_str)
def test_AddSampleNoFloatNotAcceptNaN(self): """Adding a non-number raises a StatsManagerError if accept_nan is False.""" self.data = stats_manager.StatsManager(accept_nan=False) with self.assertRaisesRegexp(stats_manager.StatsManagerError, 'accept_nan is false. Cannot add NaN sample.'): # adding a fake NaN: one that gets converted into NaN internally self.data.AddSample('Test', 'fiesta') with self.assertRaisesRegexp(stats_manager.StatsManagerError, 'accept_nan is false. Cannot add NaN sample.'): # adding a real NaN self.data.AddSample('Test', float('NaN'))
def test_SummaryToStringOrder(self): """Order passed into StatsManager is honoured when formatting summary.""" # StatsManager that should print D & B first, and the subsequent elements # are sorted. d_b_a_c_regexp = re.compile('D-domain.*B-domain.*A-domain.*C-domain', re.DOTALL) data = stats_manager.StatsManager(order=['D-domain', 'B-domain']) data.AddSample('A-domain', 17) data.AddSample('B-domain', 17) data.AddSample('C-domain', 17) data.AddSample('D-domain', 17) data.CalculateStats() summary_str = data.SummaryToString() self.assertRegexpMatches(summary_str, d_b_a_c_regexp)
def test_SummaryToStringNaNHelp(self): """NaN containing row gets tagged with *, help banner gets added.""" help_banner_exp = '%s %s' % (stats_manager.STATS_PREFIX, stats_manager.NAN_DESCRIPTION) nan_domain = 'A-domain' nan_domain_exp = '%s%s' % (nan_domain, stats_manager.NAN_TAG) # NaN helper banner is added when a NaN domain is found & domain gets tagged data = stats_manager.StatsManager() data.AddSample(nan_domain, float('NaN')) data.AddSample(nan_domain, 17) data.AddSample('B-domain', 17) data.CalculateStats() summarystr = data.SummaryToString() self.assertIn(help_banner_exp, summarystr) self.assertIn(nan_domain_exp, summarystr) # NaN helper banner is not added when no NaN domain output, no tagging data = stats_manager.StatsManager() # nan_domain in this scenario does not contain any NaN data.AddSample(nan_domain, 19) data.AddSample('B-domain', 17) data.CalculateStats() summarystr = data.SummaryToString() self.assertNotIn(help_banner_exp, summarystr) self.assertNotIn(nan_domain_exp, summarystr)
def setUp(self): """Set up StatsManager and create a temporary directory for test.""" self.tempdir = tempfile.mkdtemp() self.data = stats_manager.StatsManager()