Add extracted tools: CitrineOS, OpenOCPP, ShapeShifter

- CitrineOS core extracted (CSMS OCPP 2.0.1)
- OpenOCPP extracted (firmware OCPP 1.6J/2.0.1)
- ShapeShifter library installed (pip install -e)
- ShapeShifter specification extracted
- EVerest extracted

TODO updated with progress
This commit is contained in:
Eric F
2026-06-08 00:38:27 -04:00
parent 468cfeaa50
commit d398a6ced2
7326 changed files with 1177561 additions and 7 deletions

View File

@@ -0,0 +1,726 @@
// SPDX-License-Identifier: Apache-2.0
// Copyright Pionix GmbH and Contributors to EVerest
#include "RunApplicationStub.hpp"
#include <WiFiSetup.hpp>
#include <gtest/gtest.h>
#include <nlohmann/json.hpp>
#include <string>
namespace {
using namespace module;
using nlohmann::json;
constexpr const char* example_psk = "e3003974af901976485f3e655b455791dcc20a5380f42a7839de3bfdc9d70d71";
constexpr const char* example_password = "LetMeIn2";
constexpr const char* example_long_password = "e3003974af901976485f3e655b455791dcc20a5380f42a7839de3bfdc9d70d71X";
class WpaCliSetupTest : public WpaCliSetup {
public:
// override to support testing
virtual bool is_wifi_interface(const std::string& interface) override {
if (interface == "ap0") {
return false;
} else if (interface == "eth0") {
return false;
}
return true;
};
};
struct WifiCredentials {
std::string interface;
std::string ssid;
std::string psk;
bool hidden;
operator std::string() {
json wifi_credentials = *this;
return wifi_credentials.dump();
}
};
void to_json(json& j, const WifiCredentials& k) {
j = json::object({{"interface", k.interface}, {"ssid", k.ssid}, {"psk", k.psk}, {"hidden", k.hidden}});
}
void from_json(const json& j, WifiCredentials& k) {
k.interface = j.at("interface");
k.ssid = j.at("ssid");
k.psk = j.at("psk");
k.hidden = false;
// optional item
auto it = j.find("hidden");
if ((it != j.end() && *it)) {
k.hidden = true;
}
}
//-----------------------------------------------------------------------------
// SSID conversions
TEST(Ssid, toHex) {
Ssid ssid;
EXPECT_EQ(ssid.to_hex("0123456789"), "30313233343536373839");
EXPECT_EQ(ssid.to_hex("abcdef"), "616263646566");
EXPECT_EQ(ssid.to_hex("ABCDEF"), "414243444546");
EXPECT_EQ(ssid.to_hex(R"(\" \\ \e\n\r\t)"), "22205c201b0a0d09");
EXPECT_EQ(ssid.to_hex(R"(\x00\x01\xfd)"), "0001fd");
}
TEST(Ssid, fromHex) {
Ssid ssid;
EXPECT_EQ(ssid.from_hex("30313233343536373839"), "0123456789");
EXPECT_EQ(ssid.from_hex("616263646566"), "abcdef");
EXPECT_EQ(ssid.from_hex("414243444546"), "ABCDEF");
EXPECT_EQ(ssid.from_hex("22205c201b0a0d09"), R"(\" \\ \e\n\r\t)");
EXPECT_EQ(ssid.from_hex("0001fd"), R"(\x00\x01\xfd)");
}
TEST(Ssid, complete) {
Ssid ssid;
std::stringstream ss;
for (std::uint16_t i = 0; i < 256; i++) {
ss << std::hex << std::setw(2) << std::setfill('0') << i;
}
const std::string values_str(ss.str());
const auto result_str = ssid.from_hex(values_str);
const auto result_hex = ssid.to_hex(result_str);
// std::cout << result_str << std::endl;
// std::cout << result_hex << std::endl;
EXPECT_EQ(values_str, result_hex);
}
TEST(Ssid, unusual) {
Ssid ssid;
// allowing upper case hex digits
EXPECT_EQ(ssid.from_hex("E0E1E2E3E4E5E6E7E8E9EaEbEcEdEeEfEAEBECEDEEEF"),
R"(\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xea\xeb\xec\xed\xee\xef)");
EXPECT_EQ(
ssid.to_hex(R"(\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xEA\xEB\xEC\xED\xEE\xEF)"),
"e0e1e2e3e4e5e6e7e8e9eaebecedeeefeaebecedeeef");
// parsing errors
EXPECT_EQ(ssid.to_hex(R"(123\?456)"), "");
EXPECT_EQ(ssid.to_hex(R"(123\?)"), "");
EXPECT_EQ(ssid.to_hex(R"(\?456)"), "");
EXPECT_EQ(ssid.to_hex(R"(\034)"), "");
EXPECT_EQ(ssid.to_hex(R"(\03)"), "");
EXPECT_EQ(ssid.to_hex(R"(\0)"), "");
EXPECT_EQ(ssid.to_hex(R"(\x)"), "");
EXPECT_EQ(ssid.to_hex(R"(\xz)"), "");
EXPECT_EQ(ssid.to_hex(R"(\xaz)"), "");
EXPECT_EQ(ssid.from_hex(R"(G123)"), "");
EXPECT_EQ(ssid.from_hex(R"(12G3)"), "");
EXPECT_EQ(ssid.from_hex(R"(123G)"), "");
EXPECT_EQ(ssid.from_hex(R"(1234568)"), "");
}
TEST(Ssid, json) {
/*
* worked example
* ssid=PP€-310034
* scan_results
* bssid / frequency / signal level / flags / ssid
* c2:ee:40:10:57:b8 2417 -45 [WPA2-PSK-CCMP][ESS] PP\xe2\x82\xac-310034
*
* MQTT
* everest_api/setup/var/wifi_info: [
* {"bssid":"c2:ee:40:10:57:b8","flags":["WPA2-PSK-CCMP","ESS"],"frequency":2417,"signal_level":-46,"ssid":"PP\\xe2\\x82\\xac-310034"}]
*/
Ssid conv;
std::string ssid_hex{"535349443de282ac3132"};
std::string ssid = conv.from_hex(ssid_hex);
WifiCredentials wifi = {"eth0", ssid, "\"psk\"", false};
nlohmann::json j;
to_json(j, wifi);
const auto transmitted = j.dump();
WifiCredentials received = json::parse(transmitted);
EXPECT_EQ(received.ssid, ssid);
const auto rec_ssid_hex = conv.to_hex(received.ssid);
EXPECT_EQ(rec_ssid_hex, ssid_hex);
}
//-----------------------------------------------------------------------------
// add_network()
TEST(add_network, wired) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_EQ(obj.add_network("eth0"), -1);
}
TEST(add_network, wireless) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_NE(obj.add_network("wlan0"), -1);
}
TEST(add_network, access_point) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_EQ(obj.add_network("ap0"), -1);
}
//-----------------------------------------------------------------------------
// set_network()
TEST(set_network, none_no_psk) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(obj.set_network("wlan0", 0, "PlusnetWireless", "", WpaCliSetup::network_security_t::none, false));
ASSERT_FALSE(ra.psk_called);
ASSERT_FALSE(ra.sae_password_called);
ASSERT_FALSE(ra.ieee80211w_called);
ASSERT_TRUE(ra.key_mgmt_called);
ASSERT_EQ(ra.key_mgmt_value, "NONE");
ASSERT_FALSE(ra.scan_ssid_called);
}
TEST(set_network, none_psk) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(
obj.set_network("wlan0", 0, "PlusnetWireless", example_psk, WpaCliSetup::network_security_t::none, false));
ASSERT_FALSE(ra.psk_called);
ASSERT_FALSE(ra.sae_password_called);
ASSERT_FALSE(ra.ieee80211w_called);
ASSERT_TRUE(ra.key_mgmt_called);
ASSERT_EQ(ra.key_mgmt_value, "NONE");
ASSERT_FALSE(ra.scan_ssid_called);
}
TEST(set_network, none_password) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(
obj.set_network("wlan0", 0, "PlusnetWireless", example_password, WpaCliSetup::network_security_t::none, false));
ASSERT_FALSE(ra.psk_called);
ASSERT_FALSE(ra.sae_password_called);
ASSERT_FALSE(ra.ieee80211w_called);
ASSERT_TRUE(ra.key_mgmt_called);
ASSERT_EQ(ra.key_mgmt_value, "NONE");
ASSERT_FALSE(ra.scan_ssid_called);
}
TEST(set_network, wpa2_no_psk) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(obj.set_network("wlan0", 0, "PlusnetWireless", "", WpaCliSetup::network_security_t::wpa2_only, false));
ASSERT_FALSE(ra.psk_called);
ASSERT_FALSE(ra.sae_password_called);
ASSERT_FALSE(ra.ieee80211w_called);
ASSERT_TRUE(ra.key_mgmt_called);
ASSERT_EQ(ra.key_mgmt_value, "NONE");
ASSERT_FALSE(ra.scan_ssid_called);
}
TEST(set_network, wpa2_psk) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(
obj.set_network("wlan0", 0, "PlusnetWireless", example_psk, WpaCliSetup::network_security_t::wpa2_only, false));
ASSERT_TRUE(ra.psk_called);
ASSERT_FALSE(ra.sae_password_called);
ASSERT_FALSE(ra.ieee80211w_called);
ASSERT_TRUE(ra.key_mgmt_called);
ASSERT_EQ(ra.key_mgmt_value, "WPA-PSK");
ASSERT_FALSE(ra.scan_ssid_called);
}
TEST(set_network, wpa2_password) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(obj.set_network("wlan0", 0, "PlusnetWireless", example_password,
WpaCliSetup::network_security_t::wpa2_only, false));
ASSERT_TRUE(ra.psk_called);
ASSERT_FALSE(ra.sae_password_called);
ASSERT_FALSE(ra.ieee80211w_called);
ASSERT_TRUE(ra.key_mgmt_called);
ASSERT_EQ(ra.key_mgmt_value, "WPA-PSK");
ASSERT_FALSE(ra.scan_ssid_called);
}
TEST(set_network, wpa3_no_psk) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(obj.set_network("wlan0", 0, "PlusnetWireless", "", WpaCliSetup::network_security_t::wpa3_only, false));
ASSERT_FALSE(ra.psk_called);
ASSERT_FALSE(ra.sae_password_called);
ASSERT_FALSE(ra.ieee80211w_called);
ASSERT_TRUE(ra.key_mgmt_called);
ASSERT_EQ(ra.key_mgmt_value, "NONE");
ASSERT_FALSE(ra.scan_ssid_called);
}
TEST(set_network, wpa3_psk) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(
obj.set_network("wlan0", 0, "PlusnetWireless", example_psk, WpaCliSetup::network_security_t::wpa3_only, false));
ASSERT_FALSE(ra.psk_called);
ASSERT_TRUE(ra.sae_password_called);
ASSERT_TRUE(ra.ieee80211w_called);
ASSERT_EQ(ra.ieee80211w_value, "2");
ASSERT_TRUE(ra.key_mgmt_called);
ASSERT_EQ(ra.key_mgmt_value, "SAE");
ASSERT_FALSE(ra.scan_ssid_called);
}
TEST(set_network, wpa3_password) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(obj.set_network("wlan0", 0, "PlusnetWireless", example_password,
WpaCliSetup::network_security_t::wpa3_only, false));
ASSERT_FALSE(ra.psk_called);
ASSERT_TRUE(ra.sae_password_called);
ASSERT_TRUE(ra.key_mgmt_called);
ASSERT_TRUE(ra.ieee80211w_called);
ASSERT_EQ(ra.ieee80211w_value, "2");
ASSERT_EQ(ra.key_mgmt_value, "SAE");
ASSERT_FALSE(ra.scan_ssid_called);
}
TEST(set_network, wpa2_and_wpa3_no_psk) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(
obj.set_network("wlan0", 0, "PlusnetWireless", "", WpaCliSetup::network_security_t::wpa2_and_wpa3, false));
ASSERT_FALSE(ra.psk_called);
ASSERT_FALSE(ra.sae_password_called);
ASSERT_FALSE(ra.ieee80211w_called);
ASSERT_TRUE(ra.key_mgmt_called);
ASSERT_EQ(ra.key_mgmt_value, "NONE");
ASSERT_FALSE(ra.scan_ssid_called);
}
TEST(set_network, wpa2_and_wpa3_psk) {
// with a PSK result is same as wpa2_only
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(obj.set_network("wlan0", 0, "PlusnetWireless", example_psk,
WpaCliSetup::network_security_t::wpa2_and_wpa3, false));
ASSERT_TRUE(ra.psk_called);
ASSERT_FALSE(ra.sae_password_called);
ASSERT_FALSE(ra.ieee80211w_called);
ASSERT_TRUE(ra.key_mgmt_called);
ASSERT_EQ(ra.key_mgmt_value, "WPA-PSK");
ASSERT_FALSE(ra.scan_ssid_called);
}
TEST(set_network, wpa2_and_wpa3_password) {
// configure for both
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(obj.set_network("wlan0", 0, "PlusnetWireless", example_password,
WpaCliSetup::network_security_t::wpa2_and_wpa3, false));
ASSERT_TRUE(ra.psk_called);
ASSERT_FALSE(ra.sae_password_called);
ASSERT_TRUE(ra.ieee80211w_called);
ASSERT_EQ(ra.ieee80211w_value, "1");
ASSERT_TRUE(ra.key_mgmt_called);
ASSERT_EQ(ra.key_mgmt_value, "WPA-PSK WPA-PSK-SHA256 SAE");
ASSERT_FALSE(ra.scan_ssid_called);
}
TEST(set_network, wpa2_and_wpa3_password_long) {
// configure for WPA3 only
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(obj.set_network("wlan0", 0, "PlusnetWireless", example_long_password,
WpaCliSetup::network_security_t::wpa2_and_wpa3, false));
ASSERT_FALSE(ra.psk_called);
ASSERT_TRUE(ra.sae_password_called);
ASSERT_TRUE(ra.ieee80211w_called);
ASSERT_EQ(ra.ieee80211w_value, "2");
ASSERT_TRUE(ra.key_mgmt_called);
ASSERT_EQ(ra.key_mgmt_value, "SAE");
ASSERT_FALSE(ra.scan_ssid_called);
}
TEST(set_network, wpa2) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(obj.set_network("wlan0", 0, "PlusnetWireless", "LetMeIn2", false));
ASSERT_TRUE(ra.psk_called);
ASSERT_TRUE(ra.key_mgmt_called);
ASSERT_FALSE(ra.scan_ssid_called);
}
TEST(set_network, open) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(obj.set_network("wlan0", 0, "OpenNet", "", false));
ASSERT_FALSE(ra.psk_called);
ASSERT_TRUE(ra.key_mgmt_called);
ASSERT_FALSE(ra.scan_ssid_called);
}
TEST(set_network, hidden_wpa2) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(obj.set_network("wlan0", 0, "Hidden", "LetMeIn3", true));
ASSERT_TRUE(ra.psk_called);
ASSERT_TRUE(ra.key_mgmt_called);
ASSERT_TRUE(ra.scan_ssid_called);
}
TEST(set_network, hidden_open) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(obj.set_network("wlan0", 0, "Hidden", "", true));
ASSERT_FALSE(ra.psk_called);
ASSERT_TRUE(ra.key_mgmt_called);
ASSERT_TRUE(ra.scan_ssid_called);
}
//-----------------------------------------------------------------------------
// enable_network()
TEST(enable_network, exists) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(obj.enable_network("wlan0", 0));
}
TEST(enable_network, doesnt_exist) {
stub::RunApplication ra;
ra.results["enable_network"] = {{}, {{"FAIL"}}, 0};
WpaCliSetupTest obj;
// still returns an exit code of 0
ASSERT_TRUE(obj.enable_network("wlan0", 1));
}
//-----------------------------------------------------------------------------
// disable_network()
TEST(disable_network, exists) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(obj.disable_network("wlan0", 0));
}
TEST(disable_network, doesnt_exist) {
stub::RunApplication ra;
ra.results["disable_network"] = {{}, {{"FAIL"}}, 0};
WpaCliSetupTest obj;
// still returns an exit code of 0
ASSERT_TRUE(obj.disable_network("wlan0", 1));
}
//-----------------------------------------------------------------------------
// select_network()
TEST(select_network, exists) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(obj.select_network("wlan0", 0));
}
TEST(select_network, doesnt_exist) {
stub::RunApplication ra;
ra.results["select_network"] = {{}, {{"FAIL"}}, 0};
WpaCliSetupTest obj;
// still returns an exit code of 0
ASSERT_TRUE(obj.select_network("wlan0", 1));
}
//-----------------------------------------------------------------------------
// remove_network()
TEST(remove_network, exists) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(obj.remove_network("wlan0", 0));
}
TEST(remove_network, doesnt_exist) {
stub::RunApplication ra;
ra.results["remove_network"] = {{}, {{"FAIL"}}, 0};
WpaCliSetupTest obj;
// still returns an exit code of 0
ASSERT_TRUE(obj.remove_network("wlan0", 1));
}
TEST(remove_network, fail) {
stub::RunApplication ra;
ra.results["remove_network"] = {{}, {{"Invalid REMOVE_NETWORK command - at least 1 argument is required."}}, 255};
WpaCliSetupTest obj;
ASSERT_FALSE(obj.remove_network("wlan0", -99));
}
//-----------------------------------------------------------------------------
// save_config()
TEST(save_config, success) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_TRUE(obj.save_config("wlan0"));
}
TEST(save_config, fail) {
stub::RunApplication ra;
WpaCliSetupTest obj;
ASSERT_FALSE(obj.save_config("ap0"));
}
//-----------------------------------------------------------------------------
// scan_wifi()
TEST(scan_wifi, none) {
stub::RunApplication ra;
WpaCliSetupTest obj;
auto res = obj.scan_wifi("wlan0");
ASSERT_TRUE(res.empty());
}
TEST(scan_wifi, some) {
stub::RunApplication ra;
ra.results["scan_results"] = {
{},
{
{"bssid / frequency / signal level / flags / ssid"},
{"14:49:bc:06:81:19\t2412\t-72\t[WPA2-PSK-CCMP][ESS]\tPlusnetWireless"},
{"6a:82:8c:38:b2:a1\t2412\t-93\t[WPA2-PSK-CCMP][ESS]\t\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"},
},
0};
WpaCliSetupTest obj;
auto res = obj.scan_wifi("wlan0");
ASSERT_FALSE(res.empty());
ASSERT_EQ(res.size(), 2);
module::WpaCliSetup::flags_t expected = {"WPA2-PSK-CCMP", "ESS"};
EXPECT_EQ(res[0].bssid, "14:49:bc:06:81:19");
EXPECT_EQ(res[0].ssid, "PlusnetWireless");
EXPECT_EQ(res[0].frequency, 2412);
EXPECT_EQ(res[0].signal_level, -72);
EXPECT_EQ(res[0].flags, expected);
EXPECT_EQ(res[1].bssid, "6a:82:8c:38:b2:a1");
EXPECT_EQ(res[1].ssid, "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00");
EXPECT_EQ(res[1].frequency, 2412);
EXPECT_EQ(res[1].signal_level, -93);
EXPECT_EQ(res[1].flags, expected);
}
TEST(scan_wifi, more) {
stub::RunApplication ra;
ra.results["scan_results"] = {
{},
{
{"bssid / frequency / signal level / flags / ssid"},
{"14:49:bc:06:81:19\t2412\t-71\t[WPA2-PSK-CCMP][ESS]\tPlusnetWireless"},
{"14:49:bc:06:81:1b\t2412\t-71\t[WPA2-PSK-CCMP][ESS]\t\\x00\\x00\\x00\\x00\\x00\\x00\\x00"},
{"00:1e:42:33:62:07\t2462\t-89\t[WPA2-PSK-CCMP+TKIP][ESS][UTF-8]\tRUT950_6207"},
{"b4:ba:9d:16:e2:ba\t2437\t-92\t[WPA2-PSK-CCMP][WPS][ESS]\tSKYLZMEY"},
{"14:49:bc:06:81:1c\t2412\t-72\t[ESS]\tTesting123"},
{"36:49:5b:f8:e1:07\t2412\t-92\t[ESS]\tEE WiFi"},
{"14:49:bc:06:81:18\t2412\t-73\t[WPA2-PSK-CCMP][ESS]\t\\x00\\x00\\x00\\x00\\x00\\x00\\x00"},
{"6a:82:8c:38:b2:a1\t2412\t-88\t[WPA2-PSK-CCMP][ESS]\t\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"},
{"18:82:8c:38:b2:a5\t2412\t-92\t[WPA2-PSK-CCMP][WPS][ESS]\tBT-3GAG3M"},
{"6a:82:8c:38:b2:a6\t2412\t-92\t[ESS]\tEE WiFi"},
},
0};
WpaCliSetupTest obj;
auto res = obj.scan_wifi("wlan0");
ASSERT_FALSE(res.empty());
ASSERT_EQ(res.size(), 10);
module::WpaCliSetup::flags_t expected1 = {"WPA2-PSK-CCMP", "ESS"};
module::WpaCliSetup::flags_t expected2 = {"WPA2-PSK-CCMP+TKIP", "ESS", "UTF-8"};
module::WpaCliSetup::flags_t expected3 = {"WPA2-PSK-CCMP", "WPS", "ESS"};
module::WpaCliSetup::flags_t expected4 = {"ESS"};
EXPECT_EQ(res[0].bssid, "14:49:bc:06:81:19");
EXPECT_EQ(res[0].ssid, "PlusnetWireless");
EXPECT_EQ(res[0].frequency, 2412);
EXPECT_EQ(res[0].signal_level, -71);
EXPECT_EQ(res[0].flags, expected1);
EXPECT_EQ(res[1].bssid, "14:49:bc:06:81:1b");
EXPECT_EQ(res[1].ssid, "\\x00\\x00\\x00\\x00\\x00\\x00\\x00");
EXPECT_EQ(res[1].frequency, 2412);
EXPECT_EQ(res[1].signal_level, -71);
EXPECT_EQ(res[1].flags, expected1);
EXPECT_EQ(res[2].bssid, "00:1e:42:33:62:07");
EXPECT_EQ(res[2].ssid, "RUT950_6207");
EXPECT_EQ(res[2].frequency, 2462);
EXPECT_EQ(res[2].signal_level, -89);
EXPECT_EQ(res[2].flags, expected2);
EXPECT_EQ(res[3].bssid, "b4:ba:9d:16:e2:ba");
EXPECT_EQ(res[3].ssid, "SKYLZMEY");
EXPECT_EQ(res[3].frequency, 2437);
EXPECT_EQ(res[3].signal_level, -92);
EXPECT_EQ(res[3].flags, expected3);
EXPECT_EQ(res[4].bssid, "14:49:bc:06:81:1c");
EXPECT_EQ(res[4].ssid, "Testing123");
EXPECT_EQ(res[4].frequency, 2412);
EXPECT_EQ(res[4].signal_level, -72);
EXPECT_EQ(res[4].flags, expected4);
EXPECT_EQ(res[5].bssid, "36:49:5b:f8:e1:07");
EXPECT_EQ(res[5].ssid, "EE WiFi");
EXPECT_EQ(res[5].frequency, 2412);
EXPECT_EQ(res[5].signal_level, -92);
EXPECT_EQ(res[5].flags, expected4);
EXPECT_EQ(res[6].bssid, "14:49:bc:06:81:18");
EXPECT_EQ(res[6].ssid, "\\x00\\x00\\x00\\x00\\x00\\x00\\x00");
EXPECT_EQ(res[6].frequency, 2412);
EXPECT_EQ(res[6].signal_level, -73);
EXPECT_EQ(res[6].flags, expected1);
EXPECT_EQ(res[7].bssid, "6a:82:8c:38:b2:a1");
EXPECT_EQ(res[7].ssid, "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00");
EXPECT_EQ(res[7].frequency, 2412);
EXPECT_EQ(res[7].signal_level, -88);
EXPECT_EQ(res[7].flags, expected1);
EXPECT_EQ(res[8].bssid, "18:82:8c:38:b2:a5");
EXPECT_EQ(res[8].ssid, "BT-3GAG3M");
EXPECT_EQ(res[8].frequency, 2412);
EXPECT_EQ(res[8].signal_level, -92);
EXPECT_EQ(res[8].flags, expected3);
EXPECT_EQ(res[9].bssid, "6a:82:8c:38:b2:a6");
EXPECT_EQ(res[9].ssid, "EE WiFi");
EXPECT_EQ(res[9].frequency, 2412);
EXPECT_EQ(res[9].signal_level, -92);
EXPECT_EQ(res[9].flags, expected4);
}
//-----------------------------------------------------------------------------
// list_networks()
TEST(list_networks, none) {
stub::RunApplication ra;
WpaCliSetupTest obj;
auto res = obj.list_networks("wlan0");
ASSERT_TRUE(res.empty());
}
TEST(list_networks, one) {
stub::RunApplication ra;
ra.results["list_networks"] = {{},
{
{"network id / ssid / bssid / flags"},
{"0\t\tany\t[DISABLED]"},
},
0};
WpaCliSetupTest obj;
auto res = obj.list_networks("wlan0");
ASSERT_FALSE(res.empty());
ASSERT_EQ(res.size(), 1);
module::WpaCliSetup::flags_t expected = {"WPA2-PSK-CCMP", "ESS"};
EXPECT_EQ(res[0].network_id, 0);
EXPECT_EQ(res[0].ssid, "");
}
TEST(list_networks, two) {
stub::RunApplication ra;
ra.results["list_networks"] = {{},
{
{"network id / ssid / bssid / flags"},
{"0\t\tany\t[DISABLED]"},
{"1\tPlusnetWireless\tany\t[CURRENT]"},
},
0};
WpaCliSetupTest obj;
auto res = obj.list_networks("wlan0");
ASSERT_FALSE(res.empty());
ASSERT_EQ(res.size(), 2);
module::WpaCliSetup::flags_t expected = {"WPA2-PSK-CCMP", "ESS"};
EXPECT_EQ(res[0].network_id, 0);
EXPECT_EQ(res[0].ssid, "");
EXPECT_EQ(res[1].network_id, 1);
EXPECT_EQ(res[1].ssid, "PlusnetWireless");
}
//-----------------------------------------------------------------------------
// list_networks_status()
TEST(list_networks, not_connected) {
stub::RunApplication ra;
WpaCliSetupTest obj;
auto res = obj.list_networks_status("wlan0");
ASSERT_TRUE(res.empty());
ASSERT_FALSE(ra.signal_poll_called);
}
TEST(list_networks, connected) {
stub::RunApplication ra;
ra.results["list_networks"] = {{},
{
{"network id / ssid / bssid / flags"},
{"0\t\tany\t[DISABLED]"},
{"1\tPlusnetWireless\tany\t[CURRENT]"},
{"2\tHiddenNet\tany\t[DISABLED]"},
},
0};
ra.results["status"] = {{},
{
{"bssid=14:49:bc:06:81:19"},
{"freq=2412"},
{"ssid=PlusnetWireless"},
{"id=1"},
{"mode=station"},
{"wifi_generation=4"},
{"pairwise_cipher=CCMP"},
{"group_cipher=CCMP"},
{"key_mgmt=WPA2-PSK"},
{"wpa_state=COMPLETED"},
{"ip_address=172.25.1.11"},
{"p2p_device_address=c2:ee:40:b0:57:b8"},
{"address=c0:ee:40:b0:57:b8"},
{"uuid=7dd9abf8-53f0-532b-a763-2f43537e4234"},
},
0};
ra.results["signal_poll"] = {{},
{
{"RSSI=-73"},
{"LINKSPEED=54"},
{"NOISE=9999"},
{"FREQUENCY=2412"},
{"WIDTH=20 MHz"},
{"CENTER_FRQ1=2412"},
},
0};
WpaCliSetupTest obj;
auto res = obj.list_networks_status("wlan0");
ASSERT_FALSE(res.empty());
ASSERT_TRUE(ra.signal_poll_called);
ASSERT_EQ(res.size(), 3);
EXPECT_EQ(res[0].interface, "wlan0");
EXPECT_EQ(res[0].network_id, 0);
EXPECT_EQ(res[0].ssid, "");
EXPECT_FALSE(res[0].connected);
EXPECT_EQ(res[0].signal_level, -100);
EXPECT_EQ(res[1].interface, "wlan0");
EXPECT_EQ(res[1].network_id, 1);
EXPECT_EQ(res[1].ssid, "PlusnetWireless");
EXPECT_TRUE(res[1].connected);
EXPECT_EQ(res[1].signal_level, -73);
EXPECT_EQ(res[2].interface, "wlan0");
EXPECT_EQ(res[2].network_id, 2);
EXPECT_EQ(res[2].ssid, "HiddenNet");
EXPECT_FALSE(res[2].connected);
EXPECT_EQ(res[2].signal_level, -100);
}
//-----------------------------------------------------------------------------
// is_wifi_interface()
// not tested as it is checking for files in /proc so depends on the
// machine the tests are running on
} // namespace