Skip to content

Commit 4662418

Browse files
saiarcot895kellyyeh
authored andcommitted
Improve test cases
* Add a couple of negative test cases. * For sockets being created, add some basic sanity checks to make sure the sockets were actually opened and they are UDP sockets. * Always compile the tests with ASAN, to catch any potential issues. * Run the tests with sudo to actually allow opening raw sockets. Signed-off-by: Saikrishna Arcot <[email protected]>
1 parent 2f5e1a6 commit 4662418

File tree

2 files changed

+72
-55
lines changed

2 files changed

+72
-55
lines changed

Makefile

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ GCOVR := gcovr
1111
override LDLIBS += -levent -lhiredis -lswsscommon -pthread -lboost_thread -lboost_system
1212
override CPPFLAGS += -Wall -std=c++17 -fPIE -I/usr/include/swss
1313
override CPPFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)"
14-
CPPFLAGS_TEST := --coverage -fprofile-arcs -ftest-coverage -fprofile-generate
15-
LDLIBS_TEST := --coverage -lgtest -pthread -lstdc++fs
14+
CPPFLAGS_TEST := --coverage -fprofile-arcs -ftest-coverage -fprofile-generate -fsanitize=address
15+
LDLIBS_TEST := --coverage -lgtest -pthread -lstdc++fs -fsanitize=address
1616
PWD := $(shell pwd)
1717

1818
all: $(DHCP6RELAY_TARGET) $(DHCP6RELAY_TEST_TARGET)
@@ -46,7 +46,7 @@ $(DHCP6RELAY_TEST_TARGET): $(TEST_OBJS)
4646
$(CXX) $(LDFLAGS) $^ $(LDLIBS) $(LDLIBS_TEST) -o $@
4747

4848
test: $(DHCP6RELAY_TEST_TARGET)
49-
./$(DHCP6RELAY_TEST_TARGET) --gtest_output=xml:$(DHCP6RELAY_TEST_TARGET)-test-result.xml || true
49+
sudo ASAN_OPTIONS=detect_leaks=0 ./$(DHCP6RELAY_TEST_TARGET) --gtest_output=xml:$(DHCP6RELAY_TEST_TARGET)-test-result.xml || true
5050
$(GCOVR) -r ./ --html --html-details -o $(DHCP6RELAY_TEST_TARGET)-code-coverage.html
5151
$(GCOVR) -r ./ --xml-pretty -o $(DHCP6RELAY_TEST_TARGET)-code-coverage.xml
5252

test/MockRelay.cpp

+69-52
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88

99
#include "MockRelay.h"
1010

11-
uint32_t openSockCount = 0;
12-
uint32_t prepareSockCount = 0;
11+
extern struct event_base *base;
12+
extern struct event *ev_sigint;
13+
extern struct event *ev_sigterm;
1314

1415
static struct sock_filter ether_relay_filter[] = {
1516

@@ -204,24 +205,66 @@ TEST(parsePacket, relay_forward)
204205

205206
TEST(sock, sock_open)
206207
{
207-
sock_fprog ether_relay_fprog = {0,{}};
208-
int index = 0;
209-
if (!index) {
210-
errno = EINVAL;
211-
}
212-
EXPECT_EQ(errno, EINVAL);
213-
openSockCount++;
214-
int filter = sock_open(index, &ether_relay_fprog);
215-
EXPECT_EQ(1, openSockCount);
208+
struct sock_filter ether_relay_filter[] = {
209+
{ 0x6, 0, 0, 0x00040000 },
210+
};
211+
const struct sock_fprog ether_relay_fprog = {
212+
lengthof(ether_relay_filter),
213+
ether_relay_filter
214+
};
215+
int index = if_nametoindex("lo");
216+
EXPECT_GE(sock_open(index, &ether_relay_fprog), 0);
217+
}
218+
219+
TEST(sock, sock_open_invalid_filter)
220+
{
221+
const struct sock_fprog ether_relay_fprog = {0,{}};
222+
int index = if_nametoindex("lo");
223+
EXPECT_EQ(sock_open(index, &ether_relay_fprog), -1);
224+
}
225+
226+
TEST(sock, sock_open_invalid_ifindex_zero)
227+
{
228+
struct sock_filter ether_relay_filter[] = {
229+
{ 0x6, 0, 0, 0x00040000 },
230+
};
231+
const struct sock_fprog ether_relay_fprog = {
232+
lengthof(ether_relay_filter),
233+
ether_relay_filter
234+
};
235+
EXPECT_EQ(sock_open(0, &ether_relay_fprog), -1);
236+
}
237+
238+
TEST(sock, sock_open_invalid_ifindex)
239+
{
240+
struct sock_filter ether_relay_filter[] = {
241+
{ 0x6, 0, 0, 0x00040000 },
242+
};
243+
const struct sock_fprog ether_relay_fprog = {
244+
lengthof(ether_relay_filter),
245+
ether_relay_filter
246+
};
247+
EXPECT_EQ(sock_open(42384239, &ether_relay_fprog), -1);
216248
}
217249

218250
TEST(sock, prepare_socket)
219251
{
220252
relay_config *config = new struct relay_config;;
221-
int local_sock, server_sock, index = 1;
222-
prepareSockCount++;
253+
int local_sock = -1, server_sock = -1, index = 1;
254+
int socket_type = -1;
255+
socklen_t socket_type_len = sizeof(socket_type);
223256
prepare_socket(&local_sock, &server_sock, config, index);
224-
EXPECT_EQ(1, prepareSockCount);
257+
EXPECT_GE(local_sock, 0);
258+
EXPECT_GE(server_sock, 0);
259+
EXPECT_EQ(0, getsockopt(local_sock, SOL_SOCKET, SO_TYPE, &socket_type, &socket_type_len));
260+
EXPECT_EQ(SOCK_DGRAM, socket_type);
261+
socket_type = -1;
262+
socket_type_len = sizeof(socket_type);
263+
EXPECT_EQ(0, getsockopt(server_sock, SOL_SOCKET, SO_TYPE, &socket_type, &socket_type_len));
264+
EXPECT_EQ(SOCK_DGRAM, socket_type);
265+
close(local_sock);
266+
close(server_sock);
267+
delete config;
225268
}
226269

227270
TEST(helper, send_udp)
@@ -597,30 +640,6 @@ TEST(relay, relay_relay_reply) {
597640
}
598641

599642
TEST(relay, callback) {
600-
static struct sock_filter ether_relay_filter[] = {
601-
602-
{ 0x28, 0, 0, 0x0000000c },
603-
{ 0x15, 0, 13, 0x000086dd },
604-
{ 0x20, 0, 0, 0x00000026 },
605-
{ 0x15, 0, 11, 0xff020000 },
606-
{ 0x20, 0, 0, 0x0000002a },
607-
{ 0x15, 0, 9, 0x00000000 },
608-
{ 0x20, 0, 0, 0x0000002e },
609-
{ 0x15, 0, 7, 0x00000000 },
610-
{ 0x20, 0, 0, 0x00000032 },
611-
{ 0x15, 0, 5, 0x00010002 },
612-
{ 0x30, 0, 0, 0x00000014 },
613-
{ 0x15, 0, 3, 0x00000011 },
614-
{ 0x28, 0, 0, 0x00000038 },
615-
{ 0x15, 0, 1, 0x00000223 },
616-
{ 0x6, 0, 0, 0x00040000 },
617-
{ 0x6, 0, 0, 0x00000000 },
618-
};
619-
const struct sock_fprog ether_relay_fprog = {
620-
lengthof(ether_relay_filter),
621-
ether_relay_filter
622-
};
623-
624643
int mock_sock = 123;
625644
evutil_socket_t fd = 1;
626645
short event = 1;
@@ -650,40 +669,38 @@ TEST(relay, callback) {
650669

651670
int local_sock = 1;
652671
int filter = 1;
653-
int index = 1;
654-
filter = sock_open(index, &ether_relay_fprog);
672+
int index = if_nametoindex("lo");
673+
config.filter = sock_open(index, &ether_relay_fprog);
674+
EXPECT_GE(config.filter, 0);
655675
prepare_relay_config(&config, &local_sock, filter);
656676

657677
callback(fd, event, &config);
658678
}
659679

660680
TEST(relay, signal_init) {
661-
struct event_base *base;
662-
struct event *ev_sigint = NULL;
663-
struct event *ev_sigterm;
664681
signal_init();
682+
EXPECT_NE((uintptr_t)ev_sigint, NULL);
683+
EXPECT_NE((uintptr_t)ev_sigterm, NULL);
665684
}
666685

667686
TEST(relay, signal_start) {
668-
struct event_base *base = event_base_new();;
669-
struct event *ev_sigint;
670-
struct event *ev_sigterm;
671687
signal_init();
688+
EXPECT_NE((uintptr_t)ev_sigint, NULL);
689+
EXPECT_NE((uintptr_t)ev_sigterm, NULL);
672690
signal_start();
673691
}
674692

675693
TEST(relay, signal_callback) {
676-
struct event_base *base = event_base_new();;
677-
struct event *ev_sigint;
678-
struct event *ev_sigterm;
679694
signal_callback(1, 1, &base);
680695
}
681696

682697
TEST(relay, dhcp6relay_stop) {
683698
int filter = 1;
684699
struct relay_config config{};
685-
struct event_base *base = event_base_new();
686-
struct event *mock_event;
687-
event_new(base, filter, EV_READ|EV_PERSIST, callback, &config);
700+
base = event_base_new();
701+
struct event* event = event_new(base, filter, EV_READ|EV_PERSIST, callback, &config);
688702
dhcp6relay_stop();
703+
event_free(event);
704+
event_base_free(base);
705+
base = NULL;
689706
}

0 commit comments

Comments
 (0)