test_net.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #include <unity.h>
  2. #include <kbf/wifi_legacy.h>
  3. #include <kbf/rtos.h>
  4. #include <kbf/uart.h>
  5. #include "kbf/net.h"
  6. #define KBF_TEST_MDNS_SSID "kbf_test_wifi_ap"
  7. #define KBF_TEST_MDNS_PASS "Pas$w0Rd1337"
  8. #define KBF_TEST_MDNS_MASTER "master"
  9. #define KBF_TEST_MDNS_SLAVE "slave"
  10. #define KBF_TEST_MDNS_SIGNAL "ready"
  11. #define KBF_TEST_SERVICE1_TYPE "_hax"
  12. #define KBF_TEST_SERVICE1_PORT 1337
  13. #define KBF_TEST_SERVICE1_INST "Test TCP service"
  14. #define KBF_TEST_SERVICE2_TYPE "_http"
  15. #define KBF_TEST_SERVICE2_PORT 80
  16. #define KBF_TEST_SERVICE2_INST "Test TCP/HTTP service"
  17. #define KBF_TEST_SERVICE3_TYPE "_hax"
  18. #define KBF_TEST_SERVICE3_PORT 31337
  19. #define KBF_TEST_SERVICE3_INST "Test UDP service"
  20. using namespace kbf;
  21. TEST_CASE("MAC address functions", "[kbf_net]") {
  22. uint8_t addr[] = {0, 0, 11, 128, 176, 255};
  23. auto mac = net::MAC(addr);
  24. TEST_ASSERT_EQUAL_STRING_MESSAGE("00:00:0B:80:B0:FF", mac.str().c_str(), "ctor / str()");
  25. net::setMac(mac);
  26. TEST_ASSERT_EQUAL_STRING_MESSAGE(mac.str().c_str(), net::getMac().str().c_str(), "getMac");
  27. }
  28. TEST_CASE("IP address functions", "[kbf_net]") {
  29. esp_ip4_addr testAddr = {2952898752};
  30. static const char *const testIP = "192.168.1.176";
  31. auto ipFromAddr = net::IP(testAddr);
  32. TEST_ASSERT_TRUE(ipFromAddr)
  33. TEST_ASSERT_EQUAL_STRING(testIP, ipFromAddr.str().c_str());
  34. TEST_ASSERT_EQUAL(0 , ipFromAddr[-1]);
  35. TEST_ASSERT_EQUAL(192, ipFromAddr[0]);
  36. TEST_ASSERT_EQUAL(168, ipFromAddr[1]);
  37. TEST_ASSERT_EQUAL(1 , ipFromAddr[2]);
  38. TEST_ASSERT_EQUAL(176, ipFromAddr[3]);
  39. TEST_ASSERT_EQUAL(0 , ipFromAddr[4]);
  40. auto ipFromString = net::IP(testIP);
  41. TEST_ASSERT_TRUE(ipFromString)
  42. TEST_ASSERT_EQUAL_STRING(testIP, ipFromString.str().c_str());
  43. TEST_ASSERT_TRUE_MESSAGE(ipFromAddr == ipFromString, "operator==")
  44. TEST_ASSERT_EQUAL_STRING(ipFromAddr.str().c_str(), ipFromString.str().c_str());
  45. for (const auto &invalidIP : {"", "invalid", "255.255.255.256", "123.123.123.", "0.0.-1.0"}) {
  46. auto ip = net::IP(invalidIP);
  47. TEST_ASSERT_FALSE(ip)
  48. TEST_ASSERT_EQUAL_STRING("", ip.str().c_str());
  49. }
  50. for (const auto &validIp : {"0.0.0.0", "255.255.255.255"}) {
  51. auto ip = net::IP(validIp);
  52. TEST_ASSERT_TRUE(ip)
  53. TEST_ASSERT_EQUAL_STRING(validIp, ip.str().c_str());
  54. }
  55. }
  56. using std::shared_ptr;
  57. static rtos::EventGroup eventGroup;
  58. static shared_ptr<kbf::UART> setupUart() {
  59. auto uart1 = new kbf::UART(1);
  60. uart1->setPins(33, 32, 25, 26); // TODO use Kconfig
  61. return shared_ptr<kbf::UART>(uart1);
  62. }
  63. void mdnsMaster() {
  64. wifi_legacy::start(wifi_legacy::AP::create(KBF_TEST_MDNS_SSID, KBF_TEST_MDNS_PASS));
  65. auto mdns = new net::MDNS();
  66. mdns->setHostname(KBF_TEST_MDNS_MASTER);
  67. setupUart()->waitFor(KBF_TEST_MDNS_SIGNAL);
  68. auto ip = mdns->queryA(KBF_TEST_MDNS_SLAVE);
  69. TEST_ASSERT_NOT_NULL(ip)
  70. TEST_ASSERT_EQUAL_STRING("192.168.4.2", ip->str().c_str());
  71. delete mdns;
  72. wifi_legacy::stop();
  73. }
  74. void mdnsSlave() {
  75. wifi_legacy::start();
  76. auto sta = wifi_legacy::getSTA();
  77. eventGroup.clear();
  78. sta->onIp = {[]() {
  79. auto mdns = new net::MDNS(KBF_TEST_MDNS_SLAVE);
  80. TEST_ASSERT_NULL(mdns->queryA("nonexistent"))
  81. auto ip = mdns->queryA(KBF_TEST_MDNS_MASTER);
  82. TEST_ASSERT_NOT_NULL(ip)
  83. TEST_ASSERT_EQUAL_STRING("192.168.4.1", ip->str().c_str());
  84. delete mdns;
  85. setupUart()->write(KBF_TEST_MDNS_SIGNAL);
  86. }};
  87. sta->onDisconnect = {[]() {
  88. eventGroup.setBit(0);
  89. }};
  90. sta->connect(KBF_TEST_MDNS_SSID, KBF_TEST_MDNS_PASS);
  91. eventGroup.waitForBit(0);
  92. wifi_legacy::stop();
  93. }
  94. TEST_CASE_MULTIPLE_DEVICES("mDNS", "[kbf_net]", mdnsMaster, mdnsSlave)
  95. void mdnsServiceMaster() {
  96. eventGroup.clear();
  97. wifi_legacy::start(wifi_legacy::AP::create(KBF_TEST_MDNS_SSID, KBF_TEST_MDNS_PASS));
  98. wifi_legacy::getAP()->onDisconnect = {[](wifi_legacy::AP::STA &) {
  99. eventGroup.setBit(0);
  100. }};
  101. auto mdns = new net::MDNS();
  102. mdns->setHostname(KBF_TEST_MDNS_MASTER);
  103. mdns->addService(KBF_TEST_SERVICE1_TYPE, KBF_TEST_SERVICE1_PORT, KBF_TEST_SERVICE1_INST);
  104. mdns->addService(KBF_TEST_SERVICE2_TYPE, KBF_TEST_SERVICE2_PORT, KBF_TEST_SERVICE2_INST);
  105. mdns->addService(KBF_TEST_SERVICE3_TYPE, KBF_TEST_SERVICE3_PORT, KBF_TEST_SERVICE3_INST, net::Proto::UDP);
  106. TEST_ASSERT_TRUE(eventGroup.waitForBit(0, 20000));
  107. delete mdns;
  108. wifi_legacy::stop();
  109. }
  110. void mdnsServiceSlave() {
  111. eventGroup.clear();
  112. wifi_legacy::start();
  113. wifi_legacy::getSTA()->connect(KBF_TEST_MDNS_SSID, KBF_TEST_MDNS_PASS);
  114. wifi_legacy::getSTA()->onIp = {[]() {
  115. eventGroup.setBit(0);
  116. }};
  117. wifi_legacy::getSTA()->onDisconnect = {[]() {
  118. TEST_ASSERT_EQUAL_STRING("", "connection error");
  119. }};
  120. eventGroup.waitForBit(0);
  121. auto mdns = new net::MDNS();
  122. auto results = mdns->queryPTR("_nonexistent", 2000);
  123. TEST_ASSERT_EQUAL(0, results.size());
  124. results = mdns->queryPTR(KBF_TEST_SERVICE1_TYPE, 2000);
  125. TEST_ASSERT_EQUAL(1, results.size());
  126. // TEST_ASSERT_EQUAL(net::Interface::STA, results[0].interface);
  127. TEST_ASSERT_EQUAL_STRING(KBF_TEST_MDNS_MASTER, results[0].hostName.c_str());
  128. TEST_ASSERT_EQUAL(net::Proto::TCP, results[0].protocol);
  129. // TEST_ASSERT_EQUAL(net::IPVersion::V4, results[0].ipVersion);
  130. TEST_ASSERT_EQUAL(KBF_TEST_SERVICE1_PORT, results[0].port);
  131. TEST_ASSERT_EQUAL(1, results[0].addresses.size());
  132. TEST_ASSERT_EQUAL_STRING("192.168.4.1", results[0].addresses[0].str().c_str());
  133. TEST_ASSERT_EQUAL_STRING(KBF_TEST_SERVICE1_INST, results[0].instanceName.c_str());
  134. results = mdns->queryPTR(KBF_TEST_SERVICE2_TYPE, 2000);
  135. TEST_ASSERT_EQUAL(1, results.size());
  136. // TEST_ASSERT_EQUAL(net::Interface::STA, results[1].interface);
  137. TEST_ASSERT_EQUAL_STRING(KBF_TEST_MDNS_MASTER, results[0].hostName.c_str());
  138. TEST_ASSERT_EQUAL(net::Proto::TCP, results[0].protocol);
  139. // TEST_ASSERT_EQUAL(net::IPVersion::V4, results[1].ipVersion);
  140. TEST_ASSERT_EQUAL(KBF_TEST_SERVICE2_PORT, results[0].port);
  141. TEST_ASSERT_EQUAL(1, results[0].addresses.size());
  142. TEST_ASSERT_EQUAL_STRING("192.168.4.1", results[0].addresses[0].str().c_str());
  143. TEST_ASSERT_EQUAL_STRING(KBF_TEST_SERVICE2_INST, results[0].instanceName.c_str());
  144. results = mdns->queryPTR(KBF_TEST_SERVICE3_TYPE, 2000, net::Proto::UDP);
  145. TEST_ASSERT_EQUAL(1, results.size());
  146. // TEST_ASSERT_EQUAL(net::Interface::STA, results[0].interface);
  147. TEST_ASSERT_EQUAL_STRING(KBF_TEST_MDNS_MASTER, results[0].hostName.c_str());
  148. TEST_ASSERT_EQUAL(net::Proto::UDP, results[0].protocol);
  149. // TEST_ASSERT_EQUAL(net::IPVersion::V4, results[0].ipVersion);
  150. TEST_ASSERT_EQUAL(KBF_TEST_SERVICE3_PORT, results[0].port);
  151. TEST_ASSERT_EQUAL(1, results[0].addresses.size());
  152. TEST_ASSERT_EQUAL_STRING("192.168.4.1", results[0].addresses[0].str().c_str());
  153. TEST_ASSERT_EQUAL_STRING(KBF_TEST_SERVICE3_INST, results[0].instanceName.c_str());
  154. delete mdns;
  155. wifi_legacy::stop();
  156. }
  157. TEST_CASE_MULTIPLE_DEVICES("mDNS", "[kbf_net]", mdnsServiceMaster, mdnsServiceSlave)