Add regression test for SO_REUSEADDR

This commit is contained in:
Yuke Peng 2024-08-26 09:50:10 +08:00 committed by Tate, Hongliang Tian
parent 434f143e30
commit 7b58d97aa2
2 changed files with 82 additions and 0 deletions

View File

@ -205,6 +205,47 @@ FN_TEST(bind)
}
END_TEST()
FN_TEST(bind_reuseaddr)
{
sk_addr.sin_port = htons(8081);
struct sockaddr *psaddr = (struct sockaddr *)&sk_addr;
socklen_t addrlen = sizeof(sk_addr);
int disable = 0;
int enable = 1;
int sk1 = TEST_SUCC(socket(PF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0));
int sk2 = TEST_SUCC(socket(PF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0));
TEST_SUCC(bind(sk1, psaddr, addrlen));
TEST_ERRNO(bind(sk2, psaddr, addrlen), EADDRINUSE);
// FIXME: The test will fail in Asterinas since it doesn't check
// if the previous socket was bound with `SO_REUSEADDR`
//
// TEST_SUCC(setsockopt(sk1, SOL_SOCKET, SO_REUSEADDR, &disable,
// sizeof(disable)));
// TEST_SUCC(setsockopt(sk2, SOL_SOCKET, SO_REUSEADDR, &enable,
// sizeof(enable)));
// TEST_ERRNO(bind(sk2, psaddr, addrlen), EADDRINUSE);
TEST_SUCC(setsockopt(sk1, SOL_SOCKET, SO_REUSEADDR, &enable,
sizeof(enable)));
TEST_SUCC(setsockopt(sk2, SOL_SOCKET, SO_REUSEADDR, &disable,
sizeof(disable)));
TEST_ERRNO(bind(sk2, psaddr, addrlen), EADDRINUSE);
TEST_SUCC(setsockopt(sk1, SOL_SOCKET, SO_REUSEADDR, &enable,
sizeof(enable)));
TEST_SUCC(setsockopt(sk2, SOL_SOCKET, SO_REUSEADDR, &enable,
sizeof(enable)));
TEST_SUCC(bind(sk2, psaddr, addrlen));
TEST_SUCC(close(sk1));
TEST_SUCC(close(sk2));
}
END_TEST()
FN_TEST(listen)
{
// The second `listen` does nothing but succeed.

View File

@ -154,6 +154,47 @@ FN_TEST(bind)
}
END_TEST()
FN_TEST(bind_reuseaddr)
{
sk_addr.sin_port = htons(8081);
struct sockaddr *psaddr = (struct sockaddr *)&sk_addr;
socklen_t addrlen = sizeof(sk_addr);
int disable = 0;
int enable = 1;
int sk1 = TEST_SUCC(socket(PF_INET, SOCK_DGRAM | SOCK_NONBLOCK, 0));
int sk2 = TEST_SUCC(socket(PF_INET, SOCK_DGRAM | SOCK_NONBLOCK, 0));
TEST_SUCC(bind(sk1, psaddr, addrlen));
TEST_ERRNO(bind(sk2, psaddr, addrlen), EADDRINUSE);
// FIXME: The test will fail in Asterinas since it doesn't check
// if the previous socket was bound with `SO_REUSEADDR`
//
// TEST_SUCC(setsockopt(sk1, SOL_SOCKET, SO_REUSEADDR, &disable,
// sizeof(disable)));
// TEST_SUCC(setsockopt(sk2, SOL_SOCKET, SO_REUSEADDR, &enable,
// sizeof(enable)));
// TEST_ERRNO(bind(sk2, psaddr, addrlen), EADDRINUSE);
TEST_SUCC(setsockopt(sk1, SOL_SOCKET, SO_REUSEADDR, &enable,
sizeof(enable)));
TEST_SUCC(setsockopt(sk2, SOL_SOCKET, SO_REUSEADDR, &disable,
sizeof(disable)));
TEST_ERRNO(bind(sk2, psaddr, addrlen), EADDRINUSE);
TEST_SUCC(setsockopt(sk1, SOL_SOCKET, SO_REUSEADDR, &enable,
sizeof(enable)));
TEST_SUCC(setsockopt(sk2, SOL_SOCKET, SO_REUSEADDR, &enable,
sizeof(enable)));
TEST_SUCC(bind(sk2, psaddr, addrlen));
TEST_SUCC(close(sk1));
TEST_SUCC(close(sk2));
}
END_TEST()
FN_TEST(listen)
{
TEST_ERRNO(listen(sk_unbound, 2), EOPNOTSUPP);