xref: /haiku/src/tests/system/network/posixnet/SocketTests.cpp (revision a5061ecec55353a5f394759473f1fd6df04890da)
1 #include "SocketTests.h"
2 
3 #include <netinet/in.h>
4 #include <stdio.h>
5 #include <string.h>
6 #include <sys/socket.h>
7 #include <unistd.h>
8 
9 #include <cppunit/TestAssert.h>
10 #include <cppunit/TestCaller.h>
11 #include <cppunit/TestSuite.h>
12 
13 
14 // This test reproduces a KDL from issue #13927 where a socket is created
15 // and an attempt is made to connect to an address, which fails. The socket
16 // is closed and then reused to connect to a *different* address.
17 void SocketTests::ClientSocketReuseTest()
18 {
19 	// TODO: Try to find unused ports instead of using these hard-coded ones.
20 	const uint16_t kFirstPort = 14025;
21 	const uint16_t kSecondPort = 14026;
22 
23 	int fd = ::socket(AF_INET, SOCK_STREAM, 0);
24 	CPPUNIT_ASSERT(fd > 0);
25 
26 	// Connect to 127.0.0.1:kFirstPort
27 	sockaddr_in address;
28 	memset(&address, 0, sizeof(sockaddr_in));
29 	address.sin_family = AF_INET;
30 	address.sin_port = htons(kFirstPort);
31 	address.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
32 
33 	int connect_result = ::connect(
34 		fd,
35 		reinterpret_cast<const sockaddr *>(&address),
36 		sizeof(struct sockaddr));
37 	CPPUNIT_ASSERT_EQUAL(connect_result, -1);
38 
39 	// Connection to 127.0.0.1:kFirstPort failed as expected.
40 	// Now try connecting to 127.0.0.1:kSecondPort.
41 	address.sin_port = htons(kSecondPort);
42 	connect_result = ::connect(
43 		fd,
44 		reinterpret_cast<const sockaddr *>(&address),
45 		sizeof(struct sockaddr));
46 	CPPUNIT_ASSERT_EQUAL(connect_result, -1);
47 
48 	close(fd);
49 }
50 
51 
52 void SocketTests::AddTests(BTestSuite &parent) {
53 	CppUnit::TestSuite &suite = *new CppUnit::TestSuite("SocketTests");
54 
55 	suite.addTest(new CppUnit::TestCaller<SocketTests>(
56 		"SocketTests::ClientSocketReuseTest",
57 		&SocketTests::ClientSocketReuseTest));
58 
59 	parent.addTest("SocketTests", &suite);
60 }
61