]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[4093] Support for option[123].hex operator.
authorMarcin Siodelski <marcin@isc.org>
Thu, 19 Nov 2015 14:58:16 +0000 (15:58 +0100)
committerMarcin Siodelski <marcin@isc.org>
Thu, 19 Nov 2015 14:59:32 +0000 (15:59 +0100)
src/lib/eval/parser.yy
src/lib/eval/tests/context_unittest.cc
src/lib/eval/tests/evaluate_unittest.cc

index 25ee8ed9f5ebf8f6130cb056c9b2905ab33de282..0e7e5d85b7e729126ddb13f355085f1492d24d0b 100644 (file)
@@ -123,6 +123,12 @@ string_expr : STRING
                       TokenPtr opt(new TokenOption(numeric_code, TokenOption::TEXTUAL));
                       ctx.expression.push_back(opt);
                   }
+            | OPTION "[" INTEGER "]" DOTHEX
+                  {
+                      uint16_t numeric_code = convert_option_code($3, @3, ctx);
+                      TokenPtr opt(new TokenOption(numeric_code, TokenOption::HEXADECIMAL));
+                      ctx.expression.push_back(opt);
+                  }
             | SUBSTRING "(" string_expr "," start_expr "," length_expr ")"
                   {
                       TokenPtr sub(new TokenSubstring());
index 01f61ff2058529379b7d5201cabc3f3fb1b33542..af5c3f6d0b66280140733f73a5f20a125a5e9eed 100644 (file)
@@ -209,6 +209,16 @@ TEST_F(EvalContextTest, option) {
     checkTokenOption(eval.expression.at(0), 123);
 }
 
+// Test parsing of an option represented as hexadecimal string.
+TEST_F(EvalContextTest, optionHex) {
+    EvalContext eval;
+
+    EXPECT_NO_THROW(parsed_ = eval.parseString("option[123].hex == 0x666F6F"));
+    EXPECT_TRUE(parsed_);
+    ASSERT_EQ(3, eval.expression.size());
+    checkTokenOption(eval.expression.at(0), 123);
+}
+
 // Test the parsing of a substring expression
 TEST_F(EvalContextTest, substring) {
     EvalContext eval;
index 49e7148251470008e11b97cd57d732cba4967d58..7aa1f78c9a61aae095549512456d3b628f4dd565 100644 (file)
@@ -209,6 +209,25 @@ TEST_F(EvaluateTest, packet) {
     EXPECT_FALSE(result_);
 }
 
+// A test which compares option value represented in hexadecimal format.
+TEST_F(EvaluateTest, optionHex) {
+    TokenPtr toption;
+    TokenPtr tstring;
+    TokenPtr tequal;
+
+    ASSERT_NO_THROW(toption.reset(new TokenOption(100, TokenOption::HEXADECIMAL)));
+    e_.push_back(toption);
+    ASSERT_NO_THROW(tstring.reset(new TokenString("0x68756E6472656434")));
+    e_.push_back(tstring);
+    ASSERT_NO_THROW(tequal.reset(new TokenEqual()));
+    e_.push_back(tequal);
+
+    ASSERT_NO_THROW(result_ = evaluate(e_, *pkt4_));
+    EXPECT_TRUE(result_);
+    ASSERT_NO_THROW(result_ = evaluate(e_, *pkt6_));
+    EXPECT_FALSE(result_);
+}
+
 // A test using substring on an option.
 TEST_F(EvaluateTest, complex) {
     TokenPtr toption;