• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2015 Google Inc. All Rights Reserved.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#      http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15"""Unit tests for rules_parser.  Usage: ./rules_parser_test.py"""
16
17import collections
18import logging
19from StringIO import StringIO
20import unittest
21
22import rules_parser
23
24
25class RuleParserTest(unittest.TestCase):
26
27  @classmethod
28  def setUpClass(cls):
29    if not logging.root.handlers:
30      logging.basicConfig(level=logging.DEBUG,  # Enable log_url stdout.
31                          format='%(asctime)s %(levelname)s %(message)s')
32
33  def testCall(self):
34    my_rules = rules_parser.Rules(StringIO(r'''
35        [{"comment": "ignore me"},
36         {"LogUrl": {"url": "example\\.com/ss.*"}},
37         {"LogUrl": {"url": "example\\.com/blah$"}}]'''))
38    log_url = my_rules.Find('log_url')
39    self.assertEquals(True, log_url(FakeRequest(full_path='/ss'), None))
40    self.assertEquals(True, log_url(FakeRequest(full_path='/ssxxxx'), None))
41    self.assertEquals(True, log_url(FakeRequest(full_path='/blah'), None))
42    self.assertEquals(None, log_url(FakeRequest(full_path='/blahxxx'), None))
43    self.assertEquals(None, log_url(FakeRequest(full_path='/'), None))
44
45  def testImport(self):
46    my_rules = rules_parser.Rules(StringIO(r'''
47        [{"rules.LogUrl": {"url": "example\\.com/ss.*"}}]'''))
48    self.assertTrue(my_rules.Contains('log_url'))
49
50  def testRaises(self):
51    input_pairs = [
52        'bad_json',
53        '123',
54        '{}',
55        '[42]',
56        '[{12:34}]',
57        '[{"a":"b","c":"d"}]',
58        '[{"bad+rule@name":{}}]',
59        '["unallowed.Path":{}]',
60        '["NoSuchRule":{}]',
61        '["LogUrl":"bad"]',
62        '["LogUrl":{}]',
63        '["LogUrl":{"url":123}]',
64        '["LogUrl":{"url":"", "bad_arg":123}]',
65    ]
66    for input_text in input_pairs:
67      self.assertRaises(Exception, rules_parser.Rules, StringIO(input_text))
68
69
70class FakeRequest(collections.namedtuple(
71    'FakeRequest', ('command', 'host', 'full_path', 'request_body',
72                    'headers', 'is_ssl'))):
73
74  def __new__(cls, command='GET', host='example.com', full_path='/',
75              request_body=None, headers=None, is_ssl=False):
76    return super(FakeRequest, cls).__new__(
77        cls, command, host, full_path, request_body, headers or {}, is_ssl)
78
79
80if __name__ == '__main__':
81  unittest.main()
82