Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
T
tor
Manage
Activity
Members
Labels
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
The Tor Project
Core
debian
tor
Commits
5d81fd25
Commit
5d81fd25
authored
10 years ago
by
Andrea Shepard
Browse files
Options
Downloads
Patches
Plain Diff
Add unit test for ClientTransportPlugin/ServerTransportPlugin config line parsing
parent
b8b46e8e
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/test/test_config.c
+248
-0
248 additions, 0 deletions
src/test/test_config.c
with
248 additions
and
0 deletions
src/test/test_config.c
+
248
−
0
View file @
5d81fd25
...
...
@@ -14,6 +14,8 @@
#include
"test.h"
#include
"util.h"
#include
"address.h"
#include
"entrynodes.h"
#include
"transports.h"
static
void
test_config_addressmap
(
void
*
arg
)
...
...
@@ -552,6 +554,251 @@ test_config_parse_transport_options_line(void *arg)
}
}
/* Mocks needed for the transport plugin line test */
static
void
pt_kickstart_proxy_mock
(
const
smartlist_t
*
transport_list
,
char
**
proxy_argv
,
int
is_server
);
static
int
transport_add_from_config_mock
(
const
tor_addr_t
*
addr
,
uint16_t
port
,
const
char
*
name
,
int
socks_ver
);
static
int
transport_is_needed_mock
(
const
char
*
transport_name
);
static
int
pt_kickstart_proxy_mock_call_count
=
0
;
static
int
transport_add_from_config_mock_call_count
=
0
;
static
int
transport_is_needed_mock_call_count
=
0
;
static
int
transport_is_needed_mock_return
=
0
;
static
void
pt_kickstart_proxy_mock
(
const
smartlist_t
*
transport_list
,
char
**
proxy_argv
,
int
is_server
)
{
++
pt_kickstart_proxy_mock_call_count
;
}
static
int
transport_add_from_config_mock
(
const
tor_addr_t
*
addr
,
uint16_t
port
,
const
char
*
name
,
int
socks_ver
)
{
++
transport_add_from_config_mock_call_count
;
return
0
;
}
static
int
transport_is_needed_mock
(
const
char
*
transport_name
)
{
++
transport_is_needed_mock_call_count
;
return
transport_is_needed_mock_return
;
}
/**
* Test parsing for the ClientTransportPlugin and ServerTransportPlugin config
* options.
*/
static
void
test_config_parse_transport_plugin_line
(
void
*
arg
)
{
or_options_t
*
options
=
get_options_mutable
();
int
r
,
tmp
;
int
old_pt_kickstart_proxy_mock_call_count
;
int
old_transport_add_from_config_mock_call_count
;
int
old_transport_is_needed_mock_call_count
;
/* Bad transport lines - too short */
r
=
parse_client_transport_line
(
options
,
"bad"
,
1
);
test_assert
(
r
<
0
);
r
=
parse_server_transport_line
(
options
,
"bad"
,
1
);
test_assert
(
r
<
0
);
r
=
parse_client_transport_line
(
options
,
"bad bad"
,
1
);
test_assert
(
r
<
0
);
r
=
parse_server_transport_line
(
options
,
"bad bad"
,
1
);
test_assert
(
r
<
0
);
/* Test transport list parsing */
r
=
parse_client_transport_line
(
options
,
"transport_1 exec /usr/bin/fake-transport"
,
1
);
test_assert
(
r
==
0
);
r
=
parse_server_transport_line
(
options
,
"transport_1 exec /usr/bin/fake-transport"
,
1
);
test_assert
(
r
==
0
);
r
=
parse_client_transport_line
(
options
,
"transport_1,transport_2 exec /usr/bin/fake-transport"
,
1
);
test_assert
(
r
==
0
);
r
=
parse_server_transport_line
(
options
,
"transport_1,transport_2 exec /usr/bin/fake-transport"
,
1
);
test_assert
(
r
==
0
);
/* Bad transport identifiers */
r
=
parse_client_transport_line
(
options
,
"transport_* exec /usr/bin/fake-transport"
,
1
);
test_assert
(
r
<
0
);
r
=
parse_server_transport_line
(
options
,
"transport_* exec /usr/bin/fake-transport"
,
1
);
test_assert
(
r
<
0
);
/* Check SOCKS cases for client transport */
r
=
parse_client_transport_line
(
options
,
"transport_1 socks4 1.2.3.4:567"
,
1
);
test_assert
(
r
==
0
);
r
=
parse_client_transport_line
(
options
,
"transport_1 socks5 1.2.3.4:567"
,
1
);
test_assert
(
r
==
0
);
/* Proxy case for server transport */
r
=
parse_server_transport_line
(
options
,
"transport_1 proxy 1.2.3.4:567"
,
1
);
test_assert
(
r
==
0
);
/* Multiple-transport error exit */
r
=
parse_client_transport_line
(
options
,
"transport_1,transport_2 socks5 1.2.3.4:567"
,
1
);
test_assert
(
r
<
0
);
r
=
parse_server_transport_line
(
options
,
"transport_1,transport_2 proxy 1.2.3.4:567"
,
1
);
/* No port error exit */
r
=
parse_client_transport_line
(
options
,
"transport_1 socks5 1.2.3.4"
,
1
);
test_assert
(
r
<
0
);
r
=
parse_server_transport_line
(
options
,
"transport_1 proxy 1.2.3.4"
,
1
);
test_assert
(
r
<
0
);
/* Unparsable address error exit */
r
=
parse_client_transport_line
(
options
,
"transport_1 socks5 1.2.3:6x7"
,
1
);
test_assert
(
r
<
0
);
r
=
parse_server_transport_line
(
options
,
"transport_1 proxy 1.2.3:6x7"
,
1
);
test_assert
(
r
<
0
);
/* "Strange {Client|Server}TransportPlugin field" error exit */
r
=
parse_client_transport_line
(
options
,
"transport_1 foo bar"
,
1
);
test_assert
(
r
<
0
);
r
=
parse_server_transport_line
(
options
,
"transport_1 foo bar"
,
1
);
test_assert
(
r
<
0
);
/* No sandbox mode error exit */
tmp
=
options
->
Sandbox
;
options
->
Sandbox
=
1
;
r
=
parse_client_transport_line
(
options
,
"transport_1 exec /usr/bin/fake-transport"
,
1
);
test_assert
(
r
<
0
);
r
=
parse_server_transport_line
(
options
,
"transport_1 exec /usr/bin/fake-transport"
,
1
);
test_assert
(
r
<
0
);
options
->
Sandbox
=
tmp
;
/*
* These final test cases cover code paths that only activate without
* validate_only, so they need mocks in place.
*/
MOCK
(
pt_kickstart_proxy
,
pt_kickstart_proxy_mock
);
old_pt_kickstart_proxy_mock_call_count
=
pt_kickstart_proxy_mock_call_count
;
r
=
parse_server_transport_line
(
options
,
"transport_1 exec /usr/bin/fake-transport"
,
0
);
test_assert
(
r
==
0
);
test_assert
(
pt_kickstart_proxy_mock_call_count
==
old_pt_kickstart_proxy_mock_call_count
+
1
);
UNMOCK
(
pt_kickstart_proxy
);
/* This one hits a log line in the !validate_only case only */
r
=
parse_server_transport_line
(
options
,
"transport_1 proxy 1.2.3.4:567"
,
0
);
test_assert
(
r
==
0
);
/* Check mocked client transport cases */
MOCK
(
pt_kickstart_proxy
,
pt_kickstart_proxy_mock
);
MOCK
(
transport_add_from_config
,
transport_add_from_config_mock
);
MOCK
(
transport_is_needed
,
transport_is_needed_mock
);
/* Unnecessary transport case */
transport_is_needed_mock_return
=
0
;
old_pt_kickstart_proxy_mock_call_count
=
pt_kickstart_proxy_mock_call_count
;
old_transport_add_from_config_mock_call_count
=
transport_add_from_config_mock_call_count
;
old_transport_is_needed_mock_call_count
=
transport_is_needed_mock_call_count
;
r
=
parse_client_transport_line
(
options
,
"transport_1 exec /usr/bin/fake-transport"
,
0
);
/* Should have succeeded */
test_assert
(
r
==
0
);
/* transport_is_needed() should have been called */
test_assert
(
transport_is_needed_mock_call_count
==
old_transport_is_needed_mock_call_count
+
1
);
/*
* pt_kickstart_proxy() and transport_add_from_config() should
* not have been called.
*/
test_assert
(
pt_kickstart_proxy_mock_call_count
==
old_pt_kickstart_proxy_mock_call_count
);
test_assert
(
transport_add_from_config_mock_call_count
==
old_transport_add_from_config_mock_call_count
);
/* Necessary transport case */
transport_is_needed_mock_return
=
1
;
old_pt_kickstart_proxy_mock_call_count
=
pt_kickstart_proxy_mock_call_count
;
old_transport_add_from_config_mock_call_count
=
transport_add_from_config_mock_call_count
;
old_transport_is_needed_mock_call_count
=
transport_is_needed_mock_call_count
;
r
=
parse_client_transport_line
(
options
,
"transport_1 exec /usr/bin/fake-transport"
,
0
);
/* Should have succeeded */
test_assert
(
r
==
0
);
/*
* transport_is_needed() and pt_kickstart_proxy() should have been
* called.
*/
test_assert
(
pt_kickstart_proxy_mock_call_count
==
old_pt_kickstart_proxy_mock_call_count
+
1
);
test_assert
(
transport_is_needed_mock_call_count
==
old_transport_is_needed_mock_call_count
+
1
);
/* transport_add_from_config() should not have been called. */
test_assert
(
transport_add_from_config_mock_call_count
==
old_transport_add_from_config_mock_call_count
);
/* proxy case */
transport_is_needed_mock_return
=
1
;
old_pt_kickstart_proxy_mock_call_count
=
pt_kickstart_proxy_mock_call_count
;
old_transport_add_from_config_mock_call_count
=
transport_add_from_config_mock_call_count
;
old_transport_is_needed_mock_call_count
=
transport_is_needed_mock_call_count
;
r
=
parse_client_transport_line
(
options
,
"transport_1 socks5 1.2.3.4:567"
,
0
);
/* Should have succeeded */
test_assert
(
r
==
0
);
/*
* transport_is_needed() and transport_add_from_config() should have
* been called.
*/
test_assert
(
transport_add_from_config_mock_call_count
==
old_transport_add_from_config_mock_call_count
+
1
);
test_assert
(
transport_is_needed_mock_call_count
==
old_transport_is_needed_mock_call_count
+
1
);
/* pt_kickstart_proxy() should not have been called. */
test_assert
(
pt_kickstart_proxy_mock_call_count
==
old_pt_kickstart_proxy_mock_call_count
);
/* Done with mocked client transport cases */
UNMOCK
(
transport_is_needed
);
UNMOCK
(
transport_add_from_config
);
UNMOCK
(
pt_kickstart_proxy
);
done:
/* Make sure we undo all mocks */
UNMOCK
(
pt_kickstart_proxy
);
UNMOCK
(
transport_add_from_config
);
UNMOCK
(
transport_is_needed
);
return
;
}
// Tests if an options with MyFamily fingerprints missing '$' normalises
// them correctly and also ensure it also works with multiple fingerprints
static
void
...
...
@@ -596,6 +843,7 @@ struct testcase_t config_tests[] = {
CONFIG_TEST
(
addressmap
,
0
),
CONFIG_TEST
(
parse_bridge_line
,
0
),
CONFIG_TEST
(
parse_transport_options_line
,
0
),
CONFIG_TEST
(
parse_transport_plugin_line
,
TT_FORK
),
CONFIG_TEST
(
check_or_create_data_subdir
,
TT_FORK
),
CONFIG_TEST
(
write_to_data_subdir
,
TT_FORK
),
CONFIG_TEST
(
fix_my_family
,
0
),
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment