summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorAndreas Schneider <asn@cryptomilk.org>2014-05-14 18:08:38 +0200
committerMichael Adam <obnox@samba.org>2014-05-22 12:05:37 +0200
commit916a02d1f155c98f689e5ebb545331dc0f48ac2a (patch)
treee85ad66903fe0860cefb62db0b1c45e693c58f50 /tests
parent9b45102df0bf3dc817533d6e478fdf56852d2db5 (diff)
downloadsocket_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.c58
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);