blob: 192a8730eed8a238a13b14bb4e005089a8eaf689 [file] [log] [blame]
// Copyright 2022 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <gtest/gtest.h>
#include <memory>
#include <base/files/file_util.h>
#include <base/files/scoped_temp_dir.h>
#include <base/strings/stringprintf.h>
#include <libmems/common_types.h>
#include "mems_setup/configuration.h"
#include "mems_setup/delegate.h"
#include "mems_setup/sensor_location.h"
#include "mems_setup/test_fakes.h"
#include "mems_setup/test_helper.h"
using mems_setup::testing::SensorTestBase;
namespace mems_setup {
namespace {
static gid_t kIioserviceGroupId = 777;
constexpr int kDeviceId = 1;
constexpr char kSystemPath[] = "/proximity-sensor/semtech-config/0/file";
constexpr char kFakeDevlink[] = "/dev/proximity_lte";
constexpr char kProximityConfigPath[] =
"/usr/share/chromeos-assets/proximity-sensor/bugzzy/"
"semtech_config_cellular.json";
constexpr char kProximityConfigJson[] =
"{\"channelConfig\": [{\"channel\" : \"1\", \"hardwaregain\" : 2, "
"\"threshFalling\" : 1014, \"threshFallingHysteresis\" : 73, "
"\"threshRising\" : 1014, \"threshRisingHysteresis\" : 72}], "
"\"threshFallingPeriod\" : 2, \"threshRisingPeriod\" : 2}";
constexpr char kDevlinkPrefix[] = "/dev/proximity-%s";
constexpr char kProximityConfigPrefix[] =
"/usr/share/chromeos-assets/proximity-sensor/bugzzy/"
"semtech_config_%s.json";
class ProximityTest : public SensorTestBase, public ::testing::Test {
public:
ProximityTest() : SensorTestBase("sx9360", kDeviceId) {
SetAbsolutePath();
mock_delegate_->AddGroup(GetConfiguration()->GetGroupNameForSysfs(),
kIioserviceGroupId);
mock_delegate_->SetStringToFile(base::FilePath(kProximityConfigPath),
kProximityConfigJson);
mock_delegate_->GetFakeCrosConfig()->SetString(
kSystemPath, libsar::SarConfigReader::kSystemPathProperty,
kProximityConfigPath);
mock_delegate_->SetMockDevlink(kFakeDevlink);
}
void SetAbsolutePath() {
ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
base::FilePath foo_dir = temp_dir.GetPath().Append("foo_dir");
base::FilePath bar_dir = temp_dir.GetPath().Append("bar_dir");
ASSERT_TRUE(base::CreateDirectory(foo_dir));
ASSERT_TRUE(base::CreateDirectory(bar_dir));
base::FilePath link_from = foo_dir.Append("from_file"), link_to;
ASSERT_TRUE(base::CreateTemporaryFileInDir(bar_dir, &link_to));
ASSERT_TRUE(base::CreateSymbolicLink(
base::FilePath("../bar_dir").Append(link_to.BaseName()), link_from))
<< "Failed to create file symlink.";
mock_device_->SetPath(link_from);
}
base::ScopedTempDir temp_dir;
};
TEST_F(ProximityTest, SetEvents) {
SetSingleSensor(kBaseSensorLocation);
EXPECT_TRUE(GetConfiguration()->Configure());
EXPECT_TRUE(mock_device_->GetChannel("proximity1")
->ReadNumberAttribute("hardwaregain")
.has_value());
EXPECT_EQ(2, mock_device_->GetChannel("proximity1")
->ReadNumberAttribute("hardwaregain")
.value());
EXPECT_TRUE(
mock_device_
->ReadNumberAttribute("events/in_proximity1_thresh_either_value")
.has_value());
EXPECT_EQ(1014, mock_device_
->ReadNumberAttribute(
"events/in_proximity1_thresh_either_value")
.value());
EXPECT_FALSE(
mock_device_
->ReadNumberAttribute("events/in_proximity1_thresh_either_hysteresis")
.has_value());
EXPECT_TRUE(mock_device_
->ReadNumberAttribute(
"events/in_proximity1_thresh_falling_hysteresis")
.has_value());
EXPECT_TRUE(
mock_device_
->ReadNumberAttribute("events/in_proximity1_thresh_rising_hysteresis")
.has_value());
EXPECT_EQ(73, mock_device_
->ReadNumberAttribute(
"events/in_proximity1_thresh_falling_hysteresis")
.value());
EXPECT_EQ(72, mock_device_
->ReadNumberAttribute(
"events/in_proximity1_thresh_rising_hysteresis")
.value());
EXPECT_TRUE(mock_device_->ReadNumberAttribute("events/thresh_either_period")
.has_value());
EXPECT_EQ(
2,
mock_device_->ReadNumberAttribute("events/thresh_either_period").value());
}
class ProximityTestWithParam : public SensorTestBase,
public ::testing::TestWithParam<
std::tuple<std::string, std::string, bool>> {
public:
ProximityTestWithParam() : SensorTestBase("sx9360", kDeviceId) {
SetAbsolutePath();
mock_delegate_->AddGroup(GetConfiguration()->GetGroupNameForSysfs(),
kIioserviceGroupId);
std::string proximity_config_path = base::StringPrintf(
kProximityConfigPrefix, std::get<1>(GetParam()).c_str());
mock_delegate_->SetStringToFile(base::FilePath(proximity_config_path),
kProximityConfigJson);
mock_delegate_->GetFakeCrosConfig()->SetString(
kSystemPath, libsar::SarConfigReader::kSystemPathProperty,
proximity_config_path);
mock_delegate_->SetMockDevlink(
base::StringPrintf(kDevlinkPrefix, std::get<0>(GetParam()).c_str()));
}
void SetAbsolutePath() {
ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
base::FilePath foo_dir = temp_dir.GetPath().Append("foo_dir");
base::FilePath bar_dir = temp_dir.GetPath().Append("bar_dir");
ASSERT_TRUE(base::CreateDirectory(foo_dir));
ASSERT_TRUE(base::CreateDirectory(bar_dir));
base::FilePath link_from = foo_dir.Append("from_file"), link_to;
ASSERT_TRUE(base::CreateTemporaryFileInDir(bar_dir, &link_to));
ASSERT_TRUE(base::CreateSymbolicLink(
base::FilePath("../bar_dir").Append(link_to.BaseName()), link_from))
<< "Failed to create file symlink.";
mock_device_->SetPath(link_from);
}
base::ScopedTempDir temp_dir;
};
TEST_P(ProximityTestWithParam, TypeCheck) {
SetSingleSensor(kBaseSensorLocation);
EXPECT_EQ(GetConfiguration()->Configure(), std::get<2>(GetParam()));
}
INSTANTIATE_TEST_SUITE_P(
ProximityTestWithParamRun,
ProximityTestWithParam,
::testing::Values(std::make_tuple("lte-wifi", "wifi_cellular", true),
std::make_tuple("lte-wifi", "wifi_lte", true),
std::make_tuple("lte-wifi", "cellular_wifi", true),
std::make_tuple("cellular-wifi", "lte_wifi", true),
std::make_tuple("lte", "cellular", true),
std::make_tuple("cellular", "lte", true),
std::make_tuple("wifi", "wifi", true),
std::make_tuple("cellula-wif", "lte_wifi", false),
std::make_tuple("lte-wifi", "lte", false),
std::make_tuple("lte-wifi", "cellular", false),
std::make_tuple("lte-wifi", "wifi", false),
std::make_tuple("wifi", "lte", false),
std::make_tuple("lte", "wifi", false)));
} // namespace
} // namespace mems_setup