diff --git a/fastboot/fuzzy_fastboot/fixtures.cpp b/fastboot/fuzzy_fastboot/fixtures.cpp index 280cfb691..eb043ce36 100644 --- a/fastboot/fuzzy_fastboot/fixtures.cpp +++ b/fastboot/fuzzy_fastboot/fixtures.cpp @@ -55,6 +55,8 @@ #include "test_utils.h" #include "usb_transport_sniffer.h" +using namespace std::literals::chrono_literals; + namespace fastboot { int FastBootTest::MatchFastboot(usb_ifc_info* info, const char* local_serial) { @@ -159,6 +161,26 @@ void FastBootTest::TearDownSerial() { } } +void FastBootTest::ReconnectFastbootDevice() { + fb.reset(); + transport.reset(); + while (UsbStillAvailible()) + ; + printf("WAITING FOR DEVICE\n"); + // Need to wait for device + const auto matcher = [](usb_ifc_info* info) -> int { return MatchFastboot(info, nullptr); }; + while (!transport) { + std::unique_ptr usb(usb_open(matcher, USB_TIMEOUT)); + if (usb) { + transport = std::unique_ptr( + new UsbTransportSniffer(std::move(usb), serial_port)); + } + std::this_thread::sleep_for(1s); + } + device_path = cb_scratch; + fb = std::unique_ptr(new FastBootDriver(transport.get(), {}, true)); +} + void FastBootTest::SetLockState(bool unlock, bool assert_change) { if (!fb) { return; @@ -197,25 +219,8 @@ void FastBootTest::SetLockState(bool unlock, bool assert_change) { std::string cmd = unlock ? "unlock" : "lock"; ASSERT_EQ(fb->RawCommand("flashing " + cmd, &resp), SUCCESS) << "Attempting to change locked state, but 'flashing" + cmd + "' command failed"; - fb.reset(); - transport.reset(); printf("PLEASE RESPOND TO PROMPT FOR '%sing' BOOTLOADER ON DEVICE\n", cmd.c_str()); - while (UsbStillAvailible()) - ; // Wait for disconnect - printf("WAITING FOR DEVICE"); - // Need to wait for device - const auto matcher = [](usb_ifc_info* info) -> int { return MatchFastboot(info, nullptr); }; - while (!transport) { - std::unique_ptr usb(usb_open(matcher, USB_TIMEOUT)); - if (usb) { - transport = std::unique_ptr( - new UsbTransportSniffer(std::move(usb), serial_port)); - } - std::this_thread::sleep_for(std::chrono::milliseconds(1000)); - putchar('.'); - } - device_path = cb_scratch; - fb = std::unique_ptr(new FastBootDriver(transport.get(), {}, true)); + ReconnectFastbootDevice(); if (assert_change) { ASSERT_EQ(fb->GetVar("unlocked", &resp), SUCCESS) << "getvar:unlocked failed"; ASSERT_EQ(resp, unlock ? "yes" : "no") diff --git a/fastboot/fuzzy_fastboot/fixtures.h b/fastboot/fuzzy_fastboot/fixtures.h index e0f829e48..9c955eae5 100644 --- a/fastboot/fuzzy_fastboot/fixtures.h +++ b/fastboot/fuzzy_fastboot/fixtures.h @@ -48,6 +48,7 @@ class FastBootTest : public testing::Test { static int MatchFastboot(usb_ifc_info* info, const char* local_serial = nullptr); bool UsbStillAvailible(); bool UserSpaceFastboot(); + void ReconnectFastbootDevice(); protected: RetCode DownloadCommand(uint32_t size, std::string* response = nullptr, @@ -86,6 +87,7 @@ class Fuzz : public ModeTest { // differently class BasicFunctionality : public ModeTest {}; class Conformance : public ModeTest {}; +class LogicalPartitionCompliance : public ModeTest {}; class UnlockPermissions : public ModeTest {}; class LockPermissions : public ModeTest {}; diff --git a/fastboot/fuzzy_fastboot/main.cpp b/fastboot/fuzzy_fastboot/main.cpp index ef3477109..82e899d65 100644 --- a/fastboot/fuzzy_fastboot/main.cpp +++ b/fastboot/fuzzy_fastboot/main.cpp @@ -176,6 +176,38 @@ TEST(USBFunctionality, USBConnect) { delete transport; } } +// Testing creation/resize/delete of logical partitions +TEST_F(LogicalPartitionCompliance, CreateResizeDeleteLP) { + ASSERT_TRUE(UserSpaceFastboot()); + GTEST_LOG_(INFO) << "Testing 'fastboot create-logical-partition' command"; + EXPECT_EQ(fb->CreatePartition("test_partition_a", "0"), SUCCESS) + << "create-logical-partition failed"; + GTEST_LOG_(INFO) << "Testing 'fastboot resize-logical-partition' command"; + EXPECT_EQ(fb->ResizePartition("test_partition_a", "4096"), SUCCESS) + << "resize-logical-partition failed"; + std::vector buf(4096); + + GTEST_LOG_(INFO) << "Flashing a logical partition.."; + EXPECT_EQ(fb->FlashPartition("test_partition_a", buf), SUCCESS) + << "flash logical -partition failed"; + GTEST_LOG_(INFO) << "Rebooting to bootloader mode"; + // Reboot to bootloader mode and attempt to flash the logical partitions + fb->RebootTo("bootloader"); + + ReconnectFastbootDevice(); + ASSERT_FALSE(UserSpaceFastboot()); + GTEST_LOG_(INFO) << "Attempt to flash a logical partition.."; + EXPECT_EQ(fb->FlashPartition("test_partition", buf), DEVICE_FAIL) + << "flash logical partition must fail in bootloader"; + GTEST_LOG_(INFO) << "Rebooting back to fastbootd mode"; + fb->RebootTo("fastboot"); + + ReconnectFastbootDevice(); + ASSERT_TRUE(UserSpaceFastboot()); + GTEST_LOG_(INFO) << "Testing 'fastboot delete-logical-partition' command"; + EXPECT_EQ(fb->DeletePartition("test_partition_a"), SUCCESS) + << "delete logical-partition failed"; +} // Conformance tests TEST_F(Conformance, GetVar) {