Browse Source

[4088] strings, options and equal tokens are now instantiated

Tomek Mrugalski 9 years ago
parent
commit
d6b6b10784

+ 0 - 2
src/lib/eval/eval_context.cc

@@ -6,8 +6,6 @@
 EvalContext::EvalContext()
 EvalContext::EvalContext()
   : trace_scanning (false), trace_parsing (false)
   : trace_scanning (false), trace_parsing (false)
 {
 {
-  variables["one"] = 1;
-  variables["two"] = 2;
 }
 }
 
 
 EvalContext::~EvalContext()
 EvalContext::~EvalContext()

+ 1 - 1
src/lib/eval/eval_context.h

@@ -18,7 +18,7 @@ public:
   EvalContext ();
   EvalContext ();
   virtual ~EvalContext ();
   virtual ~EvalContext ();
 
 
-  std::map<std::string, int> variables;
+  isc::dhcp::Expression expression;
 
 
   int result;
   int result;
 
 

+ 1 - 1
src/lib/eval/lexer.ll

@@ -35,7 +35,7 @@ blank [ \t]
 {blank}+   loc.step();
 {blank}+   loc.step();
 [\n]+      loc.lines(yyleng); loc.step();
 [\n]+      loc.lines(yyleng); loc.step();
 
 
-\"[a-zA-Z_0-9]*\" {
+\'[a-zA-Z_0-9]*\' {
     // This is a string, no need to do any conversions here.
     // This is a string, no need to do any conversions here.
     return isc::eval::EvalParser::make_STRING(yytext, loc);
     return isc::eval::EvalParser::make_STRING(yytext, loc);
 }
 }

+ 14 - 3
src/lib/eval/parser.yy

@@ -11,6 +11,8 @@
 #include <string>
 #include <string>
 #include <eval/token.h>
 #include <eval/token.h>
 class EvalContext;
 class EvalContext;
+
+using namespace isc::dhcp;
 }
 }
 // The parsing context.
 // The parsing context.
 %param { EvalContext& ctx }
 %param { EvalContext& ctx }
@@ -45,12 +47,21 @@ class EvalContext;
 
 
 // Expression can either be a single token or a (something == something) expression
 // Expression can either be a single token or a (something == something) expression
 expression:
 expression:
-token EQUAL token
+token EQUAL token {
+    TokenPtr eq(new TokenEqual());
+    ctx.expression.push_back(eq);
+}
 | token;
 | token;
 
 
 token:
 token:
-STRING { /* push back TokenString */ }
-| OPTION { /* push back TokenOption */ }
+STRING {
+    TokenPtr str(new TokenString($1));
+    ctx.expression.push_back(str);
+}
+| OPTION {
+    TokenPtr opt(new TokenOption($1));
+    ctx.expression.push_back(opt);
+}
 | SUBSTRING "(" token "," token "," token ")" {
 | SUBSTRING "(" token "," token "," token ")" {
     /* push back TokenSubstring */
     /* push back TokenSubstring */
   }
   }

+ 56 - 2
src/lib/eval/tests/context_unittest.cc

@@ -15,6 +15,8 @@
 #include <config.h>
 #include <config.h>
 #include <eval/token.h>
 #include <eval/token.h>
 #include <eval/eval_context.h>
 #include <eval/eval_context.h>
+#include <eval/token.h>
+#include <dhcp/pkt4.h>
 
 
 #include <boost/shared_ptr.hpp>
 #include <boost/shared_ptr.hpp>
 #include <boost/scoped_ptr.hpp>
 #include <boost/scoped_ptr.hpp>
@@ -25,12 +27,64 @@ using namespace isc::dhcp;
 
 
 namespace {
 namespace {
 
 
-TEST(EvalContextTest, basic) {
+class EvalContextTest : public ::testing::Test {
+public:
+    void checkStringToken(const TokenPtr& token, const std::string& expected) {
+        ASSERT_TRUE(token);
+        boost::shared_ptr<TokenString> str = boost::dynamic_pointer_cast<TokenString>(token);
+        ASSERT_TRUE(str);
+
+        Pkt4Ptr pkt4(new Pkt4(DHCPDISCOVER, 12345));
+        ValueStack values;
+
+        EXPECT_NO_THROW(token->evaluate(*pkt4, values));
+
+        ASSERT_EQ(1, values.size());
+
+        EXPECT_EQ(expected, values.top());
+    }
+
+    void checkEqToken(const TokenPtr& token) {
+        ASSERT_TRUE(token);
+        boost::shared_ptr<TokenEqual> eq = boost::dynamic_pointer_cast<TokenEqual>(token);
+        EXPECT_TRUE(eq);
+    }
+
+};
+
+TEST_F(EvalContextTest, basic) {
 
 
     EvalContext tmp;
     EvalContext tmp;
 
 
-    EXPECT_NO_THROW(tmp.parseString("option[123] == \"MSFT\""));
+    EXPECT_NO_THROW(tmp.parseString("option[123] == 'MSFT'"));
+}
+
+TEST_F(EvalContextTest, string) {
+    EvalContext eval;
+
+    EXPECT_NO_THROW(eval.parseString("'foo'"));
+
+    ASSERT_EQ(1, eval.expression.size());
+
+    TokenPtr tmp = eval.expression.at(0);
+
+    checkStringToken(tmp, "foo");
 }
 }
 
 
+TEST_F(EvalContextTest, equal) {
+    EvalContext eval;
+
+    EXPECT_NO_THROW(eval.parseString("'foo' == 'bar'"));
+
+    ASSERT_EQ(3, eval.expression.size());
+
+    TokenPtr tmp1 = eval.expression.at(0);
+    TokenPtr tmp2 = eval.expression.at(1);
+    TokenPtr tmp3 = eval.expression.at(2);
+
+    checkStringToken(tmp1, "foo");
+    checkStringToken(tmp2, "bar");
+    checkEqToken(tmp3);
+}
 
 
 };
 };