| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2015 The Swarming Authors. All rights reserved. | 2 # Copyright 2015 The Swarming Authors. All rights reserved. |
| 3 # Use of this source code is governed by the Apache v2.0 license that can be | 3 # Use of this source code is governed by the Apache v2.0 license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 import logging | 6 import logging |
| 7 import re | 7 import re |
| 8 import sys | 8 import sys |
| 9 import unittest | 9 import unittest |
| 10 import yaml | 10 import yaml |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 self.assertEqual(validating_func.call_count, 1) | 37 self.assertEqual(validating_func.call_count, 1) |
| 38 | 38 |
| 39 validating_func.side_effect = lambda cfg, ctx: ctx.error('bad') | 39 validating_func.side_effect = lambda cfg, ctx: ctx.error('bad') |
| 40 with self.assertRaises(ValueError): | 40 with self.assertRaises(ValueError): |
| 41 self.rule_set.validate('projects/foo', 'bar.cfg', 'param: "valid config"') | 41 self.rule_set.validate('projects/foo', 'bar.cfg', 'param: "valid config"') |
| 42 | 42 |
| 43 # Different config_set/path | 43 # Different config_set/path |
| 44 self.rule_set.validate('projects/foo', 'baz.cfg', 'wrong') | 44 self.rule_set.validate('projects/foo', 'baz.cfg', 'wrong') |
| 45 self.rule_set.validate('projects/baz', 'bar.cfg', 'wrong') | 45 self.rule_set.validate('projects/baz', 'bar.cfg', 'wrong') |
| 46 | 46 |
| 47 def test_patterns(self): |
| 48 validation.rule( |
| 49 'projects/foo', 'bar.cfg', test_config_pb2.Config, |
| 50 rule_set=self.rule_set) |
| 51 validation.rule( |
| 52 'services/foo', 'foo.cfg', test_config_pb2.Config, |
| 53 rule_set=self.rule_set) |
| 54 validation.rule( |
| 55 'services/foo', 'foo.cfg', test_config_pb2.Config, |
| 56 rule_set=self.rule_set) |
| 57 self.assertEqual( |
| 58 self.rule_set.patterns(), |
| 59 { |
| 60 validation.ConfigPattern('projects/foo', 'bar.cfg'), |
| 61 validation.ConfigPattern('services/foo', 'foo.cfg'), |
| 62 validation.ConfigPattern('services/foo', 'foo.cfg'), |
| 63 } |
| 64 ) |
| 65 |
| 47 def test_context_metadata(self): | 66 def test_context_metadata(self): |
| 48 ctx = validation.Context() | 67 ctx = validation.Context() |
| 49 | 68 |
| 50 ctx.config_set = 'services/foo' | 69 ctx.config_set = 'services/foo' |
| 51 self.assertEqual(ctx.service_id, 'foo') | 70 self.assertEqual(ctx.service_id, 'foo') |
| 52 self.assertEqual(ctx.project_id, None) | 71 self.assertEqual(ctx.project_id, None) |
| 53 self.assertEqual(ctx.ref, None) | 72 self.assertEqual(ctx.ref, None) |
| 54 | 73 |
| 55 ctx.config_set = 'projects/foo' | 74 ctx.config_set = 'projects/foo' |
| 56 self.assertEqual(ctx.service_id, None) | 75 self.assertEqual(ctx.service_id, None) |
| 57 self.assertEqual(ctx.project_id, 'foo') | 76 self.assertEqual(ctx.project_id, 'foo') |
| 58 self.assertEqual(ctx.ref, None) | 77 self.assertEqual(ctx.ref, None) |
| 59 | 78 |
| 60 ctx.config_set = 'projects/foo/refs/a' | 79 ctx.config_set = 'projects/foo/refs/a' |
| 61 self.assertEqual(ctx.service_id, None) | 80 self.assertEqual(ctx.service_id, None) |
| 62 self.assertEqual(ctx.project_id, 'foo') | 81 self.assertEqual(ctx.project_id, 'foo') |
| 63 self.assertEqual(ctx.ref, 'refs/a') | 82 self.assertEqual(ctx.ref, 'refs/a') |
| 64 | 83 |
| 65 def test_regex_pattern_and_no_dest_type(self): | 84 def test_regex_pattern_and_no_dest_type(self): |
| 66 rule = validation.rule( | 85 rule = validation.rule( |
| 67 config_set=re.compile('^projects/f[^/]+$').match, | 86 config_set='regex:projects/f[^/]+', |
| 68 path=lambda p: p.endswith('.yaml'), | 87 path='regex:.+.yaml', |
| 69 rule_set=self.rule_set) | 88 rule_set=self.rule_set) |
| 70 def validate_yaml(cfg, ctx): | 89 def validate_yaml(cfg, ctx): |
| 71 try: | 90 try: |
| 72 yaml.safe_load(cfg) | 91 yaml.safe_load(cfg) |
| 73 except Exception as ex: | 92 except Exception as ex: |
| 74 ctx.error(ex) | 93 ctx.error(ex) |
| 75 rule(validate_yaml) | 94 rule(validate_yaml) |
| 76 | 95 |
| 77 self.rule_set.validate('projects/foo', 'bar.cfg', '}{') | 96 self.rule_set.validate('projects/foo', 'bar.cfg', '}{') |
| 78 self.rule_set.validate('projects/bar', 'bar.yaml', '}{') | 97 self.rule_set.validate('projects/bar', 'bar.yaml', '}{') |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 rule = validation.rule( | 131 rule = validation.rule( |
| 113 'projects/foo', 'bar.cfg', test_config_pb2.Config, | 132 'projects/foo', 'bar.cfg', test_config_pb2.Config, |
| 114 rule_set=self.rule_set) | 133 rule_set=self.rule_set) |
| 115 | 134 |
| 116 with self.assertRaises(ValueError): | 135 with self.assertRaises(ValueError): |
| 117 self.rule_set.validate('projects/foo', 'bar.cfg', 'invalid config') | 136 self.rule_set.validate('projects/foo', 'bar.cfg', 'invalid config') |
| 118 | 137 |
| 119 rule.remove() | 138 rule.remove() |
| 120 self.rule_set.validate('projects/foo', 'bar.cfg', 'invalid config') | 139 self.rule_set.validate('projects/foo', 'bar.cfg', 'invalid config') |
| 121 | 140 |
| 141 def test_compile_pattern(self): |
| 142 self.assertTrue(validation.compile_pattern('abc')('abc')) |
| 143 self.assertTrue(validation.compile_pattern('text:abc')('abc')) |
| 144 self.assertFalse(validation.compile_pattern('text:abc')('abcd')) |
| 145 |
| 146 self.assertTrue(validation.compile_pattern('regex:abc')('abc')) |
| 147 self.assertTrue(validation.compile_pattern('regex:\w+')('abc')) |
| 148 self.assertTrue(validation.compile_pattern('regex:^(\w+)c$')('abc')) |
| 149 self.assertFalse(validation.compile_pattern('regex:\d+')('a123b')) |
| 150 |
| 122 | 151 |
| 123 if __name__ == '__main__': | 152 if __name__ == '__main__': |
| 124 if '-v' in sys.argv: | 153 if '-v' in sys.argv: |
| 125 unittest.TestCase.maxDiff = None | 154 unittest.TestCase.maxDiff = None |
| 126 unittest.main() | 155 unittest.main() |
| OLD | NEW |