Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Kea
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
426
Issues
426
List
Boards
Labels
Service Desk
Milestones
Merge Requests
67
Merge Requests
67
Operations
Operations
Incidents
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
ISC Open Source Projects
Kea
Commits
fab8be8e
Commit
fab8be8e
authored
Dec 06, 2016
by
Tomek Mrugalski
🛰
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[5036] Comments added, some constants removed.
parent
39919c3b
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
172 additions
and
97 deletions
+172
-97
src/bin/dhcp6/dhcp6_lexer.ll
src/bin/dhcp6/dhcp6_lexer.ll
+2
-3
src/bin/dhcp6/dhcp6_parser.yy
src/bin/dhcp6/dhcp6_parser.yy
+3
-6
src/bin/dhcp6/parser_context.cc
src/bin/dhcp6/parser_context.cc
+1
-1
src/bin/dhcp6/parser_context.h
src/bin/dhcp6/parser_context.h
+97
-28
src/bin/dhcp6/tests/dhcp6_test_utils.h
src/bin/dhcp6/tests/dhcp6_test_utils.h
+18
-8
src/bin/dhcp6/tests/parser_unittest.cc
src/bin/dhcp6/tests/parser_unittest.cc
+51
-51
No files found.
src/bin/dhcp6/dhcp6_lexer.ll
View file @
fab8be8e
...
...
@@ -102,10 +102,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
if
(
start_token_flag
)
{
start_token_flag
=
false
;
switch
(
start_token_value
)
{
case
Parser6Context:
:
SUB
PARSER_JSON:
case
Parser6Context:
:
PARSER_JSON:
default:
return
isc:
:
dhcp:
:
Dhcp6Parser:
:make_SUB_JSON
(
driver
.
loc_
)
;
//
return
isc:
:
dhcp:
:
Dhcp6Parser:
:make_TOPLEVEL_GENERIC_JSON
(
driver
.
loc_
)
;
return
isc:
:
dhcp:
:
Dhcp6Parser:
:make_TOPLEVEL_JSON
(
driver
.
loc_
)
;
case
Parser6Context:
:
PARSER_DHCP6:
return
isc:
:
dhcp:
:
Dhcp6Parser:
:make_TOPLEVEL_DHCP6
(
driver
.
loc_
)
;
case
Parser6Context:
:
SUBPARSER_DHCP6:
...
...
src/bin/dhcp6/dhcp6_parser.yy
View file @
fab8be8e
...
...
@@ -144,7 +144,7 @@ using namespace std;
// Not real tokens, just a way to signal what the parser is expected to
// parse.
TOPLEVEL_
GENERIC_
JSON
TOPLEVEL_JSON
TOPLEVEL_DHCP6
SUB_DHCP6
SUB_INTERFACES6
...
...
@@ -155,7 +155,6 @@ using namespace std;
SUB_OPTION_DEF
SUB_OPTION_DATA
SUB_HOOKS_LIBRARY
SUB_JSON
;
%token <std::string> STRING "constant string"
...
...
@@ -175,7 +174,7 @@ using namespace std;
// We made the same for subparsers at the exception of the JSON value.
%start start;
start: TOPLEVEL_
GENERIC_JSON { ctx.ctx_ = ctx.NO_KEYWORD; } map2
start: TOPLEVEL_
JSON { ctx.ctx_ = ctx.NO_KEYWORD; } sub_json
| TOPLEVEL_DHCP6 { ctx.ctx_ = ctx.CONFIG; } syntax_map
| SUB_DHCP6 { ctx.ctx_ = ctx.DHCP6; } sub_dhcp6
| SUB_INTERFACES6 { ctx.ctx_ = ctx.INTERFACES_CONFIG; } sub_interfaces6
...
...
@@ -186,7 +185,6 @@ start: TOPLEVEL_GENERIC_JSON { ctx.ctx_ = ctx.NO_KEYWORD; } map2
| SUB_OPTION_DEF { ctx.ctx_ = ctx.OPTION_DEF; } sub_option_def
| SUB_OPTION_DATA { ctx.ctx_ = ctx.OPTION_DATA; } sub_option_data
| SUB_HOOKS_LIBRARY { ctx.ctx_ = ctx.HOOKS_LIBRARIES; } sub_hooks_library
| SUB_JSON { ctx.ctx_ = ctx.NO_KEYWORD; } sub_json
;
// ---- generic JSON parser ---------------------------------
...
...
@@ -270,7 +268,7 @@ not_empty_list: value {
// Unknown keyword in a map
unknown_map_entry: STRING COLON {
const std::string& where = ctx.context
_n
ame();
const std::string& where = ctx.context
N
ame();
const std::string& keyword = $1;
error(@1,
"got unexpected keyword \"" + keyword + "\" in " + where + " map.");
...
...
@@ -279,7 +277,6 @@ unknown_map_entry: STRING COLON {
// This defines the top-level { } that holds Dhcp6, Dhcp4, DhcpDdns or Logging
// objects.
// ctx_ = CONFIG
syntax_map: LCURLY_BRACKET {
// This code is executed when we're about to start parsing
// the content of the map
...
...
src/bin/dhcp6/parser_context.cc
View file @
fab8be8e
...
...
@@ -114,7 +114,7 @@ Parser6Context::leave()
}
const
std
::
string
Parser6Context
::
context
_n
ame
()
Parser6Context
::
context
N
ame
()
{
switch
(
ctx_
)
{
case
NO_KEYWORD
:
...
...
src/bin/dhcp6/parser_context.h
View file @
fab8be8e
...
...
@@ -48,41 +48,40 @@ public:
/// is being told to start parsing as SUBPARSER_HOST_RESERVATION6.
typedef
enum
{
/// This parser will parse the content as generic JSON.
//PARSER_GENERIC
_JSON,
PARSER
_JSON
,
SUBPARSER_JSON
,
/// This parser will parse the content as Dhcp6 config wrapped in a map (that's
/// the regular config file)
/// This parser will parse the content as Dhcp6 config wrapped in a map
/// (that's the regular config file)
PARSER_DHCP6
,
/// This parser will parse the content of Dhcp6. It is mostly used
/// in unit-tests as most of the unit-tests do not define the outer
/// map and Dhcp6 entity, just the contents of it.
/// This parser will parse the content of Dhcp6 (without outer { } and
/// without "Dhcp6"). It is mostly used in unit-tests as most of the
/// unit-tests do not define the outer map and Dhcp6 entity, just the
/// contents of it.
SUBPARSER_DHCP6
,
/// This will parse the
conde
as Subnet6 content.
/// This will parse the
input
as Subnet6 content.
PARSER_SUBNET6
,
/// This
parser will parse
pool6 content.
/// This
will parse the input as
pool6 content.
PARSER_POOL6
,
/// This
parser will parse the
interfaces content.
/// This
will parse the input as
interfaces content.
PARSER_INTERFACES
,
/// This
parser will parse the content as pd-pool
.
/// This
will parse the input as pd-pool content
.
PARSER_PD_POOL
,
/// This
parser will parse the content as host-reservation
/// This
will parse the input as host-reservation.
PARSER_HOST_RESERVATION
,
/// This
parser will parse the conten
t as option definition.
/// This
will parse the inpu
t as option definition.
PARSER_OPTION_DEF
,
/// This
parser will parse the conten
t as option data.
/// This
will parse the inpu
t as option data.
PARSER_OPTION_DATA
,
/// This
parser will parse the content as hooks-library
/// This
will parse the input as hooks-library.
PARSER_HOOKS_LIBRARY
}
ParserType
;
...
...
@@ -109,13 +108,27 @@ public:
/// @brief Run the parser on the string specified.
///
/// This method parses specified string. Depending on the value of
/// parser_type, parser may either check only that the input is valid
/// JSON, or may do more specific syntax checking. See @ref ParserType
/// for supported syntax checkers.
///
/// @param str string to be parsed
/// @param parser_type specifies expected content (
either
DHCP6 or generic JSON)
/// @return
true on success
.
/// @param parser_type specifies expected content (
usually
DHCP6 or generic JSON)
/// @return
Element structure representing parsed text
.
isc
::
data
::
ConstElementPtr
parseString
(
const
std
::
string
&
str
,
ParserType
parser_type
);
/// @brief Run the parser on the file specified.
///
/// This method parses specified file. Depending on the value of
/// parser_type, parser may either check only that the input is valid
/// JSON, or may do more specific syntax checking. See @ref ParserType
/// for supported syntax checkers.
///
/// @param filename file to be parsed
/// @param parser_type specifies expected content (usually DHCP6 or generic JSON)
/// @return Element structure representing parsed text.
isc
::
data
::
ConstElementPtr
parseFile
(
const
std
::
string
&
filename
,
ParserType
parser_type
);
...
...
@@ -141,43 +154,86 @@ public:
///
/// Convert a bison location into an element position
/// (take the begin, the end is lost)
/// @brief loc location in bison format
/// @return Position in format accepted by Element
isc
::
data
::
Element
::
Position
loc2pos
(
isc
::
dhcp
::
location
&
loc
);
/// @brief Defines syntactic contexts for lexical tie-ins
typedef
enum
{
///
at toplevel
///
< This one is used in pure JSON mode.
NO_KEYWORD
,
///< Used while parsing top level (that contains Dhcp6, Logging and others)
CONFIG
,
/// in config
///< Used while parsing content of Dhcp6.
DHCP6
,
// not yet DHCP4,
// not yet DHCP_DDNS,
///< Used while parsing content of Logging
LOGGING
,
/// Dhcp6
/// Used while parsing Dhcp6/interfaces structures.
INTERFACES_CONFIG
,
LEASE_DATABASE
,
/// Used while parsing Dhcp6/hosts-database structures.
HOSTS_DATABASE
,
/// Used while parsing Dhcp6/lease-database structures.
LEASE_DATABASE
,
/// Used while parsing Dhcp6/mac-sources structures.
MAC_SOURCES
,
/// Used while parsing Dhcp6/host-reservation-identifiers.
HOST_RESERVATION_IDENTIFIERS
,
/// Used while parsing Dhcp6/hooks-libraries.
HOOKS_LIBRARIES
,
/// Used while parsing Dhcp6/Subnet6 structures.
SUBNET6
,
/// Used while parsing Dhcp6/option-def structures.
OPTION_DEF
,
/// Used while parsing Dhcp6/option-data, Dhcp6/subnet6/option-data
/// or anywhere option-data is present (client classes, host
/// reservations and possibly others).
OPTION_DATA
,
/// Used while parsing Dhcp6/client-classes structures.
CLIENT_CLASSES
,
/// Used while parsing Dhcp6/server-id structures.
SERVER_ID
,
/// Used while parsing Dhcp6/control-socket structures.
CONTROL_SOCKET
,
/// subnet6
/// Used while parsing Dhcp6/subnet6/pools structures.
POOLS
,
/// Used while parsing Dhcp6/subnet6/pd-pools structures.
PD_POOLS
,
/// Used while parsing Dhcp6/reservations structures.
RESERVATIONS
,
/// Used while parsing Dhcp6/subnet6/relay structures.
RELAY
,
/// client-classes
/// Used while parsing Dhcp6/client-classes structures.
CLIENT_CLASS
,
/// Logging
/// Used while parsing Logging/loggers structures.
LOGGERS
,
/// loggers
/// Used while parsing Logging/loggers/output_options structures.
OUTPUT_OPTIONS
}
ParserContext
;
}
ParserContext
;
/// @brief File name
std
::
string
file_
;
...
...
@@ -201,12 +257,24 @@ public:
FILE
*
sfile_
;
/// @brief sFile (aka FILE) stack
///
/// This is a stack of files. Typically there's only one file (the
/// one being currently parsed), but there may be more if one
/// file includes another.
std
::
vector
<
FILE
*>
sfiles_
;
/// @brief Current syntactic context
ParserContext
ctx_
;
/// @brief Enter a new syntactic context
///
/// Entering a nex syntactic context is useful in several ways.
/// First, it allows the parser to avoid conflicts. Second, it
/// allows the lexer to return different tokens depending on
/// context (e.g. if "renew-timer" string is detected, the lexer
/// will return STRING token if in JSON mode or RENEW_TIMER if
/// in DHCP6 mode. Finally, the stntactic context allows the
/// error message to be more descriptive.
void
enter
(
const
ParserContext
&
ctx
);
/// @brief Leave a syntactic context
...
...
@@ -214,7 +282,8 @@ public:
void
leave
();
/// @brief Get the syntactix context name
const
std
::
string
context_name
();
/// @return printable name of the context.
const
std
::
string
contextName
();
private:
/// @brief Flag determining scanner debugging.
...
...
src/bin/dhcp6/tests/dhcp6_test_utils.h
View file @
fab8be8e
...
...
@@ -639,15 +639,24 @@ public:
NakedDhcpv6Srv
srv_
;
};
// For parser testing (JSON map, no exception expected)
/// @brief Runs parser in JSON mode, useful for parser testing
///
/// @param in string to be parsed
/// @return ElementPtr structure representing parsed JSON
inline
isc
::
data
::
ConstElementPtr
parseJSON
(
const
std
::
string
&
in
)
{
isc
::
dhcp
::
Parser6Context
ctx
;
return
(
ctx
.
parseString
(
in
,
isc
::
dhcp
::
Parser6Context
::
SUB
PARSER_JSON
));
return
(
ctx
.
parseString
(
in
,
isc
::
dhcp
::
Parser6Context
::
PARSER_JSON
));
}
// For parser testing (DHCP6)
/// @brief Runs parser in Dhcp6 mode
///
/// This is a simplified Dhcp6 mode, so no outer { } and "Dhcp6" is
/// needed. This format is used by most of the tests.
///
/// @param in string to be parsed
/// @return ElementPtr structure representing parsed JSON
inline
isc
::
data
::
ConstElementPtr
parseDHCP6
(
const
std
::
string
&
in
)
{
...
...
@@ -656,14 +665,17 @@ parseDHCP6(const std::string& in)
return
(
ctx
.
parseString
(
in
,
isc
::
dhcp
::
Parser6Context
::
SUBPARSER_DHCP6
));
}
catch
(
const
std
::
exception
&
ex
)
{
#ifdef ENABLE_DEBUG
std
::
cout
<<
"EXCEPTION: "
<<
ex
.
what
()
<<
std
::
endl
;
#endif // ENABLE_DEBUG
throw
;
}
}
// For parser testing (OPTION_DEF)
/// @brief Runs parser in option definition mode
///
/// This function parses specified text as JSON that defines option definitions.
///
/// @param in string to be parsed
/// @return ElementPtr structure representing parsed JSON
inline
isc
::
data
::
ConstElementPtr
parseOPTION_DEF
(
const
std
::
string
&
in
)
{
...
...
@@ -672,9 +684,7 @@ parseOPTION_DEF(const std::string& in)
return
(
ctx
.
parseString
(
in
,
isc
::
dhcp
::
Parser6Context
::
PARSER_OPTION_DEF
));
}
catch
(
const
std
::
exception
&
ex
)
{
#ifdef ENABLE_DEBUG
std
::
cout
<<
"EXCEPTION: "
<<
ex
.
what
()
<<
std
::
endl
;
#endif // ENABLE_DEBUG
throw
;
}
}
...
...
src/bin/dhcp6/tests/parser_unittest.cc
View file @
fab8be8e
...
...
@@ -65,35 +65,35 @@ void testParser2(const std::string& txt, Parser6Context::ParserType parser_type)
TEST
(
ParserTest
,
mapInMap
)
{
string
txt
=
"{
\"
xyzzy
\"
: {
\"
foo
\"
: 123,
\"
baz
\"
: 456 } }"
;
testParser
(
txt
,
Parser6Context
::
SUB
PARSER_JSON
);
testParser
(
txt
,
Parser6Context
::
PARSER_JSON
);
}
TEST
(
ParserTest
,
listInList
)
{
string
txt
=
"[ [
\"
Britain
\"
,
\"
Wales
\"
,
\"
Scotland
\"
], "
"[
\"
Pomorze
\"
,
\"
Wielkopolska
\"
,
\"
Tatry
\"
] ]"
;
testParser
(
txt
,
Parser6Context
::
SUB
PARSER_JSON
);
testParser
(
txt
,
Parser6Context
::
PARSER_JSON
);
}
TEST
(
ParserTest
,
nestedMaps
)
{
string
txt
=
"{
\"
europe
\"
: {
\"
UK
\"
: {
\"
London
\"
: {
\"
street
\"
:
\"
221B Baker
\"
}}}}"
;
testParser
(
txt
,
Parser6Context
::
SUB
PARSER_JSON
);
testParser
(
txt
,
Parser6Context
::
PARSER_JSON
);
}
TEST
(
ParserTest
,
nestedLists
)
{
string
txt
=
"[
\"
half
\"
, [
\"
quarter
\"
, [
\"
eighth
\"
, [
\"
sixteenth
\"
]]]]"
;
testParser
(
txt
,
Parser6Context
::
SUB
PARSER_JSON
);
testParser
(
txt
,
Parser6Context
::
PARSER_JSON
);
}
TEST
(
ParserTest
,
listsInMaps
)
{
string
txt
=
"{
\"
constellations
\"
: {
\"
orion
\"
: [
\"
rigel
\"
,
\"
betelguese
\"
], "
"
\"
cygnus
\"
: [
\"
deneb
\"
,
\"
albireo
\"
] } }"
;
testParser
(
txt
,
Parser6Context
::
SUB
PARSER_JSON
);
testParser
(
txt
,
Parser6Context
::
PARSER_JSON
);
}
TEST
(
ParserTest
,
mapsInLists
)
{
string
txt
=
"[ {
\"
body
\"
:
\"
earth
\"
,
\"
gravity
\"
: 1.0 },"
" {
\"
body
\"
:
\"
mars
\"
,
\"
gravity
\"
: 0.376 } ]"
;
testParser
(
txt
,
Parser6Context
::
SUB
PARSER_JSON
);
testParser
(
txt
,
Parser6Context
::
PARSER_JSON
);
}
TEST
(
ParserTest
,
types
)
{
...
...
@@ -103,7 +103,7 @@ TEST(ParserTest, types) {
"
\"
map
\"
: {
\"
foo
\"
:
\"
bar
\"
},"
"
\"
list
\"
: [ 1, 2, 3 ],"
"
\"
null
\"
: null }"
;
testParser
(
txt
,
Parser6Context
::
SUB
PARSER_JSON
);
testParser
(
txt
,
Parser6Context
::
PARSER_JSON
);
}
TEST
(
ParserTest
,
keywordJSON
)
{
...
...
@@ -111,7 +111,7 @@ TEST(ParserTest, keywordJSON) {
"
\"
type
\"
:
\"
password
\"
,"
"
\"
user
\"
:
\"
name
\"
,"
"
\"
password
\"
:
\"
type
\"
}"
;
testParser
(
txt
,
Parser6Context
::
SUB
PARSER_JSON
);
testParser
(
txt
,
Parser6Context
::
PARSER_JSON
);
}
TEST
(
ParserTest
,
keywordDhcp6
)
{
...
...
@@ -267,142 +267,142 @@ void testError(const std::string& txt,
// Check errors
TEST
(
ParserTest
,
errors
)
{
// no input
testError
(
""
,
Parser6Context
::
SUB
PARSER_JSON
,
testError
(
""
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.1: syntax error, unexpected end of file"
);
testError
(
" "
,
Parser6Context
::
SUB
PARSER_JSON
,
testError
(
" "
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.2: syntax error, unexpected end of file"
);
testError
(
"
\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
testError
(
"
\n
"
,
Parser6Context
::
PARSER_JSON
,
"<string>:2.1: syntax error, unexpected end of file"
);
// comments
testError
(
"# nothing
\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:2.1: syntax error, unexpected end of file, "
"expecting {"
);
testError
(
" #
\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:2.1: syntax error, unexpected end of file, "
"expecting {"
);
testError
(
"// nothing
\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:2.1: syntax error, unexpected end of file, "
"expecting {"
);
testError
(
"/* nothing */
\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:2.1: syntax error, unexpected end of file, "
"expecting {"
);
testError
(
"/* no
\n
thing */
\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:3.1: syntax error, unexpected end of file, "
"expecting {"
);
testError
(
"/* no
\n
thing */
\n\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:4.1: syntax error, unexpected end of file, "
"expecting {"
);
testError
(
"/* nothing
\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"Comment not closed. (/* in line 1"
);
testError
(
"
\n\n\n
/* nothing
\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"Comment not closed. (/* in line 4"
);
testError
(
"{ /* */*/ }
\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.3-8: Invalid character: *"
);
testError
(
"{ /* // *// }
\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.3-11: Invalid character: /"
);
testError
(
"{ /* // */// }
\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:2.1: syntax error, unexpected end of file, "
"expecting }"
);
// includes
testError
(
"<?
\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"Directive not closed."
);
testError
(
"<?include
\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"Directive not closed."
);
string
file
=
string
(
CFG_EXAMPLES
)
+
"/"
+
"stateless.json"
;
testError
(
"<?include
\"
"
+
file
+
"
\"\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"Directive not closed."
);
testError
(
"<?include
\"
/foo/bar
\"
?>/n"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"Can't open include file /foo/bar"
);
// numbers
testError
(
"123"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.1-3: syntax error, unexpected integer, "
"expecting {"
);
testError
(
"-456"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.1-4: syntax error, unexpected integer, "
"expecting {"
);
testError
(
"-0001"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.1-5: syntax error, unexpected integer, "
"expecting {"
);
testError
(
"1234567890123456789012345678901234567890"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.1-40: Failed to convert "
"1234567890123456789012345678901234567890"
" to an integer."
);
testError
(
"-3.14e+0"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.1-8: syntax error, unexpected floating point, "
"expecting {"
);
testError
(
"1e50000"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.1-7: Failed to convert 1e50000 "
"to a floating point."
);
// strings
testError
(
"
\"
aabb
\"
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.1-6: syntax error, unexpected constant string, "
"expecting {"
);
testError
(
"{
\"
aabb
\"
err"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.9: Invalid character: e"
);
testError
(
"{ err
\"
aabb
\"
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.3: Invalid character: e"
);
testError
(
"
\"
a
\n\t
b
\"
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.1-6: Invalid control in
\"
a
\n\t
b
\"
"
);
testError
(
"
\"
a
\\
n
\\
tb
\"
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.1-8: syntax error, unexpected constant string, "
"expecting {"
);
testError
(
"
\"
a
\\
x01b
\"
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.1-8: Bad escape in
\"
a
\\
x01b
\"
"
);
testError
(
"
\"
a
\\
u0062
\"
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.1-9: Unsupported unicode escape in
\"
a
\\
u0062
\"
"
);
testError
(
"
\"
a
\\
u062z
\"
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.1-9: Bad escape in
\"
a
\\
u062z
\"
"
);
testError
(
"
\"
abc
\\\"
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.1-6: Overflow escape in
\"
abc
\\\"
"
);
// from data_unittest.c
testError
(
"
\\
a"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.1: Invalid character:
\\
"
);
testError
(
"
\\
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.1: Invalid character:
\\
"
);
testError
(
"
\\\"\\\"
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.1: Invalid character:
\\
"
);
// want a map
testError
(
"[]
\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.1: syntax error, unexpected [, "
"expecting {"
);
testError
(
"[]
\n
"
,
...
...
@@ -410,14 +410,14 @@ TEST(ParserTest, errors) {
"<string>:1.1: syntax error, unexpected [, "
"expecting {"
);
testError
(
"{ 123 }
\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.3-5: syntax error, unexpected integer, "
"expecting }"
);
testError
(
"{ 123 }
\n
"
,
Parser6Context
::
PARSER_DHCP6
,
"<string>:1.3-5: syntax error, unexpected integer"
);
testError
(
"{
\"
foo
\"
}
\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.9: syntax error, unexpected }, "
"expecting :"
);
testError
(
"{
\"
foo
\"
}
\n
"
,
...
...
@@ -436,21 +436,21 @@ TEST(ParserTest, errors) {
"<string>:2.1: syntax error, unexpected end of file, "
"expecting
\"
,
\"
or }"
);
testError
(
"{}{}
\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.3: syntax error, unexpected {, "
"expecting end of file"
);
// bad commas
testError
(
"{ , }
\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.3: syntax error, unexpected
\"
,
\"
, "
"expecting }"
);
testError
(
"{ ,
\"
foo
\"
:true }
\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.3: syntax error, unexpected
\"
,
\"
, "
"expecting }"
);
testError
(
"{
\"
foo
\"
:true, }
\n
"
,
Parser6Context
::
SUB
PARSER_JSON
,
Parser6Context
::
PARSER_JSON
,
"<string>:1.15: syntax error, unexpected }, "
"expecting constant string"
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment