1#!/usr/bin/python2
2
3# Copyright 2016 The Chromium OS Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7"""Unit tests for apache_access_log_metrics.py"""
8
9from __future__ import print_function
10
11import os
12import mock
13import re
14import subprocess
15import tempfile
16import unittest
17
18import apache_access_log_metrics
19
20
21SCRIPT_PATH = os.path.abspath(
22    os.path.join(os.path.dirname(__file__),
23                 'apache_access_log_metrics.py'))
24
25
26EXAMPLE_REQUEST_LINE = (
27    r'chromeos-server2.mtv.corp.google.com:80 100.108.96.5 - - '
28    r'[19/May/2017:11:47:03 -0700] '
29    r'"POST /afe/server/noauth/rpc/?method=foo HTTP/1.1\"" '
30    r'200 354 "-" "Python-urllib/2.7" 5'
31)
32
33
34class TestParsers(unittest.TestCase):
35    """Tests the parsing functions in apache_access_log_metrics."""
36
37    def testParseResponse(self):
38        """Tests that the regex matches the example log line."""
39        match = apache_access_log_metrics.ACCESS_MATCHER.match(
40            EXAMPLE_REQUEST_LINE)
41        self.assertTrue(match)
42
43        self.assertEqual(match.group('bytes_sent'), '354')
44        self.assertEqual(match.group('response_seconds'), '5')
45
46
47class TestEmitters(unittest.TestCase):
48    """Tests the emitter functions in apache_access_log_metrics."""
49
50    def testEmitResponse(self):
51        """Tests that the matcher function doesn't throw an Exception."""
52        match = apache_access_log_metrics.ACCESS_MATCHER.match(
53            EXAMPLE_REQUEST_LINE)
54        # Calling the emitter should not raise any exceptions (for example, by
55        # referencing regex match groups that don't exist.
56        with mock.patch.object(apache_access_log_metrics, 'metrics'):
57            apache_access_log_metrics.EmitRequestMetrics(match)
58
59
60class TestScript(unittest.TestCase):
61    """Tests the script end-to-end."""
62    def testApachAccessLogScriptWithMatchingLine(self):
63        """Try shelling out the the script with --debug-file.
64
65        Sending it a line which matches the first-line regex should result in
66        output from ACCESS_TIME_METRIC.
67        """
68        with tempfile.NamedTemporaryFile() as temp_file:
69            p = subprocess.Popen([SCRIPT_PATH,
70                                  '--debug-metrics-file', temp_file.name],
71                                 stdin=subprocess.PIPE, stdout=subprocess.PIPE)
72            p.communicate(EXAMPLE_REQUEST_LINE)
73
74            with open(temp_file.name) as fh:
75                contents = fh.read()
76
77            self.assertTrue(re.search(
78                apache_access_log_metrics.ACCESS_TIME_METRIC[1:] + r'\b',
79                contents))
80            self.assertTrue(re.search(
81                apache_access_log_metrics.ACCESS_BYTES_METRIC[1:] + r'\b',
82
83                contents))
84
85
86
87if __name__ == '__main__':
88  unittest.main()
89