Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
M
mongoose
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
esp
mongoose
Commits
ec7d0b1a
Commit
ec7d0b1a
authored
Jan 25, 2013
by
Sergey Lyubka
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added test_mg_upload()
parent
5bb3ede4
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
109 additions
and
33 deletions
+109
-33
unit_test.c
test/unit_test.c
+109
-33
No files found.
test/unit_test.c
View file @
ec7d0b1a
...
@@ -32,7 +32,15 @@
...
@@ -32,7 +32,15 @@
#define HTTP_PORT "56789"
#define HTTP_PORT "56789"
#define HTTPS_PORT "56790"
#define HTTPS_PORT "56790"
#define LISTENING_ADDR "127.0.0.1:" HTTP_PORT "r,127.0.0.1:" HTTPS_PORT "s"
#define HTTP_PORT2 "56791"
#define LISTENING_ADDR \
"127.0.0.1:" HTTP_PORT "r" \
",127.0.0.1:" HTTPS_PORT "s" \
",127.0.0.1:" HTTP_PORT2
#ifndef _WIN32
#define __cdecl
#endif
static
void
test_parse_http_message
()
{
static
void
test_parse_http_message
()
{
struct
mg_request_info
ri
;
struct
mg_request_info
ri
;
...
@@ -158,16 +166,29 @@ static void test_remove_double_dots() {
...
@@ -158,16 +166,29 @@ static void test_remove_double_dots() {
size_t
i
;
size_t
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
data
);
i
++
)
{
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
data
);
i
++
)
{
#if 0
printf("[%s] -> [%s]\n", data[i].before, data[i].after);
#endif
remove_double_dots_and_double_slashes
(
data
[
i
].
before
);
remove_double_dots_and_double_slashes
(
data
[
i
].
before
);
ASSERT
(
strcmp
(
data
[
i
].
before
,
data
[
i
].
after
)
==
0
);
ASSERT
(
strcmp
(
data
[
i
].
before
,
data
[
i
].
after
)
==
0
);
}
}
}
}
static
char
*
read_file
(
const
char
*
path
,
int
*
size
)
{
FILE
*
fp
;
struct
stat
st
;
char
*
data
=
NULL
;
if
((
fp
=
fopen
(
path
,
"rb"
))
!=
NULL
&&
!
fstat
(
fileno
(
fp
),
&
st
))
{
*
size
=
(
int
)
st
.
st_size
;
ASSERT
((
data
=
malloc
(
*
size
))
!=
NULL
);
ASSERT
(
fread
(
data
,
1
,
*
size
,
fp
)
==
(
size_t
)
*
size
);
fclose
(
fp
);
}
return
data
;
}
static
const
char
*
fetch_data
=
"hello world!
\n
"
;
static
const
char
*
fetch_data
=
"hello world!
\n
"
;
static
const
char
*
inmemory_file_data
=
"hi there"
;
static
const
char
*
inmemory_file_data
=
"hi there"
;
static
const
char
*
upload_filename
=
"upload_test.txt"
;
static
const
char
*
upload_ok_message
=
"upload successful"
;
static
void
*
event_handler
(
enum
mg_event
event
,
struct
mg_connection
*
conn
)
{
static
void
*
event_handler
(
enum
mg_event
event
,
struct
mg_connection
*
conn
)
{
const
struct
mg_request_info
*
request_info
=
mg_get_request_info
(
conn
);
const
struct
mg_request_info
*
request_info
=
mg_get_request_info
(
conn
);
...
@@ -177,14 +198,30 @@ static void *event_handler(enum mg_event event, struct mg_connection *conn) {
...
@@ -177,14 +198,30 @@ static void *event_handler(enum mg_event event, struct mg_connection *conn) {
"Content-Type: text/plain
\r\n\r\n
"
"Content-Type: text/plain
\r\n\r\n
"
"%s"
,
(
int
)
strlen
(
fetch_data
),
fetch_data
);
"%s"
,
(
int
)
strlen
(
fetch_data
),
fetch_data
);
return
""
;
return
""
;
}
else
if
(
event
==
MG_NEW_REQUEST
&&
!
strcmp
(
request_info
->
uri
,
"/upload"
))
{
ASSERT
(
mg_upload
(
conn
,
"."
)
==
1
);
}
else
if
(
event
==
MG_OPEN_FILE
)
{
}
else
if
(
event
==
MG_OPEN_FILE
)
{
const
char
*
path
=
request_info
->
ev_data
;
const
char
*
path
=
request_info
->
ev_data
;
if
(
strcmp
(
path
,
"./blah"
)
==
0
)
{
if
(
strcmp
(
path
,
"./blah"
)
==
0
)
{
mg_get_request_info
(
conn
)
->
ev_data
=
mg_get_request_info
(
conn
)
->
ev_data
=
(
void
*
)
(
int
)
strlen
(
inmemory_file_data
);
(
void
*
)
(
long
)
strlen
(
inmemory_file_data
);
return
(
void
*
)
inmemory_file_data
;
return
(
void
*
)
inmemory_file_data
;
}
}
}
else
if
(
event
==
MG_EVENT_LOG
)
{
}
else
if
(
event
==
MG_EVENT_LOG
)
{
}
else
if
(
event
==
MG_UPLOAD
)
{
char
*
p1
,
*
p2
;
int
len1
,
len2
;
ASSERT
(
!
strcmp
((
char
*
)
request_info
->
ev_data
,
"./upload_test.txt"
));
ASSERT
((
p1
=
read_file
(
"mongoose.c"
,
&
len1
))
!=
NULL
);
ASSERT
((
p2
=
read_file
(
upload_filename
,
&
len2
))
!=
NULL
);
ASSERT
(
len1
==
len2
);
ASSERT
(
memcmp
(
p1
,
p2
,
len1
)
==
0
);
free
(
p1
),
free
(
p2
);
remove
(
upload_filename
);
mg_printf
(
conn
,
"HTTP/1.0 200 OK
\r\n
Content-Length: %d
\r\n\r\n
%s"
,
(
int
)
strlen
(
upload_ok_message
),
upload_ok_message
);
}
}
return
NULL
;
return
NULL
;
...
@@ -197,25 +234,6 @@ static const char *OPTIONS[] = {
...
@@ -197,25 +234,6 @@ static const char *OPTIONS[] = {
NULL
,
NULL
,
};
};
static
void
test_mg_upload
(
void
)
{
struct
mg_context
*
ctx
;
ASSERT
((
ctx
=
mg_start
(
event_handler
,
NULL
,
OPTIONS
))
!=
NULL
);
mg_stop
(
ctx
);
}
static
char
*
read_file
(
const
char
*
path
,
int
*
size
)
{
FILE
*
fp
;
struct
stat
st
;
char
*
data
=
NULL
;
if
((
fp
=
fopen
(
path
,
"r"
))
!=
NULL
&&
!
fstat
(
fileno
(
fp
),
&
st
))
{
*
size
=
st
.
st_size
;
ASSERT
((
data
=
malloc
(
*
size
))
!=
NULL
);
ASSERT
(
fread
(
data
,
1
,
*
size
,
fp
)
==
(
size_t
)
*
size
);
fclose
(
fp
);
}
return
data
;
}
static
char
*
read_conn
(
struct
mg_connection
*
conn
,
int
*
size
)
{
static
char
*
read_conn
(
struct
mg_connection
*
conn
,
int
*
size
)
{
char
buf
[
100
],
*
data
=
NULL
;
char
buf
[
100
],
*
data
=
NULL
;
int
len
;
int
len
;
...
@@ -236,9 +254,10 @@ static void test_mg_download(void) {
...
@@ -236,9 +254,10 @@ static void test_mg_download(void) {
ASSERT
((
ctx
=
mg_start
(
event_handler
,
NULL
,
OPTIONS
))
!=
NULL
);
ASSERT
((
ctx
=
mg_start
(
event_handler
,
NULL
,
OPTIONS
))
!=
NULL
);
ASSERT
(
mg_download
(
NULL
,
port
,
0
,
ebuf
,
sizeof
(
ebuf
),
""
)
==
NULL
);
ASSERT
(
mg_download
(
NULL
,
port
,
0
,
ebuf
,
sizeof
(
ebuf
),
"%s"
,
""
)
==
NULL
);
ASSERT
(
mg_download
(
"localhost"
,
0
,
0
,
ebuf
,
sizeof
(
ebuf
),
""
)
==
NULL
);
ASSERT
(
mg_download
(
"localhost"
,
0
,
0
,
ebuf
,
sizeof
(
ebuf
),
"%s"
,
""
)
==
NULL
);
ASSERT
(
mg_download
(
"localhost"
,
port
,
1
,
ebuf
,
sizeof
(
ebuf
),
""
)
==
NULL
);
ASSERT
(
mg_download
(
"localhost"
,
port
,
1
,
ebuf
,
sizeof
(
ebuf
),
"%s"
,
""
)
==
NULL
);
// Fetch nonexistent file, should see 404
// Fetch nonexistent file, should see 404
ASSERT
((
conn
=
mg_download
(
"localhost"
,
port
,
1
,
ebuf
,
sizeof
(
ebuf
),
"%s"
,
ASSERT
((
conn
=
mg_download
(
"localhost"
,
port
,
1
,
ebuf
,
sizeof
(
ebuf
),
"%s"
,
...
@@ -246,6 +265,10 @@ static void test_mg_download(void) {
...
@@ -246,6 +265,10 @@ static void test_mg_download(void) {
ASSERT
(
strcmp
(
conn
->
request_info
.
uri
,
"404"
)
==
0
);
ASSERT
(
strcmp
(
conn
->
request_info
.
uri
,
"404"
)
==
0
);
mg_close_connection
(
conn
);
mg_close_connection
(
conn
);
ASSERT
((
conn
=
mg_download
(
"google.com"
,
443
,
1
,
ebuf
,
sizeof
(
ebuf
),
"%s"
,
"GET / HTTP/1.0
\r\n\r\n
"
))
!=
NULL
);
mg_close_connection
(
conn
);
// Fetch mongoose.c, should succeed
// Fetch mongoose.c, should succeed
ASSERT
((
conn
=
mg_download
(
"localhost"
,
port
,
1
,
ebuf
,
sizeof
(
ebuf
),
"%s"
,
ASSERT
((
conn
=
mg_download
(
"localhost"
,
port
,
1
,
ebuf
,
sizeof
(
ebuf
),
"%s"
,
"GET /mongoose.c HTTP/1.0
\r\n\r\n
"
))
!=
NULL
);
"GET /mongoose.c HTTP/1.0
\r\n\r\n
"
))
!=
NULL
);
...
@@ -287,6 +310,46 @@ static void test_mg_download(void) {
...
@@ -287,6 +310,46 @@ static void test_mg_download(void) {
mg_stop
(
ctx
);
mg_stop
(
ctx
);
}
}
static
int
alloc_printf
(
char
**
buf
,
size_t
size
,
char
*
fmt
,
...)
{
va_list
ap
;
va_start
(
ap
,
fmt
);
return
alloc_vprintf
(
buf
,
size
,
fmt
,
ap
);
}
static
void
test_mg_upload
(
void
)
{
static
const
char
*
boundary
=
"OOO___MY_BOUNDARY___OOO"
;
struct
mg_context
*
ctx
;
struct
mg_connection
*
conn
;
char
ebuf
[
100
],
buf
[
20
],
*
file_data
,
*
post_data
=
NULL
;
int
file_len
,
post_data_len
;
ASSERT
((
ctx
=
mg_start
(
event_handler
,
NULL
,
OPTIONS
))
!=
NULL
);
ASSERT
((
file_data
=
read_file
(
"mongoose.c"
,
&
file_len
))
!=
NULL
);
post_data_len
=
alloc_printf
(
&
post_data
,
0
,
"--%s
\r\n
"
"Content-Disposition: form-data; "
"name=
\"
file
\"
; "
"filename=
\"
%s
\"\r\n\r\n
"
"%.*s
\r\n
"
"--%s
\r\n
"
,
boundary
,
upload_filename
,
file_len
,
file_data
,
boundary
);
ASSERT
(
post_data_len
>
0
);
ASSERT
((
conn
=
mg_download
(
"localhost"
,
atoi
(
HTTPS_PORT
),
1
,
ebuf
,
sizeof
(
ebuf
),
"POST /upload HTTP/1.1
\r\n
"
"Content-Length: %d
\r\n
"
"Content-Type: multipart/form-data; "
"boundary=%s
\r\n\r\n
"
"%.*s"
,
post_data_len
,
boundary
,
post_data_len
,
post_data
))
!=
NULL
);
free
(
file_data
),
free
(
post_data
);
ASSERT
(
mg_read
(
conn
,
buf
,
sizeof
(
buf
))
==
(
int
)
strlen
(
upload_ok_message
));
ASSERT
(
memcmp
(
buf
,
upload_ok_message
,
strlen
(
upload_ok_message
))
==
0
);
mg_close_connection
(
conn
);
mg_stop
(
ctx
);
}
static
void
test_base64_encode
(
void
)
{
static
void
test_base64_encode
(
void
)
{
const
char
*
in
[]
=
{
"a"
,
"ab"
,
"abc"
,
"abcd"
,
NULL
};
const
char
*
in
[]
=
{
"a"
,
"ab"
,
"abc"
,
"abcd"
,
NULL
};
const
char
*
out
[]
=
{
"YQ=="
,
"YWI="
,
"YWJj"
,
"YWJjZA=="
};
const
char
*
out
[]
=
{
"YQ=="
,
"YWI="
,
"YWJj"
,
"YWJjZA=="
};
...
@@ -359,12 +422,9 @@ static void check_lua_expr(lua_State *L, const char *expr, const char *value) {
...
@@ -359,12 +422,9 @@ static void check_lua_expr(lua_State *L, const char *expr, const char *value) {
char
buf
[
100
];
char
buf
[
100
];
snprintf
(
buf
,
sizeof
(
buf
),
"%s = %s"
,
var_name
,
expr
);
snprintf
(
buf
,
sizeof
(
buf
),
"%s = %s"
,
var_name
,
expr
);
luaL_dostring
(
L
,
buf
);
(
void
)
luaL_dostring
(
L
,
buf
);
lua_getglobal
(
L
,
var_name
);
lua_getglobal
(
L
,
var_name
);
v
=
lua_tostring
(
L
,
-
1
);
v
=
lua_tostring
(
L
,
-
1
);
#if 0
printf("%s: %s: [%s] [%s]\n", __func__, expr, v == NULL ? "null" : v, value);
#endif
ASSERT
((
value
==
NULL
&&
v
==
NULL
)
||
ASSERT
((
value
==
NULL
&&
v
==
NULL
)
||
(
value
!=
NULL
&&
v
!=
NULL
&&
!
strcmp
(
value
,
v
)));
(
value
!=
NULL
&&
v
!=
NULL
&&
!
strcmp
(
value
,
v
)));
}
}
...
@@ -395,7 +455,7 @@ static void test_lua(void) {
...
@@ -395,7 +455,7 @@ static void test_lua(void) {
check_lua_expr
(
L
,
"request_info.remote_ip"
,
"0"
);
check_lua_expr
(
L
,
"request_info.remote_ip"
,
"0"
);
check_lua_expr
(
L
,
"request_info.http_headers['Content-Length']"
,
"12"
);
check_lua_expr
(
L
,
"request_info.http_headers['Content-Length']"
,
"12"
);
check_lua_expr
(
L
,
"request_info.http_headers['Connection']"
,
"close"
);
check_lua_expr
(
L
,
"request_info.http_headers['Connection']"
,
"close"
);
luaL_dostring
(
L
,
"post = read()"
);
(
void
)
luaL_dostring
(
L
,
"post = read()"
);
check_lua_expr
(
L
,
"# post"
,
"12"
);
check_lua_expr
(
L
,
"# post"
,
"12"
);
check_lua_expr
(
L
,
"post"
,
"hello world!"
);
check_lua_expr
(
L
,
"post"
,
"hello world!"
);
lua_close
(
L
);
lua_close
(
L
);
...
@@ -442,7 +502,22 @@ static void test_skip_quoted(void) {
...
@@ -442,7 +502,22 @@ static void test_skip_quoted(void) {
#endif
#endif
}
}
static
void
test_alloc_vprintf
(
void
)
{
char
buf
[
MG_BUF_LEN
],
*
p
=
buf
;
ASSERT
(
alloc_printf
(
&
p
,
sizeof
(
buf
),
"%s"
,
"hi"
)
==
2
);
ASSERT
(
p
==
buf
);
ASSERT
(
alloc_printf
(
&
p
,
sizeof
(
buf
),
"%s"
,
""
)
==
0
);
ASSERT
(
alloc_printf
(
&
p
,
sizeof
(
buf
),
""
)
==
0
);
// Pass small buffer, make sure alloc_printf allocates
ASSERT
(
alloc_printf
(
&
p
,
1
,
"%s"
,
"hello"
)
==
5
);
ASSERT
(
p
!=
buf
);
free
(
p
);
}
int
__cdecl
main
(
void
)
{
int
__cdecl
main
(
void
)
{
test_alloc_vprintf
();
test_base64_encode
();
test_base64_encode
();
test_match_prefix
();
test_match_prefix
();
test_remove_double_dots
();
test_remove_double_dots
();
...
@@ -454,11 +529,12 @@ int __cdecl main(void) {
...
@@ -454,11 +529,12 @@ int __cdecl main(void) {
test_next_option
();
test_next_option
();
test_user_data
();
test_user_data
();
test_mg_stat
();
test_mg_stat
();
test_skip_quoted
();
test_mg_upload
();
test_mg_upload
();
#ifdef USE_LUA
#ifdef USE_LUA
test_lua
();
test_lua
();
#endif
#endif
test_skip_quoted
();
printf
(
"%s
\n
"
,
"PASSED"
);
printf
(
"%s
\n
"
,
"PASSED"
);
return
0
;
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