// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/system_logs/shill_log_source.h"
#include <memory>
#include "base/functional/bind.h"
#include "base/run_loop.h"
#include "chromeos/ash/components/dbus/shill/shill_clients.h"
#include "content/public/test/browser_task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace system_logs {
namespace {
constexpr char kNetworkDevices[] = "network_devices";
constexpr char kNetworkServices[] = "network_services";
} // namespace
class ShillLogSourceTest : public ::testing::Test {
public:
ShillLogSourceTest() {}
~ShillLogSourceTest() override = default;
ShillLogSourceTest(const ShillLogSourceTest&) = delete;
ShillLogSourceTest*& operator=(const ShillLogSourceTest&) = delete;
void SetUp() override { ash::shill_clients::InitializeFakes(); }
void TearDown() override { ash::shill_clients::Shutdown(); }
std::unique_ptr<SystemLogsResponse> Fetch(bool scrub) {
std::unique_ptr<SystemLogsResponse> result;
base::RunLoop run_loop;
source_ = std::make_unique<ShillLogSource>(scrub);
source_->Fetch(base::BindOnce(
[](std::unique_ptr<SystemLogsResponse>* result,
base::OnceClosure quit_closure,
std::unique_ptr<SystemLogsResponse> response) {
*result = std::move(response);
std::move(quit_closure).Run();
},
&result, run_loop.QuitClosure()));
run_loop.Run();
return result;
}
private:
content::BrowserTaskEnvironment task_environment_;
std::unique_ptr<ShillLogSource> source_;
};
constexpr char kNotScrubbedDeviceStart[] = R"("/device/wifi1")";
constexpr char kNotScrubbedDeviceExpected[] = R"("/device/wifi1": {
"Address": "23456789abcd",
"DBus.Object": "/device/wifi1",
"DBus.Service": "org.freedesktop.ModemManager1",
"IPConfigs": {
"ipconfig_v4_path": {
"Address": "100.0.0.1",
"Gateway": "100.0.0.2",
"Method": "ipv4",
"Prefixlen": 1,
"WebProxyAutoDiscoveryUrl": "http://wpad.com/wpad.dat"
},
"ipconfig_v6_path": {
"Address": "0:0:0:0:100:0:0:1",
"Method": "ipv6"
}
},
"Name": "stub_wifi_device1",
"Type": "wifi"
})";
constexpr char kNotScrubbedServiceStart[] = R"("/service/wifi1")";
constexpr char kNotScrubbedServiceExpected[] = R"("/service/wifi1": {
"Connectable": true,
"Device": "/device/wifi1",
"GUID": "wifi1_guid",
"Mode": "managed",
"Name": "wifi1",
"Profile": "/profile/default",
"SSID": "wifi1",
"SecurityClass": "wep",
"State": "online",
"Type": "wifi",
"Visible": true,
"WiFi.HexSSID": "7769666931"
})";
TEST_F(ShillLogSourceTest, NotScrubbed) {
std::unique_ptr<SystemLogsResponse> response = Fetch(/*scrub=*/false);
ASSERT_TRUE(response);
const auto devices_iter = response->find(kNetworkDevices);
EXPECT_NE(devices_iter, response->end());
// Look for the fake wifi device and then compare the strings to easily
// identify any differences if the fake implementation changes.
size_t idx = devices_iter->second.find(kNotScrubbedDeviceStart);
EXPECT_NE(idx, std::string::npos);
EXPECT_EQ(
devices_iter->second.substr(idx, strlen(kNotScrubbedDeviceExpected)),
std::string(kNotScrubbedDeviceExpected));
const auto services_iter = response->find(kNetworkServices);
EXPECT_NE(services_iter, response->end());
// Look for a fake wifi service and then compare the strings to easily
// identify any differences if the fake implementation changes.
idx = services_iter->second.find(kNotScrubbedServiceStart);
EXPECT_NE(idx, std::string::npos);
EXPECT_EQ(
services_iter->second.substr(idx, strlen(kNotScrubbedServiceExpected)),
std::string(kNotScrubbedServiceExpected));
}
constexpr char kScrubbedDeviceStart[] = R"("/device/wifi1")";
constexpr char kScrubbedDeviceExpected[] = R"("/device/wifi1": {
"Address": "*** MASKED ***",
"DBus.Object": "/device/wifi1",
"DBus.Service": "org.freedesktop.ModemManager1",
"IPConfigs": {
"ipconfig_v4_path": {
"Address": "100.0.0.1",
"Gateway": "100.0.0.2",
"Method": "ipv4",
"Prefixlen": 1,
"WebProxyAutoDiscoveryUrl": "http://wpad.com/wpad.dat"
},
"ipconfig_v6_path": {
"Address": "0:0:0:0:100:0:0:1",
"Method": "ipv6"
}
},
"Name": "*** MASKED ***",
"Type": "wifi"
})";
constexpr char kScrubbedServiceStart[] = R"("/service/wifi1")";
constexpr char kScrubbedServiceExpected[] = R"("/service/wifi1": {
"Connectable": true,
"Device": "/device/wifi1",
"GUID": "wifi1_guid",
"Mode": "managed",
"Name": "service_wifi1",
"Profile": "/profile/default",
"SSID": "*** MASKED ***",
"SecurityClass": "wep",
"State": "online",
"Type": "wifi",
"Visible": true,
"WiFi.HexSSID": "*** MASKED ***"
})";
TEST_F(ShillLogSourceTest, Scrubbed) {
std::unique_ptr<SystemLogsResponse> response = Fetch(/*scrub=*/true);
ASSERT_TRUE(response);
const auto devices_iter = response->find(kNetworkDevices);
EXPECT_NE(devices_iter, response->end());
// Look for the fake wifi device and then compare the strings to easily
// identify any differences if the fake implementation changes.
size_t idx = devices_iter->second.find(kScrubbedDeviceStart);
EXPECT_NE(idx, std::string::npos);
EXPECT_EQ(devices_iter->second.substr(idx, strlen(kScrubbedDeviceExpected)),
std::string(kScrubbedDeviceExpected));
const auto services_iter = response->find(kNetworkServices);
EXPECT_NE(services_iter, response->end());
// Look for a fake wifi service and then compare the strings to easily
// identify any differences if the fake implementation changes.
idx = services_iter->second.find(kScrubbedServiceStart);
EXPECT_NE(idx, std::string::npos);
EXPECT_EQ(services_iter->second.substr(idx, strlen(kScrubbedServiceExpected)),
std::string(kScrubbedServiceExpected));
}
} // namespace system_logs