# -*- coding: utf-8 -*-
# Copyright 2017 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.

"""Unit tests for puppet_metrics."""

# pylint: disable=protected-access

from __future__ import absolute_import
from __future__ import print_function

import io
import os
import sys

import mock

from chromite.lib import cros_test_lib
from chromite.scripts.sysmon import puppet_metrics


assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'


_SUMMARY = u"""\
---
  version:
    config: 1499979608
    puppet: "3.4.3"
  resources:
    changed: 7
    failed: 0
    failed_to_restart: 0
    out_of_sync: 7
    restarted: 0
    scheduled: 0
    skipped: 1
    total: 218
  time:
    config_retrieval: 2.862796974
    cron: 0.004638468
    exec: 11.494792536
    file: 0.618018423
    file_line: 0.003589435
    filebucket: 0.000341392
    group: 0.017957332
    ini_subsetting: 0.001235189
    mount: 0.001416499
    package: 4.315027644000001
    schedule: 0.001541641
    service: 10.242378408
    total: 52.958788377
    user: 0.001673407
    vcsrepo: 23.393381029
    last_run: 1499979671
  changes:
    total: 7
  events:
    failure: 0
    success: 7
    total: 7%
"""


class TestPuppetRunSummary(cros_test_lib.TestCase):
  """Tests for _PuppetRunSummary."""

  def test_config_version(self):
    summary = puppet_metrics._PuppetRunSummary(io.StringIO(_SUMMARY))
    self.assertEqual(summary.config_version, 1499979608)

  def test_puppet_version(self):
    summary = puppet_metrics._PuppetRunSummary(io.StringIO(_SUMMARY))
    self.assertEqual(summary.puppet_version, '3.4.3')

  def test_events(self):
    summary = puppet_metrics._PuppetRunSummary(io.StringIO(_SUMMARY))
    self.assertEqual(summary.events, {
        'failure': 0,
        'success': 7
    })

  def test_resources(self):
    summary = puppet_metrics._PuppetRunSummary(io.StringIO(_SUMMARY))
    self.assertEqual(summary.resources, {
        'changed': 7,
        'failed': 0,
        'failed_to_restart': 0,
        'out_of_sync': 7,
        'restarted': 0,
        'scheduled': 0,
        'skipped': 1,
        'other': 203,
    })

  def test_times(self):
    summary = puppet_metrics._PuppetRunSummary(io.StringIO(_SUMMARY))
    self.assertEqual(summary.times, {
        'config_retrieval': 2.862796974,
        'cron': 0.004638468,
        'exec': 11.494792536,
        'file': 0.618018423,
        'file_line': 0.003589435,
        'filebucket': 0.000341392,
        'group': 0.017957332,
        'ini_subsetting': 0.001235189,
        'mount': 0.001416499,
        'other': 0,
        'package': 4.315027644000001,
        'schedule': 0.001541641,
        'service': 10.242378408,
        'user': 0.001673407,
        'vcsrepo': 23.393381029,
    })

  def test_last_run_time(self):
    summary = puppet_metrics._PuppetRunSummary(io.StringIO(_SUMMARY))
    self.assertEqual(summary.last_run_time, 1499979671)


class TestPuppetMetrics(cros_test_lib.TempDirTestCase):
  """Tests for puppet_metrics."""

  def setUp(self):
    patcher = mock.patch('infra_libs.ts_mon.common.interface.state.store',
                         autospec=True)
    self.store = patcher.start()
    self.addCleanup(patcher.stop)
    self.tempfile = os.path.join(self.tempdir, 'last_run_summary.yaml')

  def test_collect(self):
    with open(self.tempfile, 'w') as f:
      f.write(_SUMMARY)
    with mock.patch('time.time', return_value=1500000000):
      with mock.patch.object(puppet_metrics, 'LAST_RUN_FILE', self.tempfile):
        puppet_metrics.collect_puppet_summary()

    setter = self.store.set
    calls = [
        mock.call('puppet/version/config', (), None,
                  1499979608, enforce_ge=mock.ANY),
        mock.call('puppet/version/puppet', (), None,
                  '3.4.3', enforce_ge=mock.ANY),
        mock.call('puppet/events', ('failure',), None,
                  0, enforce_ge=mock.ANY),
        mock.call('puppet/events', ('success',), None,
                  7, enforce_ge=mock.ANY),
        mock.call('puppet/resources', ('scheduled',), None,
                  0, enforce_ge=mock.ANY),
        mock.call('puppet/resources', ('skipped',), None,
                  1, enforce_ge=mock.ANY),
        mock.call('puppet/resources', ('restarted',), None,
                  0, enforce_ge=mock.ANY),
        mock.call('puppet/resources', ('changed',), None,
                  7, enforce_ge=mock.ANY),
        mock.call('puppet/resources', ('failed',), None,
                  0, enforce_ge=mock.ANY),
        mock.call('puppet/resources', ('other',), None,
                  203, enforce_ge=mock.ANY),
        mock.call('puppet/resources', ('failed_to_restart',), None,
                  0, enforce_ge=mock.ANY),
        mock.call('puppet/resources', ('out_of_sync',), None,
                  7, enforce_ge=mock.ANY),
        mock.call('puppet/times', ('vcsrepo',), None,
                  23.393381029, enforce_ge=mock.ANY),
        mock.call('puppet/times', ('exec',), None,
                  11.494792536, enforce_ge=mock.ANY),
        mock.call('puppet/times', ('cron',), None,
                  0.004638468, enforce_ge=mock.ANY),
        mock.call('puppet/times', ('file_line',), None,
                  0.003589435, enforce_ge=mock.ANY),
        mock.call('puppet/times', ('config_retrieval',), None,
                  2.862796974, enforce_ge=mock.ANY),
        mock.call('puppet/times', ('user',), None,
                  0.001673407, enforce_ge=mock.ANY),
        mock.call('puppet/times', ('file',), None,
                  0.618018423, enforce_ge=mock.ANY),
        mock.call('puppet/times', ('group',), None,
                  0.017957332, enforce_ge=mock.ANY),
        mock.call('puppet/times', ('service',), None,
                  10.242378408, enforce_ge=mock.ANY),
        mock.call('puppet/times', ('package',), None,
                  4.315027644000001, enforce_ge=mock.ANY),
        mock.call('puppet/times', ('mount',), None,
                  0.001416499, enforce_ge=mock.ANY),
        mock.call('puppet/times', ('schedule',), None,
                  0.001541641, enforce_ge=mock.ANY),
        mock.call('puppet/times', ('other',), None,
                  0.0, enforce_ge=mock.ANY),
        mock.call('puppet/times', ('ini_subsetting',), None,
                  0.001235189, enforce_ge=mock.ANY),
        mock.call('puppet/times', ('filebucket',), None,
                  0.000341392, enforce_ge=mock.ANY),
        mock.call('puppet/age', (), None,
                  20329.0, enforce_ge=mock.ANY),
    ]
    setter.assert_has_calls(calls, any_order=True)
    self.assertEqual(len(setter.mock_calls), len(calls))
