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
4ae503d1
Commit
4ae503d1
authored
Jun 30, 2011
by
Pieter Noordhuis
Browse files
Initial tests for new parser
parent
e7d8b0c7
Changes
1
Hide whitespace changes
Inline
Side-by-side
test/parser.c
0 → 100644
View file @
4ae503d1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "parser.h"
typedef
struct
log_entry_s
log_entry_t
;
struct
log_entry_s
{
redis_protocol_t
obj
;
/* string_t specifics */
const
char
*
string_buf
;
size_t
string_len
;
/* array_t specifics */
size_t
array_len
;
/* integer_t specifics */
int64_t
integer_value
;
};
#define CB_LOG_SIZE 10
static
log_entry_t
cb_log
[
CB_LOG_SIZE
];
static
int
cb_log_idx
=
0
;
#define reset_cb_log() do { \
memset(cb_log, 0, sizeof(cb_log)); \
cb_log_idx = 0; \
} while(0)
#define copy_cb_log(dst) do { \
memcpy(dst, cb_log, sizeof(cb_log)); \
} while(0)
int
on_string
(
redis_parser_t
*
parser
,
redis_protocol_t
*
obj
,
const
char
*
buf
,
size_t
len
)
{
log_entry_t
tmp
=
{
.
obj
=
*
obj
,
.
string_buf
=
buf
,
.
string_len
=
len
};
cb_log
[
cb_log_idx
++
]
=
tmp
;
return
1
;
}
int
on_array
(
redis_parser_t
*
parser
,
redis_protocol_t
*
obj
,
size_t
len
)
{
log_entry_t
tmp
=
{
.
obj
=
*
obj
,
.
array_len
=
len
};
cb_log
[
cb_log_idx
++
]
=
tmp
;
return
1
;
}
int
on_integer
(
redis_parser_t
*
parser
,
redis_protocol_t
*
obj
,
int64_t
value
)
{
log_entry_t
tmp
=
{
.
obj
=
*
obj
,
.
integer_value
=
value
};
cb_log
[
cb_log_idx
++
]
=
tmp
;
return
1
;
}
int
on_nil
(
redis_parser_t
*
parser
,
redis_protocol_t
*
obj
)
{
log_entry_t
tmp
=
{
.
obj
=
*
obj
};
cb_log
[
cb_log_idx
++
]
=
tmp
;
return
1
;
}
static
redis_parser_cb_t
callbacks
=
{
&
on_string
,
&
on_array
,
&
on_integer
,
&
on_nil
};
redis_parser_t
*
new_parser
(
void
)
{
redis_parser_t
*
parser
=
malloc
(
sizeof
(
redis_parser_t
));
redis_parser_init
(
parser
,
&
callbacks
);
return
parser
;
}
void
free_parser
(
redis_parser_t
*
parser
)
{
free
(
parser
);
}
void
test_char_by_char
(
redis_protocol_t
*
ref
,
const
char
*
buf
,
size_t
len
)
{
redis_parser_t
*
p
=
new_parser
();
redis_protocol_t
*
res
;
size_t
i
;
for
(
i
=
1
;
i
<
(
len
-
1
);
i
++
)
{
reset_cb_log
();
redis_parser_init
(
p
,
&
callbacks
);
/* Slice 1 */
assert
(
i
==
redis_parser_execute
(
p
,
&
res
,
buf
,
i
));
assert
(
NULL
==
res
);
/* no result */
/* Slice 2 */
assert
(
len
-
i
==
redis_parser_execute
(
p
,
&
res
,
buf
+
i
,
len
-
i
));
assert
(
NULL
!=
res
);
/* Compare result with reference */
assert
(
memcmp
(
ref
,
res
,
sizeof
(
redis_protocol_t
))
==
0
);
}
free_parser
(
p
);
}
void
test_string
(
void
)
{
redis_parser_t
*
p
=
new_parser
();
redis_protocol_t
*
res
;
const
char
*
buf
=
"$5
\r\n
hello
\r\n
"
;
size_t
len
=
11
;
/* Parse and check resulting protocol_t */
reset_cb_log
();
assert
(
redis_parser_execute
(
p
,
&
res
,
buf
,
len
)
==
len
);
assert
(
res
!=
NULL
);
assert
(
res
->
type
==
REDIS_STRING_T
);
assert
(
res
->
poff
==
0
);
assert
(
res
->
plen
==
11
);
assert
(
res
->
coff
==
4
);
assert
(
res
->
clen
==
5
);
/* Check callbacks */
assert
(
cb_log_idx
==
1
);
assert
(
cb_log
[
0
].
string_buf
==
buf
+
4
);
assert
(
cb_log
[
0
].
string_len
==
5
);
/* Chunked check */
test_char_by_char
(
res
,
buf
,
len
);
free_parser
(
p
);
}
void
test_array
(
void
)
{
redis_parser_t
*
p
=
new_parser
();
redis_protocol_t
*
res
;
const
char
*
buf
=
"*2
\r\n
"
"$5
\r\n
hello
\r\n
"
"$5
\r\n
world
\r\n
"
;
size_t
len
=
26
;
/* Parse and check resulting protocol_t */
reset_cb_log
();
assert
(
redis_parser_execute
(
p
,
&
res
,
buf
,
len
)
==
len
);
assert
(
res
!=
NULL
);
assert
(
res
->
type
==
REDIS_ARRAY_T
);
assert
(
res
->
poff
==
0
);
assert
(
res
->
plen
==
26
);
assert
(
res
->
coff
==
0
);
assert
(
res
->
clen
==
0
);
/* Check callbacks */
assert
(
cb_log_idx
==
3
);
assert
(
cb_log
[
0
].
obj
.
poff
==
0
);
assert
(
cb_log
[
0
].
obj
.
plen
==
4
);
assert
(
cb_log
[
0
].
array_len
==
2
);
assert
(
cb_log
[
1
].
obj
.
poff
==
4
);
assert
(
cb_log
[
1
].
obj
.
plen
==
4
+
5
+
2
);
assert
(
cb_log
[
1
].
obj
.
coff
==
4
+
4
);
assert
(
cb_log
[
1
].
obj
.
clen
==
5
);
assert
(
cb_log
[
1
].
string_buf
==
buf
+
4
+
4
);
assert
(
cb_log
[
1
].
string_len
==
5
);
assert
(
cb_log
[
2
].
obj
.
poff
==
4
+
11
);
assert
(
cb_log
[
2
].
obj
.
plen
==
4
+
5
+
2
);
assert
(
cb_log
[
2
].
obj
.
coff
==
4
+
11
+
4
);
assert
(
cb_log
[
2
].
obj
.
clen
==
5
);
assert
(
cb_log
[
2
].
string_buf
==
buf
+
4
+
11
+
4
);
assert
(
cb_log
[
2
].
string_len
==
5
);
/* Chunked check */
test_char_by_char
(
res
,
buf
,
len
);
free_parser
(
p
);
}
int
main
(
int
argc
,
char
**
argv
)
{
test_string
();
test_array
();
return
0
;
}
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