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