blob: c64d53763d64c6da7497fe4851db81e73ae98842 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/variations/cros/evaluate_seed.h"
#include "base/strings/strcat.h"
#include "base/test/scoped_chromeos_version_info.h"
#include "build/branding_buildflags.h"
#include "components/variations/client_filterable_state.h"
#include "components/variations/cros/featured.pb.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace variations::evaluate_seed {
MATCHER_P(EqualsProto,
message,
"Match a proto Message equal to the matcher's argument.") {
std::string expected_serialized, actual_serialized;
message.SerializeToString(&expected_serialized);
arg.SerializeToString(&actual_serialized);
return expected_serialized == actual_serialized;
}
TEST(VariationsCrosEvaluateSeed, GetClientFilterable_Enrolled) {
base::CommandLine command_line({"evaluate_seed", "--enterprise-enrolled"});
std::unique_ptr<ClientFilterableState> state =
GetClientFilterableState(&command_line);
EXPECT_TRUE(state->IsEnterprise());
}
TEST(VariationsCrosEvaluateSeed, GetClientFilterable_NotEnrolled) {
base::CommandLine command_line({"evaluate_seed"});
std::unique_ptr<ClientFilterableState> state =
GetClientFilterableState(&command_line);
EXPECT_FALSE(state->IsEnterprise());
}
struct Param {
std::string test_name;
std::string channel_name;
Study::Channel channel;
};
class VariationsCrosEvaluateSeedGetChannel
: public ::testing::TestWithParam<Param> {
protected:
VariationsCrosEvaluateSeedGetChannel() = default;
};
TEST_P(VariationsCrosEvaluateSeedGetChannel,
GetClientFilterableState_Channel_Override) {
base::CommandLine command_line(
{"evaluate_seed", base::StrCat({"--fake-variations-channel=",
GetParam().channel_name, "-channel"})});
std::unique_ptr<ClientFilterableState> state =
GetClientFilterableState(&command_line);
EXPECT_EQ(GetParam().channel, state->channel);
}
#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
// Verify GetClientFilterableState gets the channel from lsb-release on branded
// builds.
TEST_P(VariationsCrosEvaluateSeedGetChannel,
GetClientFilterableState_Channel_Branded) {
std::string lsb_release = base::StrCat(
{"CHROMEOS_RELEASE_TRACK=", GetParam().channel_name, "-channel"});
const base::Time lsb_release_time(base::Time::FromDoubleT(12345.6));
base::test::ScopedChromeOSVersionInfo lsb_info(lsb_release, lsb_release_time);
base::CommandLine command_line({"evaluate_seed"});
std::unique_ptr<ClientFilterableState> state =
GetClientFilterableState(&command_line);
EXPECT_EQ(GetParam().channel, state->channel);
}
#else // BUILDFLAG(GOOGLE_CHROME_BRANDING)
// Verify that we use unknown channel on non-branded builds.
TEST(VariationsCrosEvaluateSeed, GetClientFilterableState_Channel_NotBranded) {
base::CommandLine command_line({"evaluate_seed"});
std::unique_ptr<ClientFilterableState> state =
GetClientFilterableState(&command_line);
EXPECT_EQ(Study::UNKNOWN, state->channel);
}
#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING)
INSTANTIATE_TEST_SUITE_P(
VariationsCrosEvaluateSeedGetChannel,
VariationsCrosEvaluateSeedGetChannel,
::testing::ValuesIn<Param>({{"Stable", "stable", Study::STABLE},
{"Beta", "beta", Study::BETA},
{"Dev", "dev", Study::DEV},
{"Canary", "canary", Study::CANARY},
{"Unknown", "testimage", Study::UNKNOWN}}),
[](const testing::TestParamInfo<
VariationsCrosEvaluateSeedGetChannel::ParamType>& info) {
return info.param.test_name;
});
// Should ignore data if flag is off.
TEST(VariationsCrosEvaluateSeed, GetSafeSeedData_Off) {
featured::SeedDetails safe_seed;
safe_seed.set_compressed_data("some text");
std::string text;
safe_seed.SerializeToString(&text);
FILE* stream = fmemopen(text.data(), text.size(), "r");
ASSERT_NE(stream, nullptr);
base::CommandLine command_line({"evaluate_seed"});
auto data = GetSafeSeedData(&command_line, stream);
featured::SeedDetails empty_seed;
ASSERT_TRUE(data.has_value());
EXPECT_FALSE(data.value().use_safe_seed);
EXPECT_THAT(data.value().seed_data, EqualsProto(empty_seed));
}
// Should return specified data via stream if flag is on.
TEST(VariationsCrosEvaluateSeed, GetSafeSeedData_On) {
featured::SeedDetails safe_seed;
safe_seed.set_compressed_data("some text");
std::string text;
safe_seed.SerializeToString(&text);
FILE* stream = fmemopen(text.data(), text.size(), "r");
ASSERT_NE(stream, nullptr);
base::CommandLine command_line({"evaluate_seed", "--use-safe-seed"});
auto data = GetSafeSeedData(&command_line, stream);
ASSERT_TRUE(data.has_value());
EXPECT_TRUE(data.value().use_safe_seed);
EXPECT_THAT(data.value().seed_data, EqualsProto(safe_seed));
}
// Should not attempt to read stream if flag is not on.
TEST(VariationsCrosEvaluateSeed, GetSafeSeedData_Off_FailRead) {
featured::SeedDetails safe_seed;
safe_seed.set_compressed_data("some text");
std::string text;
safe_seed.SerializeToString(&text);
FILE* stream = fmemopen(text.data(), text.size(), "w");
ASSERT_NE(stream, nullptr);
base::CommandLine command_line({"evaluate_seed"});
auto data = GetSafeSeedData(&command_line, stream);
featured::SeedDetails empty_seed;
ASSERT_TRUE(data.has_value());
EXPECT_FALSE(data.value().use_safe_seed);
EXPECT_THAT(data.value().seed_data, EqualsProto(empty_seed));
}
// If flag is on and reading fails, should return nullopt.
TEST(VariationsCrosEvaluateSeed, GetSafeSeedData_On_FailRead) {
featured::SeedDetails safe_seed;
safe_seed.set_compressed_data("some text");
std::string text;
safe_seed.SerializeToString(&text);
FILE* stream = fmemopen(text.data(), text.size(), "w");
ASSERT_NE(stream, nullptr);
base::CommandLine command_line({"evaluate_seed", "--use-safe-seed"});
auto data = GetSafeSeedData(&command_line, stream);
EXPECT_FALSE(data.has_value());
}
// If flag is on and parsing input fails, should return nullopt.
TEST(VariationsCrosEvaluateSeed, GetSafeSeedData_On_FailParse) {
std::string text("not a serialized proto");
FILE* stream = fmemopen(text.data(), text.size(), "r");
ASSERT_NE(stream, nullptr);
base::CommandLine command_line({"evaluate_seed", "--use-safe-seed"});
auto data = GetSafeSeedData(&command_line, stream);
ASSERT_FALSE(data.has_value());
}
// If flag is on and reading fails, should return nullopt.
TEST(VariationsCrosEvaluateSeed, GetSafeSeedData_On_FailRead_Null) {
base::CommandLine command_line({"evaluate_seed", "--use-safe-seed"});
auto data = GetSafeSeedData(&command_line, nullptr);
EXPECT_FALSE(data.has_value());
}
TEST(VariationsCrosEvaluateSeed, Main_NoFlag) {
base::CommandLine command_line({"evaluate_seed"});
EXPECT_EQ(0, EvaluateSeedMain(&command_line, nullptr));
}
TEST(VariationsCrosEvaluateSeed, Main_NoStdin) {
base::CommandLine command_line({"evaluate_seed", "--use-safe-seed"});
EXPECT_EQ(1, EvaluateSeedMain(&command_line, nullptr));
}
} // namespace variations::evaluate_seed