mirror of
https://gitlab.isc.org/isc-projects/kea
synced 2025-09-01 22:45:18 +00:00
[4088] strings, options and equal tokens are now instantiated
This commit is contained in:
@@ -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()
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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 */ }
|
STRING {
|
||||||
| OPTION { /* push back TokenOption */ }
|
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 */
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user