Skip to content

Commit 4016455

Browse files
committed
test: mock inet4 and IP4 unit test
1 parent 2956f73 commit 4016455

4 files changed

Lines changed: 397 additions & 14 deletions

File tree

test/CMakeLists.txt

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
44

55
option(COVERAGE "Build with coverage generation" OFF)
66
option(SILENT_BUILD "Build with some warnings turned off" ON)
7+
option(INFO "Print INFO macro output" OFF)
8+
option(DEBUG_INFO "Print debug macro output when DEBUG/DEBUG2 etc. is defined in source" OFF)
9+
option(GENERATE_SUPPORT_FILES "Generate external files required by some tests (e.g. tar)" ON)
710

811
if ("${ARCH}" STREQUAL "")
912
set (ARCH "ARCH_X86")
@@ -13,7 +16,18 @@ add_definitions(-D${ARCH} -DINCLUDEOS_SINGLE_THREADED)
1316

1417
set(CMAKE_CXX_STANDARD 14)
1518
set(CMAKE_C_FLAGS "-m32 -g -O0 -std=c11 -Wall -Wextra")
16-
set(CMAKE_CXX_FLAGS "-m32 -g -O0 -std=c++14 -Wall -Wextra -Wno-unused-function -D__id_t_defined -DUNITTESTS -DURI_THROW_ON_ERROR -DNO_INFO=1 -DNO_DEBUG=1 -DGSL_THROW_ON_CONTRACT_VIOLATION -Dlest_FEATURE_AUTO_REGISTER=1 -DHAVE_LEST_MAIN")
19+
20+
set(NO_INFO "-DNO_INFO=1")
21+
if(INFO)
22+
set(NO_INFO "")
23+
endif()
24+
25+
set(NO_DEBUG "-DNO_DEBUG=1")
26+
if (DEBUG_INFO)
27+
set(NO_DEBUG "")
28+
endif()
29+
30+
set(CMAKE_CXX_FLAGS "-m32 -g -O0 -std=c++14 -Wall -Wextra -Wno-unused-function -D__id_t_defined -DUNITTESTS -DURI_THROW_ON_ERROR ${NO_INFO} ${NO_DEBUG} -DGSL_THROW_ON_CONTRACT_VIOLATION -Dlest_FEATURE_AUTO_REGISTER=1 -DHAVE_LEST_MAIN")
1731

1832
if(NOT DEFINED ${INCLUDEOS_ROOT})
1933
set(INCLUDEOS_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../)
@@ -36,6 +50,7 @@ include_directories(
3650
set(LEST_UTIL
3751
${TEST}/lest_util/lestmain.cxx
3852
${TEST}/lest_util/os_mock.cpp
53+
${TEST}/lest_util/inet4_mock.cpp
3954
)
4055

4156
set(TEST_SOURCES
@@ -64,6 +79,7 @@ set(TEST_SOURCES
6479
${TEST}/net/unit/http_time_test.cpp
6580
${TEST}/net/unit/http_version_test.cpp
6681
${TEST}/net/unit/ip4_addr.cpp
82+
${TEST}/net/unit/ip4.cpp
6783
${TEST}/net/unit/packets.cpp
6884
${TEST}/net/unit/tcp_packet_test.cpp
6985
${TEST}/net/unit/tcp_socket.cpp
@@ -141,11 +157,13 @@ set(OS_SOURCES
141157
${SRC}/net/http/time.cpp
142158
${SRC}/net/http/version.cpp
143159
${SRC}/net/inet_common.cpp
160+
${SRC}/net/inet4.cpp
144161
${SRC}/net/ip4/arp.cpp
145162
${SRC}/net/ip4/icmpv4.cpp
146163
${SRC}/net/ip4/ip4.cpp
147164
${SRC}/net/ip4/udp.cpp
148165
${SRC}/net/ip4/udp_socket.cpp
166+
${SRC}/net/dhcp/dh4client.cpp
149167
${SRC}/net/tcp/connection.cpp
150168
${SRC}/net/tcp/connection_states.cpp
151169
${SRC}/net/tcp/listener.cpp
@@ -206,7 +224,7 @@ endif("${ARCH}" STREQUAL "ARCH_ARMv7")
206224
if(NOT SINGLE)
207225
set(SOURCES ${MOD_OBJECTS} ${OS_SOURCES} ${TEST_SOURCES} ${LEST_UTIL})
208226
else()
209-
set(SOURCES ${SINGLE} ${LEST_UTIL})
227+
set(SOURCES ${MOD_OBJECTS} ${OS_SOURCES} ${SINGLE} ${LEST_UTIL})
210228
endif()
211229

212230
if ("${ARCH}" STREQUAL "ARCH_ARMv7")
@@ -223,16 +241,19 @@ add_executable(unittests ${SOURCES})
223241
install(TARGETS unittests DESTINATION ${TEST})
224242
install(DIRECTORY lest/include/lest DESTINATION ${CMAKE_INSTALL_PREFIX}/include)
225243

226-
add_custom_command(
227-
TARGET unittests PRE_BUILD
228-
COMMAND ${CMAKE_COMMAND} -E tar cf ${CMAKE_CURRENT_BINARY_DIR}/test-single.tar ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
229-
COMMAND ${CMAKE_COMMAND} -E tar cf ${CMAKE_CURRENT_BINARY_DIR}/test-multiple.tar ${CMAKE_CURRENT_SOURCE_DIR}/*.py
230-
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt ${CMAKE_CURRENT_BINARY_DIR}/test-invalid.tar
231-
COMMAND ${CMAKE_COMMAND} -E tar czf ${CMAKE_CURRENT_BINARY_DIR}/test.tar.gz ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
232-
COMMAND ${CMAKE_COMMAND} -E tar czf ${CMAKE_CURRENT_BINARY_DIR}/test-corrupt.gz ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
233-
COMMAND bash ${TEST}/util/unit/corrupt-tar-gz.sh ${CMAKE_CURRENT_BINARY_DIR}/test.tar.gz ${CMAKE_CURRENT_BINARY_DIR}/test-corrupt.gz
234-
COMMAND ${CMAKE_COMMAND} -E tar cf ${CMAKE_CURRENT_BINARY_DIR}/test-tar-gz-inside.tar ${CMAKE_CURRENT_BINARY_DIR}/test.tar.gz
235-
)
244+
if (GENERATE_SUPPORT_FILES)
245+
246+
add_custom_command(
247+
TARGET unittests PRE_BUILD
248+
COMMAND ${CMAKE_COMMAND} -E tar cf ${CMAKE_CURRENT_BINARY_DIR}/test-single.tar ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
249+
COMMAND ${CMAKE_COMMAND} -E tar cf ${CMAKE_CURRENT_BINARY_DIR}/test-multiple.tar ${CMAKE_CURRENT_SOURCE_DIR}/*.py
250+
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt ${CMAKE_CURRENT_BINARY_DIR}/test-invalid.tar
251+
COMMAND ${CMAKE_COMMAND} -E tar czf ${CMAKE_CURRENT_BINARY_DIR}/test.tar.gz ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
252+
COMMAND ${CMAKE_COMMAND} -E tar czf ${CMAKE_CURRENT_BINARY_DIR}/test-corrupt.gz ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
253+
COMMAND bash ${TEST}/util/unit/corrupt-tar-gz.sh ${CMAKE_CURRENT_BINARY_DIR}/test.tar.gz ${CMAKE_CURRENT_BINARY_DIR}/test-corrupt.gz
254+
COMMAND ${CMAKE_COMMAND} -E tar cf ${CMAKE_CURRENT_BINARY_DIR}/test-tar-gz-inside.tar ${CMAKE_CURRENT_BINARY_DIR}/test.tar.gz
255+
)
256+
endif()
236257

237258
add_custom_target(
238259
cppcheck

test/lest_util/nic_mock.hpp

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
// This file is a part of the IncludeOS unikernel - www.includeos.org
2+
//
3+
// Copyright 2015-2017 Oslo and Akershus University College of Applied Sciences
4+
// and Alfred Bratterud
5+
//
6+
// Licensed under the Apache License, Version 2.0 (the "License");
7+
// you may not use this file except in compliance with the License.
8+
// You may obtain a copy of the License at
9+
//
10+
// http://www.apache.org/licenses/LICENSE-2.0
11+
//
12+
// Unless required by applicable law or agreed to in writing, software
13+
// distributed under the License is distributed on an "AS IS" BASIS,
14+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
// See the License for the specific language governing permissions and
16+
// limitations under the License.
17+
18+
#include <hw/nic.hpp>
19+
20+
#ifndef NICK_MOCK_HPP
21+
#define NICK_MOCK_HPP
22+
23+
#define NIC_INFO(X,...) INFO("Mock NIC", X, ##__VA_ARGS__)
24+
25+
class Nic_mock : public hw::Nic {
26+
27+
public:
28+
Proto proto() const override
29+
{ return Nic::Proto::ETH; }
30+
31+
const char* driver_name() const override
32+
{ return "Mock driver"; }
33+
34+
/** The mac address. */
35+
const MAC::Addr& mac() const noexcept override
36+
{ return mac_; }
37+
38+
virtual uint16_t MTU() const noexcept override
39+
{ return 1500; }
40+
41+
42+
downstream create_link_downstream() override
43+
{ return transmit_to_link_; };
44+
45+
void set_ip4_upstream(upstream handler) override
46+
{ ip4_handler_ = handler; }
47+
48+
void set_ip6_upstream(upstream handler) override
49+
{ ip6_handler_ = handler; }
50+
51+
void set_arp_upstream(upstream handler) override
52+
{ arp_handler_ = handler; }
53+
54+
/** Number of bytes in a frame needed by the device itself **/
55+
size_t frame_offset_device() override
56+
{ return frame_offs_dev_; }
57+
58+
/** Number of bytes in a frame needed by the link layer **/
59+
size_t frame_offset_link() override
60+
{ return frame_offs_link_; }
61+
62+
static constexpr uint16_t packet_len()
63+
{ return 1514; }
64+
65+
net::Packet_ptr create_packet(int) override
66+
{
67+
auto buffer = bufstore().get_buffer();
68+
auto* ptr = (net::Packet*) buffer.addr;
69+
70+
new (ptr) net::Packet(frame_offs_dev_ + frame_offs_link_,
71+
0,
72+
frame_offs_dev_ + packet_len(),
73+
buffer.bufstore);
74+
75+
return net::Packet_ptr(ptr);
76+
}
77+
78+
79+
size_t transmit_queue_available() override
80+
{ return 1024; }
81+
82+
void deactivate() override
83+
{ link_up_ = false; }
84+
85+
/** Stats getters **/
86+
uint64_t get_packets_rx() override
87+
{ return packets_rx_; }
88+
89+
uint64_t get_packets_tx() override
90+
{ return packets_tx_; }
91+
92+
uint64_t get_packets_dropped() override
93+
{ return packets_dropped_; }
94+
95+
void move_to_this_cpu() override {}
96+
97+
//
98+
// MOCK Extensions
99+
//
100+
101+
~Nic_mock() {}
102+
Nic_mock() : Nic(256, 2048) {}
103+
104+
// Public data members (ahem)
105+
MAC::Addr mac_ = {0xc0,0x00,0x01,0x70,0x00,0x01};
106+
static constexpr size_t frame_offs_dev_ = 0;
107+
static constexpr size_t frame_offs_link_ = 14;
108+
109+
std::vector<net::Packet_ptr> tx_queue_;
110+
111+
void transmit(net::Packet_ptr, MAC::Addr, net::Ethertype)
112+
{
113+
NIC_INFO("transimtting packet");
114+
//tx_queue_.emplace_back(std::move(ptr));
115+
}
116+
117+
void receive(net::Packet_ptr ptr){
118+
119+
if(ip4_handler_) {
120+
NIC_INFO("pushing packet to IP4");
121+
ip4_handler_(std::move(ptr));
122+
} else {
123+
NIC_INFO("nowhere to push packet. Drop.");
124+
}
125+
}
126+
127+
private:
128+
129+
upstream ip4_handler_ = nullptr;
130+
upstream ip6_handler_ = nullptr;
131+
upstream arp_handler_ = nullptr;
132+
downstream transmit_to_link_ = downstream{this, &Nic_mock::transmit};
133+
bool link_up_ = true;
134+
uint64_t packets_rx_ = 0;
135+
uint64_t packets_tx_ = 0;
136+
uint64_t packets_dropped_ = 0;
137+
138+
139+
};
140+
141+
142+
#endif

test/lest_util/os_mock.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,16 @@ extern "C" {
154154
void malloc_trim() {
155155
return;
156156
}
157-
}
157+
158+
static char __printbuf[4096];
159+
160+
__attribute__((weak))
161+
void __serial_print1(const char* cstr) {
162+
snprintf(__printbuf, 4096, "%s", cstr);
163+
}
164+
165+
166+
} // ~ extern "C"
158167

159168
/// arch ///
160169
void __arch_init() {}
@@ -197,4 +206,3 @@ void IRQ_manager::process_interrupts() {
197206
return;
198207
}
199208
#endif
200-

0 commit comments

Comments
 (0)