Revision f8638e28 test/ganeti.qlang_unittest.py
b/test/ganeti.qlang_unittest.py | ||
---|---|---|
54 | 54 |
self.parser = qlang.BuildFilterParser() |
55 | 55 |
|
56 | 56 |
def _Test(self, filter_, expected, expect_filter=True): |
57 |
if expect_filter: |
|
58 |
self.assertTrue(qlang.MaybeFilter(filter_), |
|
59 |
msg="'%s' was not recognized as a filter" % filter_) |
|
60 |
else: |
|
61 |
self.assertFalse(qlang.MaybeFilter(filter_), |
|
62 |
msg=("'%s' should not be recognized as a filter" % |
|
63 |
filter_)) |
|
57 |
self.assertEqual(qlang.MakeFilter([filter_], not expect_filter), expected) |
|
64 | 58 |
self.assertEqual(qlang.ParseFilter(filter_, parser=self.parser), expected) |
65 | 59 |
|
66 | 60 |
def test(self): |
... | ... | |
182 | 176 |
self.fail("Invalid filter '%s' did not raise exception" % filter_) |
183 | 177 |
|
184 | 178 |
|
185 |
class TestMaybeFilter(unittest.TestCase): |
|
186 |
def test(self): |
|
187 |
self.assertTrue(qlang.MaybeFilter("")) |
|
188 |
self.assertTrue(qlang.MaybeFilter("foo/bar")) |
|
189 |
self.assertTrue(qlang.MaybeFilter("foo==bar")) |
|
190 |
|
|
191 |
for i in set("()!~" + string.whitespace) | qlang.FILTER_DETECTION_CHARS: |
|
192 |
self.assertTrue(qlang.MaybeFilter(i), |
|
193 |
msg="%r not recognized as filter" % i) |
|
194 |
|
|
195 |
self.assertFalse(qlang.MaybeFilter("node1")) |
|
196 |
self.assertFalse(qlang.MaybeFilter("n-o-d-e")) |
|
197 |
self.assertFalse(qlang.MaybeFilter("n_o_d_e")) |
|
198 |
self.assertFalse(qlang.MaybeFilter("node1.example.com")) |
|
199 |
self.assertFalse(qlang.MaybeFilter("node1.example.com.")) |
|
179 |
class TestMakeFilter(unittest.TestCase): |
|
180 |
def testNoNames(self): |
|
181 |
self.assertEqual(qlang.MakeFilter([], False), None) |
|
182 |
self.assertEqual(qlang.MakeFilter(None, False), None) |
|
183 |
|
|
184 |
def testPlainNames(self): |
|
185 |
self.assertEqual(qlang.MakeFilter(["web1", "web2"], False), |
|
186 |
[qlang.OP_OR, [qlang.OP_EQUAL, "name", "web1"], |
|
187 |
[qlang.OP_EQUAL, "name", "web2"]]) |
|
188 |
|
|
189 |
def testForcedFilter(self): |
|
190 |
for i in [None, [], ["1", "2"], ["", "", ""], ["a", "b", "c", "d"]]: |
|
191 |
self.assertRaises(errors.OpPrereqError, qlang.MakeFilter, i, True) |
|
192 |
|
|
193 |
# Glob pattern shouldn't parse as filter |
|
194 |
self.assertRaises(errors.QueryFilterParseError, |
|
195 |
qlang.MakeFilter, ["*.site"], True) |
|
196 |
|
|
197 |
# Plain name parses as boolean filter |
|
198 |
self.assertEqual(qlang.MakeFilter(["web1"], True), [qlang.OP_TRUE, "web1"]) |
|
199 |
|
|
200 |
def testFilter(self): |
|
201 |
self.assertEqual(qlang.MakeFilter(["foo/bar"], False), |
|
202 |
[qlang.OP_TRUE, "foo/bar"]) |
|
203 |
self.assertEqual(qlang.MakeFilter(["foo=='bar'"], False), |
|
204 |
[qlang.OP_EQUAL, "foo", "bar"]) |
|
205 |
self.assertEqual(qlang.MakeFilter(["field=*'*.site'"], False), |
|
206 |
[qlang.OP_REGEXP, "field", |
|
207 |
utils.DnsNameGlobPattern("*.site")]) |
|
208 |
|
|
209 |
# Plain name parses as name filter, not boolean |
|
210 |
for name in ["node1", "n-o-d-e", "n_o_d_e", "node1.example.com", |
|
211 |
"node1.example.com."]: |
|
212 |
self.assertEqual(qlang.MakeFilter([name], False), |
|
213 |
[qlang.OP_OR, [qlang.OP_EQUAL, "name", name]]) |
|
214 |
|
|
215 |
# Invalid filters |
|
216 |
for i in ["foo==bar", "foo+=1"]: |
|
217 |
self.assertRaises(errors.QueryFilterParseError, |
|
218 |
qlang.MakeFilter, [i], False) |
|
219 |
|
|
220 |
def testGlob(self): |
|
221 |
self.assertEqual(qlang.MakeFilter(["*.site"], False), |
|
222 |
[qlang.OP_OR, [qlang.OP_REGEXP, "name", |
|
223 |
utils.DnsNameGlobPattern("*.site")]]) |
|
224 |
self.assertEqual(qlang.MakeFilter(["web?.example"], False), |
|
225 |
[qlang.OP_OR, [qlang.OP_REGEXP, "name", |
|
226 |
utils.DnsNameGlobPattern("web?.example")]]) |
|
227 |
self.assertEqual(qlang.MakeFilter(["*.a", "*.b", "?.c"], False), |
|
228 |
[qlang.OP_OR, |
|
229 |
[qlang.OP_REGEXP, "name", |
|
230 |
utils.DnsNameGlobPattern("*.a")], |
|
231 |
[qlang.OP_REGEXP, "name", |
|
232 |
utils.DnsNameGlobPattern("*.b")], |
|
233 |
[qlang.OP_REGEXP, "name", |
|
234 |
utils.DnsNameGlobPattern("?.c")]]) |
|
200 | 235 |
|
201 | 236 |
|
202 | 237 |
if __name__ == "__main__": |
Also available in: Unified diff