1 2 #include <app_nugget.h> 3 #include <nos/NuggetClientInterface.h> 4 #include <gtest/gtest.h> 5 6 #include <chrono> 7 #include <memory> 8 9 #include "avb_tools.h" 10 #include "nugget_tools.h" 11 #include "util.h" 12 13 14 using std::string; 15 using std::vector; 16 using std::unique_ptr; 17 18 namespace { 19 20 class NuggetCoreTest: public testing::Test { 21 protected: 22 static void SetUpTestCase(); 23 static void TearDownTestCase(); 24 25 static unique_ptr<nos::NuggetClientInterface> client; 26 static unique_ptr<test_harness::TestHarness> uart_printer; 27 static vector<uint8_t> input_buffer; 28 static vector<uint8_t> output_buffer; 29 }; 30 31 unique_ptr<nos::NuggetClientInterface> NuggetCoreTest::client; 32 unique_ptr<test_harness::TestHarness> NuggetCoreTest::uart_printer; 33 34 vector<uint8_t> NuggetCoreTest::input_buffer; 35 vector<uint8_t> NuggetCoreTest::output_buffer; 36 37 void NuggetCoreTest::SetUpTestCase() { 38 uart_printer = test_harness::TestHarness::MakeUnique(); 39 40 client = nugget_tools::MakeNuggetClient(); 41 client->Open(); 42 input_buffer.reserve(0x4000); 43 output_buffer.reserve(0x4000); 44 EXPECT_TRUE(client->IsOpen()) << "Unable to connect"; 45 } 46 47 void NuggetCoreTest::TearDownTestCase() { 48 client->Close(); 49 client = unique_ptr<nos::NuggetClientInterface>(); 50 51 uart_printer = nullptr; 52 } 53 54 TEST_F(NuggetCoreTest, GetVersionStringTest) { 55 input_buffer.resize(0); 56 ASSERT_NO_ERROR(NuggetCoreTest::client->CallApp( 57 APP_ID_NUGGET, NUGGET_PARAM_VERSION, input_buffer, &output_buffer), ""); 58 ASSERT_GT(output_buffer.size(), 0u); 59 } 60 61 TEST_F(NuggetCoreTest, GetDeviceIdTest) { 62 input_buffer.resize(0); 63 ASSERT_NO_ERROR(NuggetCoreTest::client->CallApp( 64 APP_ID_NUGGET, NUGGET_PARAM_DEVICE_ID, input_buffer, &output_buffer), ""); 65 ASSERT_EQ(output_buffer.size(), 18u); 66 for (size_t i = 0; i < output_buffer.size(); i++) { 67 if (i == 8) { 68 ASSERT_EQ(output_buffer[i], ':'); 69 } else if (i == 17) { 70 ASSERT_EQ(output_buffer[i], '\0'); 71 } else { 72 ASSERT_TRUE(std::isxdigit(output_buffer[i])); 73 } 74 } 75 } 76 77 TEST_F(NuggetCoreTest, EnterDeepSleep) { 78 ASSERT_TRUE(nugget_tools::WaitForSleep(client.get(), nullptr)); 79 } 80 81 TEST_F(NuggetCoreTest, HardRebootTest) { 82 ASSERT_TRUE(nugget_tools::RebootNugget(client.get())); 83 } 84 85 TEST_F(NuggetCoreTest, WipeUserData) { 86 ASSERT_TRUE(nugget_tools::WipeUserData(client.get())); 87 } 88 89 TEST_F(NuggetCoreTest, GetLowPowerStats) { 90 struct nugget_app_low_power_stats stats; 91 vector<uint8_t> buffer; 92 93 buffer.reserve(1000); // Much more than needed 94 ASSERT_NO_ERROR(NuggetCoreTest::client->CallApp( 95 APP_ID_NUGGET, NUGGET_PARAM_GET_LOW_POWER_STATS, 96 buffer, &buffer), ""); 97 ASSERT_GE(buffer.size(), sizeof(stats)); 98 99 memcpy(&stats, buffer.data(), sizeof(stats)); 100 101 /* We must have booted once and been awake long enough to reply, but that's 102 * about all we can be certain of. */ 103 ASSERT_GT(stats.hard_reset_count, 0UL); 104 ASSERT_GT(stats.time_since_hard_reset, 0UL); 105 ASSERT_GT(stats.time_spent_awake, 0UL); 106 } 107 108 TEST_F(NuggetCoreTest, GetUartPassthruInBootloader) { 109 std::vector<uint8_t> send; 110 std::vector<uint8_t> get; 111 112 get.reserve(1); 113 ASSERT_NO_ERROR(NuggetCoreTest::client->CallApp( 114 APP_ID_NUGGET, NUGGET_PARAM_AP_UART_PASSTHRU, 115 send, &get), "Get UART passthru value"); 116 /* Should be either on or off. If USB is active, disconnect SuzyQable */ 117 ASSERT_TRUE(get[0] == NUGGET_AP_UART_OFF || 118 get[0] == NUGGET_AP_UART_ENABLED); 119 } 120 121 TEST_F(NuggetCoreTest, GetUartPassthruInHLOS) { 122 std::vector<uint8_t> send; 123 std::vector<uint8_t> get; 124 125 avb_tools::BootloaderDone(client.get()); 126 127 get.reserve(1); 128 ASSERT_NO_ERROR(NuggetCoreTest::client->CallApp( 129 APP_ID_NUGGET, NUGGET_PARAM_AP_UART_PASSTHRU, 130 send, &get), "Get UART passthru value"); 131 /* Should be either on or off. If USB is active, disconnect SuzyQable */ 132 ASSERT_TRUE(get[0] == NUGGET_AP_UART_OFF || 133 get[0] == NUGGET_AP_UART_ENABLED); 134 } 135 136 137 TEST_F(NuggetCoreTest, EnableUartPassthruInBootloader) { 138 std::vector<uint8_t> send; 139 std::vector<uint8_t> get; 140 141 avb_tools::SetBootloader(client.get()); 142 143 send.push_back(NUGGET_AP_UART_ENABLED); 144 get.reserve(1); 145 ASSERT_NO_ERROR(NuggetCoreTest::client->CallApp( 146 APP_ID_NUGGET, NUGGET_PARAM_AP_UART_PASSTHRU, 147 send, &get), "Enable UART passthru"); 148 149 ASSERT_EQ(get[0], NUGGET_AP_UART_ENABLED); 150 } 151 152 TEST_F(NuggetCoreTest, DisableUartPassthruInBootloader) { 153 std::vector<uint8_t> send; 154 std::vector<uint8_t> get; 155 156 avb_tools::SetBootloader(client.get()); 157 158 send.push_back(NUGGET_AP_UART_OFF); 159 get.reserve(1); 160 ASSERT_NO_ERROR(NuggetCoreTest::client->CallApp( 161 APP_ID_NUGGET, NUGGET_PARAM_AP_UART_PASSTHRU, 162 send, &get), "Disable UART passthru"); 163 164 ASSERT_EQ(get[0], NUGGET_AP_UART_OFF); 165 } 166 167 TEST_F(NuggetCoreTest, EnableUartPassthruInHLOSFails) { 168 std::vector<uint8_t> send; 169 std::vector<uint8_t> get; 170 171 avb_tools::BootloaderDone(client.get()); 172 173 send.push_back(NUGGET_AP_UART_ENABLED); 174 get.reserve(1); 175 /* This should fail */ 176 ASSERT_NE(APP_SUCCESS, NuggetCoreTest::client->CallApp( 177 APP_ID_NUGGET, NUGGET_PARAM_AP_UART_PASSTHRU, 178 send, &get)); 179 } 180 181 TEST_F(NuggetCoreTest, DisableUartPassthruInHLOSFails) { 182 std::vector<uint8_t> send; 183 std::vector<uint8_t> get; 184 185 avb_tools::BootloaderDone(client.get()); 186 187 send.push_back(NUGGET_AP_UART_OFF); 188 get.reserve(1); 189 /* This should fail */ 190 ASSERT_NE(APP_SUCCESS, NuggetCoreTest::client->CallApp( 191 APP_ID_NUGGET, NUGGET_PARAM_AP_UART_PASSTHRU, 192 send, &get)); 193 } 194 195 } // namespace 196