tools/compile_seccomp_policy: Add support for parsing filter expressions
This change adds support for parsing filter expressions
Bug: chromium:856315
Test: ./tools/parser_unittest.py
Change-Id: I88d03a0f8e86e4b889bb9bf0ddd794ee6746f42e
diff --git a/tools/parser_unittest.py b/tools/parser_unittest.py
index d40ab42..381c59c 100755
--- a/tools/parser_unittest.py
+++ b/tools/parser_unittest.py
@@ -233,5 +233,55 @@
self.parser.parse_value(self._tokenize('0|'))
+class ParseFilterExpressionTests(unittest.TestCase):
+ """Tests for PolicyParser.parse_filter_expression."""
+
+ def setUp(self):
+ self.arch = ARCH_64
+ self.parser = parser.PolicyParser(self.arch)
+
+ def _tokenize(self, line):
+ # pylint: disable=protected-access
+ self.parser._parser_state.set_line(line)
+ return self.parser._parser_state.tokenize()
+
+ def test_parse_filter_expression(self):
+ """Accept valid filter expressions."""
+ self.assertEqual(
+ self.parser.parse_filter_expression(
+ self._tokenize(
+ 'arg0 in 0xffff || arg0 == PROT_EXEC && arg1 == PROT_WRITE'
+ )), [
+ [parser.Atom(0, 'in', 0xffff)],
+ [parser.Atom(0, '==', 4),
+ parser.Atom(1, '==', 2)],
+ ])
+
+ def test_parse_empty_filter_expression(self):
+ """Reject empty filter expressions."""
+ with self.assertRaisesRegex(parser.ParseException,
+ 'empty filter expression'):
+ self.parser.parse_filter_expression(
+ self._tokenize('arg0 in 0xffff ||'))
+
+ def test_parse_empty_clause(self):
+ """Reject empty clause."""
+ with self.assertRaisesRegex(parser.ParseException, 'empty clause'):
+ self.parser.parse_filter_expression(
+ self._tokenize('arg0 in 0xffff &&'))
+
+ def test_parse_invalid_argument(self):
+ """Reject invalid argument."""
+ with self.assertRaisesRegex(parser.ParseException, 'invalid argument'):
+ self.parser.parse_filter_expression(
+ self._tokenize('argX in 0xffff'))
+
+ def test_parse_invalid_operator(self):
+ """Reject invalid operator."""
+ with self.assertRaisesRegex(parser.ParseException, 'invalid operator'):
+ self.parser.parse_filter_expression(
+ self._tokenize('arg0 = 0xffff'))
+
+
if __name__ == '__main__':
unittest.main()