Home | History | Annotate | Download | only in src
      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