Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
hiredis
Commits
45ed2729
Commit
45ed2729
authored
Jul 12, 2011
by
Pieter Noordhuis
Browse files
Change how parse outcome is compared
parent
87055888
Changes
1
Hide whitespace changes
Inline
Side-by-side
test/parser.c
View file @
45ed2729
...
@@ -18,11 +18,10 @@ typedef struct log_entry_s log_entry_t;
...
@@ -18,11 +18,10 @@ typedef struct log_entry_s log_entry_t;
struct
log_entry_s
{
struct
log_entry_s
{
redis_protocol_t
obj
;
redis_protocol_t
obj
;
int
parent_cursor
;
int
type
;
/* string_t specifics */
/* string_t specifics */
const
char
*
string_buf
;
char
string_buf
[
1024
];
size_t
string_len
;
/* array_t specifics */
/* array_t specifics */
size_t
array_len
;
size_t
array_len
;
...
@@ -35,64 +34,81 @@ struct log_entry_s {
...
@@ -35,64 +34,81 @@ struct log_entry_s {
static
log_entry_t
cb_log
[
CB_LOG_SIZE
];
static
log_entry_t
cb_log
[
CB_LOG_SIZE
];
static
int
cb_log_idx
=
0
;
static
int
cb_log_idx
=
0
;
#define
reset_cb_log(
) do { \
static
void
reset_cb_log
(
void
)
{
memset(cb_log, 0xff, sizeof(cb_log));
\
memset
(
cb_log
,
0xff
,
sizeof
(
cb_log
));
cb_log_idx = 0;
\
cb_log_idx
=
0
;
}
while(0)
}
#define copy_cb_log(dst) do { \
static
log_entry_t
*
dup_cb_log
(
void
)
{
memcpy(dst, cb_log, sizeof(cb_log)); \
log_entry_t
*
log
=
malloc
(
sizeof
(
cb_log
));
} while(0)
memcpy
(
log
,
cb_log
,
sizeof
(
cb_log
));
return
log
;
}
int
on_string
(
redis_parser_t
*
parser
,
redis_protocol_t
*
p
,
const
char
*
buf
,
size_t
len
)
{
log_entry_t
*
log
=
(
log_entry_t
*
)
p
->
data
;
/* Use new entry when this is the first call */
if
(
log
==
NULL
)
{
log
=
p
->
data
=
&
cb_log
[
cb_log_idx
++
];
log
->
obj
=
*
p
;
log
->
type
=
p
->
type
;
log
->
string_buf
[
0
]
=
'\0'
;
}
int
on_string
(
redis_parser_t
*
parser
,
redis_protocol_t
*
obj
,
const
char
*
buf
,
size_t
len
)
{
/* Type should never change when called multiple times */
log_entry_t
tmp
=
{
assert
(
log
->
type
==
p
->
type
);
.
obj
=
*
obj
,
.
string_buf
=
buf
,
.
string_len
=
len
};
if
(
obj
->
parent
)
/* Cursor should equal current string length */
tmp
.
parent_cursor
=
obj
->
parent
->
cursor
;
assert
(
p
->
cursor
==
strlen
(
log
->
string_buf
));
/* Append string data */
strncat
(
log
->
string_buf
,
buf
,
len
);
cb_log
[
cb_log_idx
++
]
=
tmp
;
return
0
;
return
0
;
}
}
int
on_array
(
redis_parser_t
*
parser
,
redis_protocol_t
*
obj
,
size_t
len
)
{
int
on_array
(
redis_parser_t
*
parser
,
redis_protocol_t
*
p
,
size_t
len
)
{
log_entry_t
tmp
=
{
log_entry_t
*
log
=
(
log_entry_t
*
)
p
->
data
;
.
obj
=
*
obj
,
.
array_len
=
len
/* Should only be called once */
}
;
assert
(
log
==
NULL
)
;
if
(
obj
->
parent
)
/* Use new entry */
tmp
.
parent_cursor
=
obj
->
parent
->
cursor
;
log
=
p
->
data
=
&
cb_log
[
cb_log_idx
++
];
log
->
obj
=
*
p
;
log
->
type
=
p
->
type
;
log
->
array_len
=
len
;
cb_log
[
cb_log_idx
++
]
=
tmp
;
return
0
;
return
0
;
}
}
int
on_integer
(
redis_parser_t
*
parser
,
redis_protocol_t
*
obj
,
int64_t
value
)
{
int
on_integer
(
redis_parser_t
*
parser
,
redis_protocol_t
*
p
,
int64_t
value
)
{
log_entry_t
tmp
=
{
log_entry_t
*
log
=
(
log_entry_t
*
)
p
->
data
;
.
obj
=
*
obj
,
.
integer_value
=
value
/* Should only be called once */
}
;
assert
(
log
==
NULL
)
;
if
(
obj
->
parent
)
/* Use new entry */
tmp
.
parent_cursor
=
obj
->
parent
->
cursor
;
log
=
p
->
data
=
&
cb_log
[
cb_log_idx
++
];
log
->
obj
=
*
p
;
log
->
type
=
p
->
type
;
log
->
integer_value
=
value
;
cb_log
[
cb_log_idx
++
]
=
tmp
;
return
0
;
return
0
;
}
}
int
on_nil
(
redis_parser_t
*
parser
,
redis_protocol_t
*
obj
)
{
int
on_nil
(
redis_parser_t
*
parser
,
redis_protocol_t
*
p
)
{
log_entry_t
tmp
=
{
log_entry_t
*
log
=
(
log_entry_t
*
)
p
->
data
;
.
obj
=
*
obj
};
if
(
obj
->
parent
)
/* Should only be called once */
tmp
.
parent_cursor
=
obj
->
parent
->
cursor
;
assert
(
log
==
NULL
);
/* Use new entry */
log
=
p
->
data
=
&
cb_log
[
cb_log_idx
++
];
log
->
obj
=
*
p
;
log
->
type
=
p
->
type
;
cb_log
[
cb_log_idx
++
]
=
tmp
;
return
0
;
return
0
;
}
}
...
@@ -108,12 +124,15 @@ static redis_parser_callbacks_t callbacks = {
...
@@ -108,12 +124,15 @@ static redis_parser_callbacks_t callbacks = {
redis_parser_init((__parser), &callbacks); \
redis_parser_init((__parser), &callbacks); \
} while(0)
} while(0)
void
test_char_by_char
(
redis_protocol_t
*
ref
,
const
char
*
buf
,
size_t
len
)
{
void
test_char_by_char
(
redis_protocol_t
*
_unused
,
const
char
*
buf
,
size_t
len
)
{
log_entry_t
*
ref
;
redis_parser_t
*
p
;
redis_parser_t
*
p
;
redis_protocol_t
*
res
;
redis_protocol_t
*
res
;
size_t
i
;
size_t
i
,
j
;
ref
=
dup_cb_log
();
p
=
malloc
(
sizeof
(
redis_parser_t
));
p
=
malloc
(
sizeof
(
redis_parser_t
));
for
(
i
=
1
;
i
<
(
len
-
1
);
i
++
)
{
for
(
i
=
1
;
i
<
(
len
-
1
);
i
++
)
{
RESET_PARSER_T
(
p
);
RESET_PARSER_T
(
p
);
...
@@ -125,12 +144,20 @@ void test_char_by_char(redis_protocol_t *ref, const char *buf, size_t len) {
...
@@ -125,12 +144,20 @@ void test_char_by_char(redis_protocol_t *ref, const char *buf, size_t len) {
assert_equal_size_t
(
redis_parser_execute
(
p
,
&
res
,
buf
+
i
,
len
-
i
),
len
-
i
);
assert_equal_size_t
(
redis_parser_execute
(
p
,
&
res
,
buf
+
i
,
len
-
i
),
len
-
i
);
assert
(
NULL
!=
res
);
assert
(
NULL
!=
res
);
/* Compare result with reference */
/* Compare callback log with reference */
ref
->
cursor
=
res
->
cursor
=
0
;
/* ignore cursor */
for
(
j
=
0
;
j
<
CB_LOG_SIZE
;
j
++
)
{
assert
(
memcmp
(
ref
,
res
,
sizeof
(
redis_protocol_t
))
==
0
);
log_entry_t
expect
=
ref
[
j
];
log_entry_t
actual
=
cb_log
[
j
];
/* Not interested in the redis_protocol_t data */
memset
(
&
expect
.
obj
,
0
,
sizeof
(
expect
.
obj
));
memset
(
&
actual
.
obj
,
0
,
sizeof
(
actual
.
obj
));
assert
(
memcmp
(
&
expect
,
&
actual
,
sizeof
(
expect
))
==
0
);
}
}
}
free
(
p
);
free
(
p
);
free
(
ref
);
}
}
void
test_string
(
redis_parser_t
*
p
)
{
void
test_string
(
redis_parser_t
*
p
)
{
...
@@ -150,8 +177,7 @@ void test_string(redis_parser_t *p) {
...
@@ -150,8 +177,7 @@ void test_string(redis_parser_t *p) {
/* Check callbacks */
/* Check callbacks */
assert
(
cb_log_idx
==
1
);
assert
(
cb_log_idx
==
1
);
assert
(
cb_log
[
0
].
string_buf
==
buf
+
4
);
assert
(
!
strncmp
(
cb_log
[
0
].
string_buf
,
buf
+
4
,
5
));
assert
(
cb_log
[
0
].
string_len
==
5
);
/* Chunked check */
/* Chunked check */
test_char_by_char
(
res
,
buf
,
len
);
test_char_by_char
(
res
,
buf
,
len
);
...
@@ -174,8 +200,7 @@ void test_empty_string(redis_parser_t *p) {
...
@@ -174,8 +200,7 @@ void test_empty_string(redis_parser_t *p) {
/* Check callbacks */
/* Check callbacks */
assert
(
cb_log_idx
==
1
);
assert
(
cb_log_idx
==
1
);
assert
(
cb_log
[
0
].
string_buf
==
buf
+
4
);
assert
(
!
strncmp
(
cb_log
[
0
].
string_buf
,
buf
+
4
,
0
));
assert
(
cb_log
[
0
].
string_len
==
0
);
/* Chunked check */
/* Chunked check */
test_char_by_char
(
res
,
buf
,
len
);
test_char_by_char
(
res
,
buf
,
len
);
...
@@ -210,17 +235,13 @@ void test_array(redis_parser_t *p) {
...
@@ -210,17 +235,13 @@ void test_array(redis_parser_t *p) {
assert
(
cb_log
[
1
].
obj
.
plen
==
4
+
5
+
2
);
assert
(
cb_log
[
1
].
obj
.
plen
==
4
+
5
+
2
);
assert
(
cb_log
[
1
].
obj
.
coff
==
4
+
4
);
assert
(
cb_log
[
1
].
obj
.
coff
==
4
+
4
);
assert
(
cb_log
[
1
].
obj
.
clen
==
5
);
assert
(
cb_log
[
1
].
obj
.
clen
==
5
);
assert
(
cb_log
[
1
].
string_buf
==
buf
+
4
+
4
);
assert
(
!
strncmp
(
cb_log
[
1
].
string_buf
,
buf
+
4
+
4
,
5
));
assert
(
cb_log
[
1
].
string_len
==
5
);
assert
(
cb_log
[
1
].
parent_cursor
==
0
);
assert
(
cb_log
[
2
].
obj
.
poff
==
4
+
11
);
assert
(
cb_log
[
2
].
obj
.
poff
==
4
+
11
);
assert
(
cb_log
[
2
].
obj
.
plen
==
4
+
5
+
2
);
assert
(
cb_log
[
2
].
obj
.
plen
==
4
+
5
+
2
);
assert
(
cb_log
[
2
].
obj
.
coff
==
4
+
11
+
4
);
assert
(
cb_log
[
2
].
obj
.
coff
==
4
+
11
+
4
);
assert
(
cb_log
[
2
].
obj
.
clen
==
5
);
assert
(
cb_log
[
2
].
obj
.
clen
==
5
);
assert
(
cb_log
[
2
].
string_buf
==
buf
+
4
+
11
+
4
);
assert
(
!
strncmp
(
cb_log
[
2
].
string_buf
,
buf
+
4
+
11
+
4
,
5
));
assert
(
cb_log
[
2
].
string_len
==
5
);
assert
(
cb_log
[
2
].
parent_cursor
==
1
);
/* Chunked check */
/* Chunked check */
test_char_by_char
(
res
,
buf
,
len
);
test_char_by_char
(
res
,
buf
,
len
);
...
...
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