Skip to content

Commit 04b3f82

Browse files
committed
Added more core tests for Socket/Address --filter=[core]
1 parent 861be81 commit 04b3f82

File tree

4 files changed

+215
-72
lines changed

4 files changed

+215
-72
lines changed

core-tests/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@
22
.cmake/
33
Testing/
44
build.ninja
5+
.ninja_deps
6+
.ninja_log

core-tests/src/network/address.cpp

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
/*
2+
+----------------------------------------------------------------------+
3+
| Swoole |
4+
+----------------------------------------------------------------------+
5+
| This source file is subject to version 2.0 of the Apache license, |
6+
| that is bundled with this package in the file LICENSE, and is |
7+
| available through the world-wide-web at the following url: |
8+
| http://www.apache.org/licenses/LICENSE-2.0.html |
9+
| If you did not receive a copy of the Apache2.0 license and are unable|
10+
| to obtain it through the world-wide-web, please send a note to |
11+
| [email protected] so we can mail you a copy immediately. |
12+
+----------------------------------------------------------------------+
13+
| @link https://www.swoole.com/ |
14+
| @contact [email protected] |
15+
| @license https://github.com/swoole/swoole-src/blob/master/LICENSE |
16+
| @Author Tianfeng Han <[email protected]> |
17+
+----------------------------------------------------------------------+
18+
*/
19+
20+
#include "test_core.h"
21+
22+
using swoole::network::Address;
23+
24+
TEST(address, basic) {
25+
Address address{};
26+
ASSERT_TRUE(address.empty());
27+
ASSERT_TRUE(address.assign(SW_SOCK_TCP, TEST_DOMAIN_BAIDU, 80, true));
28+
address.set_port(443);
29+
ASSERT_EQ(address.get_port(), 443);
30+
}
31+
32+
TEST(address, dns_fail) {
33+
Address address{};
34+
ASSERT_FALSE(address.assign(SW_SOCK_TCP, TEST_DOMAIN_BAIDU "not-exists", 80, true));
35+
ASSERT_ERREQ(SW_ERROR_DNSLOOKUP_RESOLVE_FAILED);
36+
}
37+
38+
TEST(address, path_to_long) {
39+
Address address{};
40+
swoole::String path;
41+
path.repeat("HELLO", 5, 128);
42+
ASSERT_FALSE(address.assign(SW_SOCK_UNIX_DGRAM, path.to_std_string()));
43+
ASSERT_ERREQ(SW_ERROR_NAME_TOO_LONG);
44+
}
45+
46+
TEST(address, bad_type) {
47+
Address address{};
48+
ASSERT_FALSE(address.assign((swSocketType)(SW_SOCK_RAW6 + 9), TEST_DOMAIN_BAIDU));
49+
ASSERT_ERREQ(SW_ERROR_BAD_SOCKET_TYPE);
50+
}
51+
52+
TEST(address, type_str) {
53+
ASSERT_STREQ(Address::type_str(SW_SOCK_TCP), "IPv4");
54+
ASSERT_STREQ(Address::type_str(SW_SOCK_UNIX_STREAM), "UnixSocket");
55+
ASSERT_STREQ(Address::type_str(SW_SOCK_TCP6), "IPv6");
56+
ASSERT_STREQ(Address::type_str((swSocketType)(SW_SOCK_RAW6 + 9)), "Unknown");
57+
}
58+
59+
TEST(address, is_loopback_addr) {
60+
Address address{};
61+
ASSERT_TRUE(address.assign(SW_SOCK_TCP, TEST_DOMAIN_BAIDU, 80, true));
62+
ASSERT_FALSE(address.is_loopback_addr());
63+
64+
ASSERT_TRUE(address.assign(SW_SOCK_TCP, TEST_HOST, 80, true));
65+
ASSERT_TRUE(address.is_loopback_addr());
66+
67+
ASSERT_TRUE(address.assign(SW_SOCK_TCP6, "::1", 80, true));
68+
ASSERT_TRUE(address.is_loopback_addr());
69+
70+
ASSERT_TRUE(address.assign(SW_SOCK_TCP6, TEST_HTTP_DOMAIN, 443, true));
71+
ASSERT_FALSE(address.is_loopback_addr());
72+
73+
ASSERT_TRUE(address.assign(SW_SOCK_UNIX_DGRAM, TEST_LOG_FILE));
74+
ASSERT_FALSE(address.is_loopback_addr());
75+
}
76+
77+
TEST(address, ipv4_addr) {
78+
auto sock = swoole::make_socket(SW_SOCK_TCP, SW_FD_STREAM, 0);
79+
Address addr;
80+
81+
ASSERT_TRUE(addr.assign("tcp://127.0.0.1:12345"));
82+
ASSERT_EQ(sock->connect(addr), SW_ERR);
83+
ASSERT_EQ(errno, ECONNREFUSED);
84+
85+
ASSERT_TRUE(addr.assign("tcp://localhost:12345"));
86+
ASSERT_EQ(sock->connect(addr), SW_ERR);
87+
ASSERT_EQ(errno, ECONNREFUSED);
88+
89+
sock->free();
90+
}
91+
92+
TEST(address, ipv6_addr) {
93+
auto sock = swoole::make_socket(SW_SOCK_TCP6, SW_FD_STREAM, 0);
94+
Address addr;
95+
96+
ASSERT_TRUE(addr.assign("tcp://[::1]:12345"));
97+
ASSERT_EQ(sock->connect(addr), SW_ERR);
98+
ASSERT_EQ(errno, ECONNREFUSED);
99+
100+
ASSERT_TRUE(addr.assign("tcp://[ip6-localhost]:12345"));
101+
ASSERT_EQ(sock->connect(addr), SW_ERR);
102+
ASSERT_EQ(errno, ECONNREFUSED);
103+
104+
sock->free();
105+
}
106+
107+
TEST(address, unix_addr) {
108+
auto sock = swoole::make_socket(SW_SOCK_UNIX_STREAM, SW_FD_STREAM, 0);
109+
Address addr;
110+
ASSERT_TRUE(addr.assign("unix:///tmp/swoole-not-exists.sock"));
111+
ASSERT_EQ(sock->connect(addr), SW_ERR);
112+
ASSERT_EQ(errno, ENOENT);
113+
sock->free();
114+
}
115+
116+
TEST(address, bad_addr) {
117+
Address addr;
118+
ASSERT_FALSE(addr.assign("test://[::1]:12345"));
119+
ASSERT_EQ(swoole_get_last_error(), SW_ERROR_BAD_HOST_ADDR);
120+
}
121+
122+
TEST(address, bad_port) {
123+
Address addr;
124+
ASSERT_FALSE(addr.assign("tcp://[::1]:92345"));
125+
ASSERT_EQ(swoole_get_last_error(), SW_ERROR_BAD_PORT);
126+
}
127+
128+
TEST(address, loopback_addr) {
129+
Address addr1;
130+
addr1.assign(SW_SOCK_TCP, "127.0.0.1", 0);
131+
ASSERT_TRUE(addr1.is_loopback_addr());
132+
133+
Address addr2;
134+
addr2.assign(SW_SOCK_TCP6, "::1", 0);
135+
ASSERT_TRUE(addr1.is_loopback_addr());
136+
137+
Address addr3;
138+
addr3.assign(SW_SOCK_TCP, "192.168.1.2", 0);
139+
ASSERT_FALSE(addr3.is_loopback_addr());
140+
141+
Address addr4;
142+
addr4.assign(SW_SOCK_TCP6, "192::66::88", 0);
143+
ASSERT_FALSE(addr4.is_loopback_addr());
144+
}

core-tests/src/network/socket.cpp

Lines changed: 64 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,70 @@ TEST(socket, connect_sync) {
4949
ASSERT_EQ(sock->connect_sync(sa, 0.3), SW_ERR);
5050
ASSERT_EQ(swoole_get_last_error(), ECONNREFUSED);
5151
sock->free();
52+
53+
sock = make_socket(SW_SOCK_TCP, SW_FD_STREAM, 0);
54+
ASSERT_NE(sock, nullptr);
55+
sa.assign(SW_SOCK_TCP, TEST_HTTP_DOMAIN, 80);
56+
ASSERT_EQ(sock->connect_sync(sa, 0.3), SW_OK);
57+
sock->free();
58+
}
59+
60+
TEST(socket, fail) {
61+
auto *sock = make_socket(SW_SOCK_TCP, SW_FD_STREAM, 0);
62+
ASSERT_NE(sock, nullptr);
63+
64+
network::Address sa;
65+
sa.assign(SW_SOCK_TCP, TEST_HTTP_DOMAIN, 80);
66+
ASSERT_EQ(sock->connect_sync(sa, 0.3), SW_OK);
67+
68+
close(sock->get_fd());
69+
70+
ASSERT_EQ(sock->get_name(), -1);
71+
ASSERT_EQ(errno, EBADF);
72+
73+
network::Address peer;
74+
ASSERT_EQ(sock->get_peer_name(&peer), -1);
75+
ASSERT_EQ(errno, EBADF);
76+
77+
ASSERT_EQ(sock->set_tcp_nopush(1), -1);
78+
ASSERT_EQ(sock->listen(1), -1);
79+
80+
ASSERT_FALSE(sock->set_buffer_size(1));
81+
ASSERT_FALSE(sock->set_recv_buffer_size(1));
82+
ASSERT_FALSE(sock->set_send_buffer_size(1));
83+
84+
ASSERT_FALSE(sock->set_tcp_nodelay());
85+
ASSERT_FALSE(sock->cork());
86+
ASSERT_FALSE(sock->uncork());
87+
88+
ASSERT_FALSE(sock->set_recv_timeout(0.1));
89+
ASSERT_FALSE(sock->set_send_timeout(0.1));
90+
91+
sock->move_fd();
92+
sock->free();
93+
}
94+
95+
TEST(socket, ssl_fail) {
96+
sysv_signal(SIGPIPE, SIG_IGN);
97+
network::Client client(SW_SOCK_TCP, false);
98+
client.enable_ssl_encrypt();
99+
100+
ASSERT_EQ(client.connect(TEST_DOMAIN_BAIDU, 443, -1, 0), 0);
101+
ASSERT_EQ(client.shutdown(SHUT_WR), 0);
102+
103+
ASSERT_EQ(client.get_socket()->ssl_send(SW_STRL(TEST_STR)), SW_ERR);
104+
ASSERT_EQ(errno, SW_ERROR_SSL_RESET);
105+
106+
ASSERT_EQ(client.shutdown(SHUT_RD), 0);
107+
108+
char buf[1024];
109+
errno = 0;
110+
ASSERT_EQ(client.get_socket()->ssl_recv(SW_STRL(buf)), 0);
111+
ASSERT_EQ(errno, 0);
112+
ASSERT_EQ(close(client.get_socket()->get_fd()), 0);
113+
client.get_socket()->move_fd();
114+
115+
ASSERT_EQ(client.get_socket()->ssl_recv(SW_STRL(buf)), 0);
52116
}
53117

54118
TEST(socket, sendto) {
@@ -501,75 +565,6 @@ TEST(socket, dup) {
501565
test_socket_sync(sock_2, false);
502566
}
503567

504-
TEST(socket, ipv4_addr) {
505-
auto sock = make_socket(SW_SOCK_TCP, SW_FD_STREAM, 0);
506-
network::Address addr;
507-
508-
ASSERT_TRUE(addr.assign("tcp://127.0.0.1:12345"));
509-
ASSERT_EQ(sock->connect(addr), SW_ERR);
510-
ASSERT_EQ(errno, ECONNREFUSED);
511-
512-
ASSERT_TRUE(addr.assign("tcp://localhost:12345"));
513-
ASSERT_EQ(sock->connect(addr), SW_ERR);
514-
ASSERT_EQ(errno, ECONNREFUSED);
515-
516-
sock->free();
517-
}
518-
519-
TEST(socket, ipv6_addr) {
520-
auto sock = make_socket(SW_SOCK_TCP6, SW_FD_STREAM, 0);
521-
network::Address addr;
522-
523-
ASSERT_TRUE(addr.assign("tcp://[::1]:12345"));
524-
ASSERT_EQ(sock->connect(addr), SW_ERR);
525-
ASSERT_EQ(errno, ECONNREFUSED);
526-
527-
ASSERT_TRUE(addr.assign("tcp://[ip6-localhost]:12345"));
528-
ASSERT_EQ(sock->connect(addr), SW_ERR);
529-
ASSERT_EQ(errno, ECONNREFUSED);
530-
531-
sock->free();
532-
}
533-
534-
TEST(socket, unix_addr) {
535-
auto sock = make_socket(SW_SOCK_UNIX_STREAM, SW_FD_STREAM, 0);
536-
network::Address addr;
537-
ASSERT_TRUE(addr.assign("unix:///tmp/swoole-not-exists.sock"));
538-
ASSERT_EQ(sock->connect(addr), SW_ERR);
539-
ASSERT_EQ(errno, ENOENT);
540-
sock->free();
541-
}
542-
543-
TEST(socket, bad_addr) {
544-
network::Address addr;
545-
ASSERT_FALSE(addr.assign("test://[::1]:12345"));
546-
ASSERT_EQ(swoole_get_last_error(), SW_ERROR_BAD_HOST_ADDR);
547-
}
548-
549-
TEST(socket, bad_port) {
550-
network::Address addr;
551-
ASSERT_FALSE(addr.assign("tcp://[::1]:92345"));
552-
ASSERT_EQ(swoole_get_last_error(), SW_ERROR_BAD_PORT);
553-
}
554-
555-
TEST(socket, loopback_addr) {
556-
network::Address addr1;
557-
addr1.assign(SW_SOCK_TCP, "127.0.0.1", 0);
558-
ASSERT_TRUE(addr1.is_loopback_addr());
559-
560-
network::Address addr2;
561-
addr2.assign(SW_SOCK_TCP6, "::1", 0);
562-
ASSERT_TRUE(addr1.is_loopback_addr());
563-
564-
network::Address addr3;
565-
addr3.assign(SW_SOCK_TCP, "192.168.1.2", 0);
566-
ASSERT_FALSE(addr3.is_loopback_addr());
567-
568-
network::Address addr4;
569-
addr4.assign(SW_SOCK_TCP6, "192::66::88", 0);
570-
ASSERT_FALSE(addr4.is_loopback_addr());
571-
}
572-
573568
TEST(socket, convert_to_type) {
574569
ASSERT_EQ(network::Socket::convert_to_type(AF_INET, SOCK_STREAM), SW_SOCK_TCP);
575570
ASSERT_EQ(network::Socket::convert_to_type(AF_INET6, SOCK_STREAM), SW_SOCK_TCP6);

src/network/client.cc

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -454,9 +454,6 @@ int Client::close() {
454454
}
455455
closed = true;
456456

457-
int fd = socket->fd;
458-
assert(fd != 0);
459-
460457
#ifdef SW_USE_OPENSSL
461458
if (open_ssl && ssl_context) {
462459
if (socket->ssl) {
@@ -486,9 +483,14 @@ int Client::close() {
486483
active = false;
487484
}
488485

486+
if (socket->fd == -1) {
487+
return SW_OK;
488+
}
489+
489490
/**
490491
* fd marked -1, prevent double close
491492
*/
493+
const int fd = socket->fd;
492494
socket->fd = -1;
493495
swoole_trace_log(SW_TRACE_CLIENT, "fd=%d", fd);
494496

0 commit comments

Comments
 (0)