#!/usr/bin/python2

# Copyright 2016 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 apache_access_log_metrics.py"""

from __future__ import print_function

import os
import mock
import re
import subprocess
import tempfile
import unittest

import apache_access_log_metrics


SCRIPT_PATH = os.path.abspath(
    os.path.join(os.path.dirname(__file__),
                 'apache_access_log_metrics.py'))


EXAMPLE_REQUEST_LINE = (
    r'chromeos-server2.mtv.corp.google.com:80 100.108.96.5 - - '
    r'[19/May/2017:11:47:03 -0700] '
    r'"POST /afe/server/noauth/rpc/ HTTP/1.1\"" '
    r'200 354 "-" "Python-urllib/2.7" 5'
)


class TestParsers(unittest.TestCase):
    """Tests the parsing functions in apache_access_log_metrics."""

    def testParseResponse(self):
        """Tests that the regex matches the example log line."""
        match = apache_access_log_metrics.ACCESS_MATCHER.match(
            EXAMPLE_REQUEST_LINE)
        self.assertTrue(match)

        self.assertEqual(match.group('bytes_sent'), '354')
        self.assertEqual(match.group('response_seconds'), '5')


class TestEmitters(unittest.TestCase):
    """Tests the emitter functions in apache_access_log_metrics."""

    def testEmitResponse(self):
        """Tests that the matcher function doesn't throw an Exception."""
        match = apache_access_log_metrics.ACCESS_MATCHER.match(
            EXAMPLE_REQUEST_LINE)
        # Calling the emitter should not raise any exceptions (for example, by
        # referencing regex match groups that don't exist.
        with mock.patch.object(apache_access_log_metrics, 'metrics'):
            apache_access_log_metrics.EmitRequestMetrics(match)


class TestScript(unittest.TestCase):
    """Tests the script end-to-end."""
    def testApachAccessLogScriptWithMatchingLine(self):
        """Try shelling out the the script with --debug-file.

        Sending it a line which matches the first-line regex should result in
        output from ACCESS_TIME_METRIC.
        """
        with tempfile.NamedTemporaryFile() as temp_file:
            p = subprocess.Popen([SCRIPT_PATH,
                                  '--debug-metrics-file', temp_file.name],
                                 stdin=subprocess.PIPE, stdout=subprocess.PIPE)
            p.communicate(EXAMPLE_REQUEST_LINE)

            with open(temp_file.name) as fh:
                contents = fh.read()

            self.assertTrue(re.search(
                apache_access_log_metrics.ACCESS_TIME_METRIC[1:] + r'\b',
                contents))
            self.assertTrue(re.search(
                apache_access_log_metrics.ACCESS_BYTES_METRIC[1:] + r'\b',

                contents))



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