//--------------------------------------------------------------------------- // // SCSI Target Emulator PiSCSI //--------------------------------------------------------------------------- #include "devices/scsi_host_bridge.h" #include "mocks.h" TEST(ScsiHostBridgeTest, GetDefaultParams) { const auto [controller, bridge] = CreateDevice(SCBR); const auto params = bridge->GetDefaultParams(); EXPECT_EQ(2, params.size()); } TEST(ScsiHostBridgeTest, DeriveMac) { const array uplink_mac = { 0xb8, 0x27, 0xeb, 0xb5, 0xa3, 0x15 }; const auto mac = SCSIBR::DeriveMac(uplink_mac); EXPECT_EQ(0x02, mac[0]); EXPECT_NE(uplink_mac, mac); EXPECT_EQ(mac, SCSIBR::DeriveMac(uplink_mac)); const array invalid_mac = { 0, 1, 2, 3, 4 }; EXPECT_EQ((array {}), SCSIBR::DeriveMac(invalid_mac)); } TEST(ScsiHostBridgeTest, InquiryDisablesRasctlControlByDefault) { const auto [controller, bridge] = CreateDevice(SCBR); const auto inquiry = std::dynamic_pointer_cast(bridge)->InquiryInternal(); EXPECT_EQ(0, inquiry[36]); EXPECT_EQ('1', inquiry[38]); } TEST(ScsiHostBridgeTest, RasctlControlUsesRasctlMessageFormat) { const auto [controller, device] = CreateDevice(SCBR); const auto bridge = std::dynamic_pointer_cast(device); const array write_cdb = { 0x2a, 0, 0, 0, 0, 0, 0, 4, 0, 0 }; const array read_cdb = { 0x28, 0, 0, 0, 0, 0, 0, 4, 0, 0 }; vector buffer(1024); EXPECT_FALSE(bridge->ReadWrite(write_cdb, buffer)); EXPECT_EQ(0, bridge->GetMessage10(read_cdb, buffer)); bridge->SetRasctlControlMode(SCSIBR::rasctl_control_mode::media); EXPECT_EQ('1', bridge->InquiryInternal()[36]); memcpy(buffer.data(), "list\n", 5); EXPECT_TRUE(bridge->ReadWrite(write_cdb, buffer)); const auto command = bridge->TakeRasctlControlRequest(); ASSERT_TRUE(command.has_value()); EXPECT_EQ("list\n", *command); bridge->SetRasctlControlResponse("No devices currently attached.\n"); buffer.assign(buffer.size(), 0xff); EXPECT_EQ(1024, bridge->GetMessage10(read_cdb, buffer)); EXPECT_STREQ("No devices currently attached.\n", reinterpret_cast(buffer.data())); bridge->SetRasctlControlResponse("PiSCSI shutdown requested\n", SCSIBR::rasctl_shutdown_mode::stop_piscsi); EXPECT_EQ(1024, bridge->GetMessage10(read_cdb, buffer)); EXPECT_EQ(SCSIBR::rasctl_shutdown_mode::stop_piscsi, bridge->TakeRasctlShutdownMode()); }