blob: 2e7bd0e15f4e9e612eaed6eb6ada391a35358913 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chromeos/policy/device_autoupdate_time_restrictions_proto_parser.h"
#include <memory>
#include <tuple>
#include <utility>
#include <vector>
#include "base/time/time.h"
#include "base/values.h"
#include "chrome/browser/chromeos/policy/weekly_time/weekly_time.h"
#include "chrome/browser/chromeos/policy/weekly_time/weekly_time_interval.h"
#include "components/policy/proto/chrome_device_policy.pb.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace em = enterprise_management;
namespace policy {
namespace {
constexpr em::WeeklyTimeProto_DayOfWeek kWeekdays[]{
em::WeeklyTimeProto::DAY_OF_WEEK_UNSPECIFIED,
em::WeeklyTimeProto::MONDAY,
em::WeeklyTimeProto::TUESDAY,
em::WeeklyTimeProto::WEDNESDAY,
em::WeeklyTimeProto::THURSDAY,
em::WeeklyTimeProto::FRIDAY,
em::WeeklyTimeProto::SATURDAY,
em::WeeklyTimeProto::SUNDAY};
} // namespace
TEST(DeviceAutoUpdateTimeRestrictionsErrorTest, EmptyProto) {
em::AutoUpdateSettingsProto proto;
auto result = AutoUpdateDisallowedTimeIntervalsToValue(proto);
EXPECT_FALSE(result);
}
TEST(DeviceAutoUpdateTimeRestrictionsErrorTest, AllInvalidIntervals) {
em::AutoUpdateSettingsProto settings_proto;
em::WeeklyTimeIntervalProto interval_proto;
// Proto with invalid fields.
em::WeeklyTimeProto* start = interval_proto.mutable_start();
em::WeeklyTimeProto* end = interval_proto.mutable_end();
start->set_day_of_week(kWeekdays[0]);
start->set_time(1000);
end->set_day_of_week(kWeekdays[3]);
end->set_time(1000);
*settings_proto.add_disallowed_time_intervals() = interval_proto;
// Empty proto.
settings_proto.add_disallowed_time_intervals();
auto result = AutoUpdateDisallowedTimeIntervalsToValue(settings_proto);
EXPECT_FALSE(result);
}
// Represents a WeeklyInterval as a tuple
using TestInterval = std::tuple<bool /* is_valid_interval */,
int /* start_day_of_week */,
int /* start_time */,
int /* end_day_of_week */,
int /* end_time */>;
class DeviceAutoUpdateTimeRestrictionsTest
: public testing::TestWithParam<std::vector<TestInterval>> {
protected:
ParamType intervals() const { return GetParam(); }
em::WeeklyTimeIntervalProto ConvertTupleToWeeklyIntervalProto(
const TestInterval& time_tuple) {
em::WeeklyTimeIntervalProto interval_proto;
em::WeeklyTimeProto* start = interval_proto.mutable_start();
em::WeeklyTimeProto* end = interval_proto.mutable_end();
start->set_day_of_week(kWeekdays[std::get<1>(time_tuple)]);
start->set_time(std::get<2>(time_tuple));
end->set_day_of_week(kWeekdays[std::get<3>(time_tuple)]);
end->set_time(std::get<4>(time_tuple));
return interval_proto;
}
em::AutoUpdateSettingsProto MakeAutoUpdateSettingsProto(
const ParamType& intervals) {
em::AutoUpdateSettingsProto proto;
for (const auto& interval : intervals) {
*proto.add_disallowed_time_intervals() =
ConvertTupleToWeeklyIntervalProto(interval);
}
return proto;
}
std::unique_ptr<WeeklyTimeInterval> TupleToWeeklyTimeInterval(
const TestInterval& time_tuple) {
bool is_valid_interval = std::get<0>(time_tuple);
if (!is_valid_interval) {
return nullptr;
}
int start_day = std::get<1>(time_tuple);
int start_time = std::get<2>(time_tuple);
int end_day = std::get<3>(time_tuple);
int end_time = std::get<4>(time_tuple);
return std::make_unique<WeeklyTimeInterval>(
WeeklyTime(start_day, start_time), WeeklyTime(end_day, end_time));
}
};
TEST_P(DeviceAutoUpdateTimeRestrictionsTest, ValidTest) {
em::AutoUpdateSettingsProto proto = MakeAutoUpdateSettingsProto(intervals());
auto result = AutoUpdateDisallowedTimeIntervalsToValue(proto);
base::ListValue expected;
for (const auto& tuple : intervals()) {
auto interval = TupleToWeeklyTimeInterval(tuple);
if (interval) {
expected.Append(interval->ToValue());
}
}
EXPECT_TRUE(result);
EXPECT_EQ(*result, expected);
}
INSTANTIATE_TEST_CASE_P(OneInterval,
DeviceAutoUpdateTimeRestrictionsTest,
testing::Values(std::vector<TestInterval>{
std::make_tuple(true, 1, 1500, 2, 1000)}));
INSTANTIATE_TEST_CASE_P(MultipleIntervals,
DeviceAutoUpdateTimeRestrictionsTest,
testing::Values(std::vector<TestInterval>{
std::make_tuple(true, 1, 1500, 2, 1000),
std::make_tuple(true, 1, 15, 5, 10),
std::make_tuple(true, 1, 200, 6, 100),
std::make_tuple(true, 4, 10, 3, 1)}));
INSTANTIATE_TEST_CASE_P(MixedGoodAndBadIntervals,
DeviceAutoUpdateTimeRestrictionsTest,
testing::Values(std::vector<TestInterval>{
std::make_tuple(true, 1, 1500, 2, 1000),
std::make_tuple(false, 0, 15, 5, 10),
std::make_tuple(true, 1, 200, 6, 100),
std::make_tuple(false, 4, 10, 4, -100)}));
} // namespace policy