//--------------------------------------------------------------------------- // // SCSI Target Emulator PiSCSI // for Raspberry Pi // // Copyright (C) 2022-2023 Uwe Seimet // //--------------------------------------------------------------------------- #include "mocks.h" #include #include "devices/ctapdriver.h" using namespace network_util; TEST(CTapDriverTest, GetDefaultParams) { CTapDriver driver; const auto params = driver.GetDefaultParams(); EXPECT_EQ(2, params.size()); EXPECT_EQ("piscsi_bridge", params.at("interface")); EXPECT_EQ("bridge", params.at("mode")); EXPECT_FALSE(params.contains("inet")); } TEST(CTapDriverTest, ValidateProfiles) { const network_interface_map interfaces = { { "piscsi_bridge", { "piscsi_bridge", NetworkInterfaceType::BRIDGE, true } }, { "wlan0", { "wlan0", NetworkInterfaceType::WIFI, true } }, { "eth0", { "eth0", NetworkInterfaceType::ETHERNET, true } }, { "wlan1", { "wlan1", NetworkInterfaceType::WIFI, false } }, }; EXPECT_TRUE(CTapDriver::GetProfileValidationError("bridge", "piscsi_bridge", interfaces).empty()); EXPECT_TRUE(CTapDriver::GetProfileValidationError("proxyarp", "wlan0", interfaces).empty()); EXPECT_THAT(CTapDriver::GetProfileValidationError("", "piscsi_bridge", interfaces), HasSubstr("Unsupported")); EXPECT_THAT(CTapDriver::GetProfileValidationError("bridge", "eth0", interfaces), HasSubstr("requires")); EXPECT_THAT(CTapDriver::GetProfileValidationError("proxyarp", "eth0", interfaces), HasSubstr("Wi-Fi")); EXPECT_THAT(CTapDriver::GetProfileValidationError("proxyarp", "wlan1", interfaces), HasSubstr("down")); EXPECT_THAT(CTapDriver::GetProfileValidationError("proxyarp", "wlan0,eth0", interfaces), HasSubstr("Invalid")); auto conflicting_interfaces = interfaces; conflicting_interfaces.emplace("piscsi0", NetworkInterfaceInfo { "piscsi0", NetworkInterfaceType::TAP, true }); EXPECT_THAT(CTapDriver::GetProfileValidationError("proxyarp", "wlan0", conflicting_interfaces), HasSubstr("in use")); } TEST(CTapDriverTest, CleanupAndMacAreSafeWithoutATap) { CTapDriver driver; array mac; mac.fill(0xff); driver.GetUplinkMacAddr(mac.data()); EXPECT_THAT(mac, Each(0)); driver.CleanUp(); driver.CleanUp(); } TEST(CTapDriverTest, Crc32) { array buf; buf.fill(0x00); EXPECT_EQ(0xe3d887bb, CTapDriver::Crc32(span(buf.data(), ETH_FRAME_LEN))); buf.fill(0xff); EXPECT_EQ(0x814765f4, CTapDriver::Crc32(span(buf.data(), ETH_FRAME_LEN))); buf.fill(0x10); EXPECT_EQ(0xb7288Cd3, CTapDriver::Crc32(span(buf.data(), ETH_FRAME_LEN))); buf.fill(0x7f); EXPECT_EQ(0x4b543477, CTapDriver::Crc32(span(buf.data(), ETH_FRAME_LEN))); buf.fill(0x80); EXPECT_EQ(0x29cbd638, CTapDriver::Crc32(span(buf.data(), ETH_FRAME_LEN))); for (size_t i = 0; i < buf.size(); i++) { buf[i] = (uint8_t)i; } EXPECT_EQ(0xe7870705, CTapDriver::Crc32(span(buf.data(), ETH_FRAME_LEN))); for (size_t i = buf.size() - 1; i > 0; i--) { buf[i] = (uint8_t)i; } EXPECT_EQ(0xe7870705, CTapDriver::Crc32(span(buf.data(), ETH_FRAME_LEN))); }