Files
sigma-rules/tests/kuery/test_evaluator.py
T
AbdelMoumene-Hadfi 15faf34a2f [eql2kql] fix wildcard bug (#1507)
* [eql2kql] fix wildcard bug
* add test for wildcards

Co-authored-by: Justin Ibarra <brokensound77@users.noreply.github.com>
Co-authored-by: Mika Ayenson <Mikaayenson@users.noreply.github.com>
2022-04-21 23:44:39 -04:00

125 lines
4.4 KiB
Python

# Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
# or more contributor license agreements. Licensed under the Elastic License
# 2.0; you may not use this file except in compliance with the Elastic License
# 2.0.
import unittest
import kql
class EvaluatorTests(unittest.TestCase):
document = {
"number": 1,
"boolean": True,
"ip": "192.168.16.3",
"string": "hello world",
"string_list": ["hello world", "example"],
"number_list": [1, 2, 3],
"boolean_list": [True, False],
"structured": [
{
"a": [
{"b": 1}
]
}
],
}
def evaluate(self, source_text, document=None):
if document is None:
document = self.document
evaluator = kql.get_evaluator(source_text, optimize=False)
return evaluator(document)
def test_single_value(self):
self.assertTrue(self.evaluate('number:1'))
self.assertTrue(self.evaluate('number:"1"'))
self.assertTrue(self.evaluate('boolean:true'))
self.assertTrue(self.evaluate('string:"hello world"'))
self.assertFalse(self.evaluate('number:0'))
self.assertFalse(self.evaluate('boolean:false'))
self.assertFalse(self.evaluate('string:"missing"'))
def test_list_value(self):
self.assertTrue(self.evaluate('number_list:1'))
self.assertTrue(self.evaluate('number_list:2'))
self.assertTrue(self.evaluate('number_list:3'))
self.assertTrue(self.evaluate('boolean_list:true'))
self.assertTrue(self.evaluate('boolean_list:false'))
self.assertTrue(self.evaluate('string_list:"hello world"'))
self.assertTrue(self.evaluate('string_list:example'))
self.assertFalse(self.evaluate('number_list:4'))
self.assertFalse(self.evaluate('string_list:"missing"'))
def test_and_values(self):
self.assertTrue(self.evaluate('number_list:(1 and 2)'))
self.assertTrue(self.evaluate('boolean_list:(false and true)'))
self.assertFalse(self.evaluate('string:("missing" and "hello world")'))
self.assertFalse(self.evaluate('number:(0 and 1)'))
self.assertFalse(self.evaluate('boolean:(false and true)'))
def test_not_value(self):
self.assertTrue(self.evaluate('number_list:1'))
self.assertFalse(self.evaluate('not number_list:1'))
self.assertFalse(self.evaluate('number_list:(not 1)'))
def test_or_values(self):
self.assertTrue(self.evaluate('number:(0 or 1)'))
self.assertTrue(self.evaluate('number:(1 or 2)'))
self.assertTrue(self.evaluate('boolean:(false or true)'))
self.assertTrue(self.evaluate('string:("missing" or "hello world")'))
self.assertFalse(self.evaluate('number:(0 or 3)'))
def test_and_expr(self):
self.assertTrue(self.evaluate('number:1 and boolean:true'))
self.assertFalse(self.evaluate('number:1 and boolean:false'))
def test_or_expr(self):
self.assertTrue(self.evaluate('number:1 or boolean:false'))
self.assertFalse(self.evaluate('number:0 or boolean:false'))
def test_range(self):
self.assertTrue(self.evaluate('number < 2'))
self.assertFalse(self.evaluate('number > 2'))
def test_cidr_match(self):
self.assertTrue(self.evaluate('ip:192.168.0.0/16'))
self.assertFalse(self.evaluate('ip:10.0.0.0/8'))
def test_quoted_wildcard(self):
self.assertFalse(self.evaluate("string:'*'"))
self.assertFalse(self.evaluate("string:'?'"))
def test_wildcard(self):
self.assertTrue(self.evaluate('string:hello*'))
self.assertTrue(self.evaluate('string:*world'))
self.assertFalse(self.evaluate('string:foobar*'))
def test_field_exists(self):
self.assertTrue(self.evaluate('number:*'))
self.assertTrue(self.evaluate('boolean:*'))
self.assertTrue(self.evaluate('ip:*'))
self.assertTrue(self.evaluate('string:*'))
self.assertTrue(self.evaluate('string_list:*'))
self.assertTrue(self.evaluate('number_list:*'))
self.assertTrue(self.evaluate('boolean_list:*'))
self.assertFalse(self.evaluate('a:*'))
def test_flattening(self):
self.assertTrue(self.evaluate("structured.a.b:*"))
self.assertTrue(self.evaluate("structured.a.b:1"))
self.assertFalse(self.evaluate("structured.a.b:2"))