blob: 5426dd70f087425dda7c44a5528e9f4f123c18ec [file] [log] [blame]
// Copyright 2022 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/arc/policy/arc_policy_handler.h"
#include <string>
#include <utility>
#include "base/functional/bind.h"
#include "base/json/json_string_value_serializer.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "chrome/browser/ash/arc/policy/arc_policy_bridge.h"
#include "chrome/browser/ash/arc/policy/managed_configuration_variables.h"
#include "components/policy/core/common/policy_map.h"
#include "components/policy/policy_constants.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace arc {
namespace {
constexpr char kKey1[] = "key1";
constexpr char kKey2[] = "key2";
constexpr char kKey3[] = "key3";
constexpr char kPackageName1[] = "com.dropbox.android";
constexpr char kPackageName2[] = "de.blinkt.openvpn";
constexpr char kPackageName3[] = "com.citrix.Receiver";
constexpr char kInvalidVariable[] = "klja3\"084t4k5~j1.,mm1!";
constexpr char kKnownVariable1Pattern[] = "known variable: ${%s}";
constexpr char kKnownVariable2Pattern[] = "known variable: ${%s:%s}";
constexpr char kUnknownVariable1Pattern[] = "unknown variable: ${%s}";
base::Value BuildArcPolicyFromApplications(base::Value::List applications) {
base::Value::Dict arc_policy;
arc_policy.Set(ArcPolicyBridge::kApplications, std::move(applications));
std::string json;
JSONStringValueSerializer serializer(&json);
serializer.Serialize(arc_policy);
return base::Value(std::move(json));
}
base::Value BuildApplication(const std::string& package_name,
base::Value::Dict managed_configuration) {
base::Value::Dict application;
application.Set(ArcPolicyBridge::kPackageName, package_name);
application.Set(ArcPolicyBridge::kManagedConfiguration,
std::move(managed_configuration));
return base::Value(std::move(application));
}
base::Value SampleArcPolicyWithoutIssues() {
base::Value::Dict managed_configuration1;
managed_configuration1.Set(
kKey1,
base::StringPrintf(kKnownVariable2Pattern, kDeviceAssetId, kUserEmail));
base::Value::Dict managed_configuration2;
managed_configuration2.Set(
kKey2, base::StringPrintf(kKnownVariable1Pattern, kDeviceDirectoryId));
base::Value::List applications;
applications.Append(
BuildApplication(kPackageName1, std::move(managed_configuration1)));
applications.Append(
BuildApplication(kPackageName2, std::move(managed_configuration2)));
return BuildArcPolicyFromApplications(std::move(applications));
}
base::Value SampleArcPolicyWithIssues() {
base::Value::Dict managed_configuration1;
managed_configuration1.Set(
kKey1,
base::StringPrintf(kKnownVariable1Pattern, kDeviceAnnotatedLocation));
base::Value::Dict managed_configuration2;
managed_configuration2.Set(
kKey2, base::StringPrintf(kUnknownVariable1Pattern, kInvalidVariable));
base::Value::Dict managed_configuration3;
managed_configuration3.Set(
kKey3, base::StringPrintf(kKnownVariable2Pattern, kDeviceSerialNumber,
kUserEmailName));
base::Value::List applications;
applications.Append(
BuildApplication(kPackageName1, std::move(managed_configuration1)));
applications.Append(
BuildApplication(kPackageName2, std::move(managed_configuration2)));
applications.Append(
BuildApplication(kPackageName3, std::move(managed_configuration3)));
return BuildArcPolicyFromApplications(std::move(applications));
}
std::u16string FakeL10nLookup(int message_id) {
return u"$1,$2";
}
} // namespace
TEST(ArcPolicyHandlerTest, SampleWithoutIssues) {
// Set up a PolicyMap without managed configuration issues.
policy::PolicyMap::Entry entry;
entry.set_value(SampleArcPolicyWithoutIssues());
policy::PolicyMap policies;
policies.Set(policy::key::kArcPolicy, std::move(entry));
// Call the handler to find issues in policy.
ArcPolicyHandler handler;
handler.PrepareForDisplaying(&policies);
// Verify no issues were found.
EXPECT_FALSE(policies.Get(policy::key::kArcPolicy)
->HasMessage(policy::PolicyMap::MessageType::kInfo));
EXPECT_FALSE(policies.Get(policy::key::kArcPolicy)
->HasMessage(policy::PolicyMap::MessageType::kError));
EXPECT_FALSE(policies.Get(policy::key::kArcPolicy)
->HasMessage(policy::PolicyMap::MessageType::kWarning));
}
TEST(ArcPolicyHandlerTest, SampleWithIssues) {
// Set up a PolicyMap with managed configuration issues.
policy::PolicyMap::Entry entry;
entry.set_value(SampleArcPolicyWithIssues());
policy::PolicyMap policies;
policies.Set(policy::key::kArcPolicy, std::move(entry));
// Call the handler to find issues in policy.
const ArcPolicyHandler handler;
handler.PrepareForDisplaying(&policies);
// Verify warnings are found.
EXPECT_FALSE(policies.Get(policy::key::kArcPolicy)
->HasMessage(policy::PolicyMap::MessageType::kInfo));
EXPECT_FALSE(policies.Get(policy::key::kArcPolicy)
->HasMessage(policy::PolicyMap::MessageType::kError));
ASSERT_TRUE(policies.Get(policy::key::kArcPolicy)
->HasMessage(policy::PolicyMap::MessageType::kWarning));
// Verify the warning messages contains the expected package name.
const std::u16string messages =
policies.Get(policy::key::kArcPolicy)
->GetLocalizedMessages(policy::PolicyMap::MessageType::kWarning,
base::BindRepeating(&FakeL10nLookup));
EXPECT_NE(base::UTF16ToUTF8(messages).find(kPackageName2), std::string::npos);
}
} // namespace arc