#!/usr/bin/env python3
# Copyright 2020 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 monitor_pgo_profiles."""

import datetime
import subprocess
import unittest
import unittest.mock

import monitor_pgo_profiles


class Test(unittest.TestCase):
  """Tests for monitor_pgo_profiles."""
  def test_compose_complaint_with_zero_out_of_date(self):
    self.assertIsNone(monitor_pgo_profiles.compose_complaint([]))

  def test_compose_complaint_with_one_out_of_date(self):
    profdata_info = monitor_pgo_profiles.ProfdataInfo(
        date=datetime.datetime(2020, 1, 2, 3, 4, 5),
        location='gs://somewhere',
    )
    result = monitor_pgo_profiles.compose_complaint([
        ('some_arch', profdata_info),
    ])
    self.assertEqual(
        result,
        '\n'.join((
            '1 profile is out of date:',
            f'- some_arch (most recent profile was from {profdata_info.date} '
            f'at {profdata_info.location!r})',
            '',
            '',
            'PTAL to see if the llvm-pgo-generate bots are functioning '
            'normally. Their status can be found at '
            f'{monitor_pgo_profiles.PGO_BUILDBOT_LINK}.',
        )),
    )

  def test_compose_complaint_with_two_out_of_date(self):
    profdata_info_1 = monitor_pgo_profiles.ProfdataInfo(
        date=datetime.datetime(2020, 1, 2, 3, 4, 5),
        location='gs://somewhere',
    )
    profdata_info_2 = monitor_pgo_profiles.ProfdataInfo(
        date=datetime.datetime(2020, 3, 2, 1, 4, 5),
        location='gs://somewhere-else',
    )
    result = monitor_pgo_profiles.compose_complaint([
        ('some_arch', profdata_info_1),
        ('some_other_arch', profdata_info_2),
    ])
    self.assertEqual(
        result,
        '\n'.join((
            '2 profiles are out of date:',
            f'- some_arch (most recent profile was from {profdata_info_1.date} '
            f'at {profdata_info_1.location!r})',
            f'- some_other_arch (most recent profile was from '
            f'{profdata_info_2.date} at {profdata_info_2.location!r})',
            '',
            '',
            'PTAL to see if the llvm-pgo-generate bots are functioning '
            'normally. Their status can be found at '
            f'{monitor_pgo_profiles.PGO_BUILDBOT_LINK}.',
        )),
    )

  @unittest.mock.patch.object(subprocess, 'run')
  def test_fetching_profdata_functions(self, subprocess_run_mock):
    ls_return_value = unittest.mock.MagicMock()
    ls_return_value.stdout = '\n'.join((
        '  1234 2020-06-26T05:26:40Z gs://bar',
        '    44 2020-06-23T05:26:40Z gs://foo',
        '  1234 2020-06-25T05:26:40Z gs://zzz',
    ))
    subprocess_run_mock.return_value = ls_return_value

    most_recent = monitor_pgo_profiles.fetch_most_recent_profdata('arm')
    self.assertEqual(
        most_recent,
        monitor_pgo_profiles.ProfdataInfo(
            date=datetime.datetime(2020, 6, 26, 5, 26, 40),
            location='gs://bar',
        ))


if __name__ == '__main__':
  unittest.main()
