diff options
author | Andreas Schneider <asn@cryptomilk.org> | 2014-05-14 18:08:38 +0200 |
---|---|---|
committer | Michael Adam <obnox@samba.org> | 2014-05-22 12:05:37 +0200 |
commit | 916a02d1f155c98f689e5ebb545331dc0f48ac2a (patch) | |
tree | e85ad66903fe0860cefb62db0b1c45e693c58f50 /tests | |
parent | 9b45102df0bf3dc817533d6e478fdf56852d2db5 (diff) | |
download | socket_wrapper-916a02d1f155c98f689e5ebb545331dc0f48ac2a.tar.gz socket_wrapper-916a02d1f155c98f689e5ebb545331dc0f48ac2a.tar.xz socket_wrapper-916a02d1f155c98f689e5ebb545331dc0f48ac2a.zip |
tests: Add test for different length passed to get(sock|peer)name.
Signed-off-by: Andreas Schneider <asn@cryptomilk.org>
Reviewed-by: Michael Adam <obnox@samba.org>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test_echo_tcp_get_peer_sock_name.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/tests/test_echo_tcp_get_peer_sock_name.c b/tests/test_echo_tcp_get_peer_sock_name.c index 9be7a4b..8bbc81d 100644 --- a/tests/test_echo_tcp_get_peer_sock_name.c +++ b/tests/test_echo_tcp_get_peer_sock_name.c @@ -331,6 +331,61 @@ static void test_connect_getsockname_getpeername_any_port(void **state) close(s); } +static void test_connect_getsockname_getpeername_len(void **state) +{ + struct sockaddr_in sin; + socklen_t slen = sizeof(struct sockaddr_in); + struct sockaddr_storage cli_ss1; + socklen_t cli_ss1_len; + struct sockaddr_storage srv_ss1; + socklen_t srv_ss1_len; + socklen_t tmp_len; + int rc; + int s; + + (void) state; /* unused */ + + s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + assert_return_code(s, errno); + + /* connect */ + ZERO_STRUCT(sin); + sin.sin_family = AF_INET; + sin.sin_port = htons(torture_server_port()); + rc = inet_pton(AF_INET, torture_server_address(AF_INET), &sin.sin_addr); + assert_int_equal(rc, 1); + + /* Connect */ + rc = connect(s, (struct sockaddr *)&sin, slen); + assert_return_code(rc, errno); + + /* Check with len=0 */ + ZERO_STRUCT(cli_ss1); + cli_ss1_len = 0; + rc = getsockname(s, (struct sockaddr *)&cli_ss1, &cli_ss1_len); + assert_return_code(rc, errno); + + ZERO_STRUCT(srv_ss1); + srv_ss1_len = 0; + rc = getpeername(s, (struct sockaddr *)&srv_ss1, &srv_ss1_len); + assert_return_code(rc, errno); + + /* Check with len=too small */ + ZERO_STRUCT(cli_ss1); + tmp_len = cli_ss1_len = sizeof(struct sockaddr_in) - 2; + rc = getsockname(s, (struct sockaddr *)&cli_ss1, &cli_ss1_len); + assert_return_code(rc, errno); + assert_int_equal(tmp_len + 2, cli_ss1_len); + + ZERO_STRUCT(srv_ss1); + tmp_len = srv_ss1_len = sizeof(struct sockaddr_in) - 2; + rc = getpeername(s, (struct sockaddr *)&srv_ss1, &srv_ss1_len); + assert_return_code(rc, errno); + assert_int_equal(tmp_len + 2, srv_ss1_len); + + close(s); +} + int main(void) { int rc; @@ -347,6 +402,9 @@ int main(void) { unit_test_setup_teardown(test_connect_getsockname_getpeername_any_port, setup_echo_srv_tcp_ipv4, teardown), + unit_test_setup_teardown(test_connect_getsockname_getpeername_len, + setup_echo_srv_tcp_ipv4, + teardown), }; rc = run_tests(tests); |