# Copyright 2019 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Tests for the utils/metrics library."""

import os
from unittest import mock

from chromite.lib import cros_test_lib
from chromite.utils import metrics


class MetricsTest(cros_test_lib.TestCase):
  """Test the utils/Metrics library."""

  def testEndToEnd(self):
    """Test the normal usage pattern, end-to-end."""
    # We should start in a clean, unmeasured state.
    self.assertFalse(os.environ.get(metrics.UTILS_METRICS_LOG_ENVVAR))

    with mock.patch('chromite.utils.metrics.current_milli_time') as mock_time:
      mock_time.side_effect = [128000, 256000, 512300]

      events = []
      # Create a fake usage site of the metrics.
      @metrics.collect_metrics
      def measure_things():
        # Now, in here, we should have set up this env-var. This is a bit of
        # invasive white-box testing for sanity purposes.
        self.assertTrue(os.environ.get(metrics.UTILS_METRICS_LOG_ENVVAR))

        # Now, with our pretend timer, let's record some events.
        with metrics.timer('test.timer'):
          metrics.event('test.named_event')

        for event in metrics.read_metrics_events():
          events.append(event)

      # Run the fake scenario.
      measure_things()

      self.assertEqual(len(events), 3)
      self.assertEqual(events[0].timestamp_epoch_millis, 128000)
      self.assertEqual(events[0].op, metrics.OP_START_TIMER)
      self.assertEqual(events[0].name, 'test.timer')

      self.assertEqual(events[1].timestamp_epoch_millis, 256000)
      self.assertEqual(events[1].op, metrics.OP_NAMED_EVENT)
      self.assertEqual(events[1].name, 'test.named_event')

      self.assertEqual(events[2].timestamp_epoch_millis, 512300)
      self.assertEqual(events[2].op, metrics.OP_STOP_TIMER)
      self.assertEqual(events[2].name, 'test.timer')
