int main(int argc, char *argv[]) { otInstance *instance; #if OPENTHREAD_EXAMPLES_POSIX if (setjmp(gResetJump)) { alarm(0); #if OPENTHREAD_ENABLE_COVERAGE __gcov_flush(); #endif execvp(argv[0], argv); } #endif #if OPENTHREAD_ENABLE_MULTIPLE_INSTANCES size_t otInstanceBufferLength = 0; uint8_t *otInstanceBuffer = NULL; #endif pseudo_reset: otSysInit(argc, argv); #if OPENTHREAD_ENABLE_MULTIPLE_INSTANCES // Call to query the buffer size (void)otInstanceInit(NULL, &otInstanceBufferLength); // Call to allocate the buffer otInstanceBuffer = (uint8_t *)malloc(otInstanceBufferLength); assert(otInstanceBuffer); // Initialize OpenThread with the buffer instance = otInstanceInit(otInstanceBuffer, &otInstanceBufferLength); #else instance = otInstanceInitSingle(); #endif assert(instance); otCliUartInit(instance); #if OPENTHREAD_ENABLE_DIAG otDiagInit(instance); #endif while (!otSysPseudoResetWasRequested()) { otTaskletsProcess(instance); otSysProcessDrivers(instance); } otInstanceFinalize(instance); #if OPENTHREAD_ENABLE_MULTIPLE_INSTANCES free(otInstanceBuffer); #endif goto pseudo_reset; return 0; }
void TestDiag(void) { struct TestCommand { const char *mCommand; const char *mExpectedOutput; }; static const TestCommand tests[] = { { "diag\n", "diagnostics mode is disabled\r\n", }, { "diag send 10 100\n", "failed\r\nstatus 0xd\r\n", }, { "diag start\n", "start diagnostics mode\r\nstatus 0x00\r\n", }, { "diag", "diagnostics mode is enabled\r\n", }, { "", "diagnostics mode is enabled\r\n", }, { "diag channel 10\n", "failed\r\nstatus 0x7\r\n", }, { "diag channel 11\n", "set channel to 11\r\nstatus 0x00\r\n", }, { "diag channel\n", "channel: 11\r\n", }, { "diag power -10\n", "set tx power to -10 dBm\r\nstatus 0x00\r\n", }, { "diag power\n", "tx power: -10 dBm\r\n", }, { "diag stats\n", "received packets: 0\r\nsent packets: 0\r\nfirst received packet: rssi=0, lqi=0\r\n", }, { "diag send 20 100\n", "sending 0x14 packet(s), length 0x64\r\nstatus 0x00\r\n", }, { " diag \t send \t 20\t100", // Check parsing of extra space chars between args "sending 0x14 packet(s), length 0x64\r\nstatus 0x00\r\n", }, {"diag repeat 100 100\n", "sending packets of length 0x64 at the delay of 0x64 ms\r\nstatus 0x00\r\n"}, { "diag stop\n", "received packets: 0\r\nsent packets: 0\r\nfirst received packet: rssi=0, lqi=0\r\n\nstop diagnostics " "mode\r\nstatus 0x00\r\n", }, { "diag", "diagnostics mode is disabled\r\n", }, { "diag 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32", "failed: command string contains too many arguments\r\n", }, { NULL, NULL, }}; // initialize platform layer #if OPENTHREAD_ENABLE_POSIX_APP char *argv[] = {(char *)"test_diag", getenv("RADIO_DEVICE"), (char *)"1"}; #else char *argv[] = {(char *)"test_diag", (char *)"1"}; #endif otSysInit(sizeof(argv) / sizeof(char *), argv); // initialize diagnostics module otDiagInit(NULL); VerifyOrQuit(!otDiagIsEnabled(), "diagnostics mode should be disabled as default\n"); for (const TestCommand *test = &tests[0]; test->mCommand != NULL; test++) { const char *output = NULL; printf("\nCommand: %s", MakePrintable(test->mCommand)); output = otDiagProcessCmdLine(test->mCommand); printf("\nOutput: %s\n", MakePrintable(output)); VerifyOrQuit(strcmp(output, test->mExpectedOutput) == 0, "diagnostics output does not match expected result\n"); } }