| OLD | NEW |
| (Empty) |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include <memory> | |
| 6 #include <string> | |
| 7 | |
| 8 #include "base/macros.h" | |
| 9 #include "base/memory/ptr_util.h" | |
| 10 #include "base/message_loop/message_loop.h" | |
| 11 #include "base/values.h" | |
| 12 #include "chrome/browser/chromeos/arc/arc_policy_bridge.h" | |
| 13 #include "components/arc/test/fake_arc_bridge_service.h" | |
| 14 #include "components/arc/test/fake_policy_instance.h" | |
| 15 #include "components/policy/core/common/mock_policy_service.h" | |
| 16 #include "components/policy/core/common/policy_map.h" | |
| 17 #include "components/policy/core/common/policy_namespace.h" | |
| 18 #include "components/policy/core/common/policy_types.h" | |
| 19 #include "components/policy/policy_constants.h" | |
| 20 #include "mojo/public/cpp/bindings/string.h" | |
| 21 #include "testing/gmock/include/gmock/gmock.h" | |
| 22 #include "testing/gtest/include/gtest/gtest.h" | |
| 23 | |
| 24 namespace { | |
| 25 | |
| 26 char kFakeONC[] = | |
| 27 "{\"NetworkConfigurations\":[" | |
| 28 "{\"GUID\":\"{485d6076-dd44-6b6d-69787465725f5040}\"," | |
| 29 "\"Type\":\"WiFi\"," | |
| 30 "\"Name\":\"My WiFi Network\"," | |
| 31 "\"WiFi\":{" | |
| 32 "\"HexSSID\":\"737369642D6E6F6E65\"," // "ssid-none" | |
| 33 "\"Security\":\"None\"}" | |
| 34 "}" | |
| 35 "]," | |
| 36 "\"GlobalNetworkConfiguration\":{" | |
| 37 "\"AllowOnlyPolicyNetworksToAutoconnect\":true," | |
| 38 "}," | |
| 39 "\"Certificates\":[" | |
| 40 "{ \"GUID\":\"{f998f760-272b-6939-4c2beffe428697ac}\"," | |
| 41 "\"PKCS12\":\"abc\"," | |
| 42 "\"Type\":\"Client\"}," | |
| 43 "{\"Type\":\"Authority\"," | |
| 44 "\"TrustBits\":[\"Web\"]," | |
| 45 "\"X509\":\"TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ" | |
| 46 "1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpc" | |
| 47 "yBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCB" | |
| 48 "pbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZ" | |
| 49 "GdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4" | |
| 50 "=\"," | |
| 51 "\"GUID\":\"{00f79111-51e0-e6e0-76b3b55450d80a1b}\"}" | |
| 52 "]}"; | |
| 53 | |
| 54 // Helper class to define a PolicyStringCallback which verifies that it was run. | |
| 55 // Wraps a bool initially set to |false| and verifies that it's been set to | |
| 56 // |true| before destruction. | |
| 57 class CheckedBoolean { | |
| 58 public: | |
| 59 CheckedBoolean() {} | |
| 60 ~CheckedBoolean() { EXPECT_TRUE(value_); } | |
| 61 | |
| 62 void set_value(bool value) { value_ = value; } | |
| 63 | |
| 64 private: | |
| 65 bool value_ = false; | |
| 66 | |
| 67 DISALLOW_COPY_AND_ASSIGN(CheckedBoolean); | |
| 68 }; | |
| 69 | |
| 70 void ExpectPolicyString(std::unique_ptr<CheckedBoolean> was_run, | |
| 71 mojo::String expected, | |
| 72 mojo::String policies) { | |
| 73 EXPECT_EQ(expected, policies); | |
| 74 was_run->set_value(true); | |
| 75 } | |
| 76 | |
| 77 arc::ArcPolicyBridge::GetPoliciesCallback PolicyStringCallback( | |
| 78 mojo::String expected) { | |
| 79 std::unique_ptr<CheckedBoolean> was_run(new CheckedBoolean); | |
| 80 return base::Bind(&ExpectPolicyString, base::Passed(&was_run), | |
| 81 base::Passed(&expected)); | |
| 82 } | |
| 83 | |
| 84 } // namespace | |
| 85 | |
| 86 using testing::_; | |
| 87 using testing::ReturnRef; | |
| 88 | |
| 89 namespace arc { | |
| 90 | |
| 91 class ArcPolicyBridgeTest : public testing::Test { | |
| 92 public: | |
| 93 ArcPolicyBridgeTest() {} | |
| 94 | |
| 95 void SetUp() override { | |
| 96 bridge_service_.reset(new FakeArcBridgeService()); | |
| 97 policy_bridge_.reset( | |
| 98 new ArcPolicyBridge(bridge_service_.get(), &policy_service_)); | |
| 99 policy_bridge_->OverrideIsManagedForTesting(true); | |
| 100 | |
| 101 EXPECT_CALL(policy_service_, | |
| 102 GetPolicies(policy::PolicyNamespace( | |
| 103 policy::POLICY_DOMAIN_CHROME, std::string()))) | |
| 104 .WillRepeatedly(ReturnRef(policy_map_)); | |
| 105 EXPECT_CALL(policy_service_, AddObserver(policy::POLICY_DOMAIN_CHROME, _)) | |
| 106 .Times(1); | |
| 107 | |
| 108 policy_instance_.reset(new FakePolicyInstance); | |
| 109 bridge_service_->policy()->SetInstance(policy_instance_.get()); | |
| 110 } | |
| 111 | |
| 112 protected: | |
| 113 ArcPolicyBridge* policy_bridge() { return policy_bridge_.get(); } | |
| 114 FakePolicyInstance* policy_instance() { return policy_instance_.get(); } | |
| 115 policy::PolicyMap& policy_map() { return policy_map_; } | |
| 116 | |
| 117 private: | |
| 118 // Not an unused variable. Unit tests do not have a message loop by themselves | |
| 119 // and mojo needs a message loop for communication. | |
| 120 base::MessageLoop loop_; | |
| 121 std::unique_ptr<FakeArcBridgeService> bridge_service_; | |
| 122 std::unique_ptr<ArcPolicyBridge> policy_bridge_; | |
| 123 // Always keep policy_instance_ below bridge_service_, so that | |
| 124 // policy_instance_ is destructed first. It needs to remove itself as | |
| 125 // observer. | |
| 126 std::unique_ptr<FakePolicyInstance> policy_instance_; | |
| 127 policy::PolicyMap policy_map_; | |
| 128 policy::MockPolicyService policy_service_; | |
| 129 | |
| 130 DISALLOW_COPY_AND_ASSIGN(ArcPolicyBridgeTest); | |
| 131 }; | |
| 132 | |
| 133 TEST_F(ArcPolicyBridgeTest, UnmanagedTest) { | |
| 134 policy_bridge()->OverrideIsManagedForTesting(false); | |
| 135 policy_bridge()->GetPolicies(PolicyStringCallback("")); | |
| 136 } | |
| 137 | |
| 138 TEST_F(ArcPolicyBridgeTest, EmptyPolicyTest) { | |
| 139 // No policy is set, result should be empty. | |
| 140 policy_bridge()->GetPolicies(PolicyStringCallback("{}")); | |
| 141 } | |
| 142 | |
| 143 TEST_F(ArcPolicyBridgeTest, ArcPolicyTest) { | |
| 144 policy_map().Set( | |
| 145 policy::key::kArcPolicy, policy::POLICY_LEVEL_MANDATORY, | |
| 146 policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, | |
| 147 base::MakeUnique<base::StringValue>( | |
| 148 "{\"applications\":" | |
| 149 "[{\"packageName\":\"com.google.android.apps.youtube.kids\"," | |
| 150 "\"installType\":\"REQUIRED\"," | |
| 151 "\"lockTaskAllowed\":false," | |
| 152 "\"permissionGrants\":[]" | |
| 153 "}]," | |
| 154 "\"defaultPermissionPolicy\":\"GRANT\"" | |
| 155 "}"), | |
| 156 nullptr); | |
| 157 policy_bridge()->GetPolicies(PolicyStringCallback( | |
| 158 "{\"applications\":" | |
| 159 "[{\"installType\":\"REQUIRED\"," | |
| 160 "\"lockTaskAllowed\":false," | |
| 161 "\"packageName\":\"com.google.android.apps.youtube.kids\"," | |
| 162 "\"permissionGrants\":[]" | |
| 163 "}]," | |
| 164 "\"defaultPermissionPolicy\":\"GRANT\"" | |
| 165 "}")); | |
| 166 } | |
| 167 | |
| 168 TEST_F(ArcPolicyBridgeTest, HompageLocationTest) { | |
| 169 // This policy will not be passed on, result should be empty. | |
| 170 policy_map().Set( | |
| 171 policy::key::kHomepageLocation, policy::POLICY_LEVEL_MANDATORY, | |
| 172 policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, | |
| 173 base::MakeUnique<base::StringValue>("http://chromium.org"), nullptr); | |
| 174 policy_bridge()->GetPolicies(PolicyStringCallback("{}")); | |
| 175 } | |
| 176 | |
| 177 TEST_F(ArcPolicyBridgeTest, DisableScreenshotsTest) { | |
| 178 policy_map().Set(policy::key::kDisableScreenshots, | |
| 179 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, | |
| 180 policy::POLICY_SOURCE_CLOUD, | |
| 181 base::MakeUnique<base::FundamentalValue>(true), nullptr); | |
| 182 policy_bridge()->GetPolicies( | |
| 183 PolicyStringCallback("{\"screenCaptureDisabled\":true}")); | |
| 184 } | |
| 185 | |
| 186 TEST_F(ArcPolicyBridgeTest, VideoCaptureAllowedTest) { | |
| 187 policy_map().Set(policy::key::kVideoCaptureAllowed, | |
| 188 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, | |
| 189 policy::POLICY_SOURCE_CLOUD, | |
| 190 base::MakeUnique<base::FundamentalValue>(false), nullptr); | |
| 191 policy_bridge()->GetPolicies( | |
| 192 PolicyStringCallback("{\"cameraDisabled\":true}")); | |
| 193 } | |
| 194 | |
| 195 TEST_F(ArcPolicyBridgeTest, AudioCaptureAllowedTest) { | |
| 196 policy_map().Set(policy::key::kAudioCaptureAllowed, | |
| 197 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, | |
| 198 policy::POLICY_SOURCE_CLOUD, | |
| 199 base::MakeUnique<base::FundamentalValue>(false), nullptr); | |
| 200 policy_bridge()->GetPolicies( | |
| 201 PolicyStringCallback("{\"unmuteMicrophoneDisabled\":true}")); | |
| 202 } | |
| 203 | |
| 204 TEST_F(ArcPolicyBridgeTest, DefaultGeolocationSettingTest) { | |
| 205 policy_map().Set(policy::key::kDefaultGeolocationSetting, | |
| 206 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, | |
| 207 policy::POLICY_SOURCE_CLOUD, | |
| 208 base::MakeUnique<base::FundamentalValue>(1), nullptr); | |
| 209 policy_bridge()->GetPolicies( | |
| 210 PolicyStringCallback("{\"shareLocationDisabled\":false}")); | |
| 211 policy_map().Set(policy::key::kDefaultGeolocationSetting, | |
| 212 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, | |
| 213 policy::POLICY_SOURCE_CLOUD, | |
| 214 base::MakeUnique<base::FundamentalValue>(2), nullptr); | |
| 215 policy_bridge()->GetPolicies( | |
| 216 PolicyStringCallback("{\"shareLocationDisabled\":true}")); | |
| 217 policy_map().Set(policy::key::kDefaultGeolocationSetting, | |
| 218 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, | |
| 219 policy::POLICY_SOURCE_CLOUD, | |
| 220 base::MakeUnique<base::FundamentalValue>(3), nullptr); | |
| 221 policy_bridge()->GetPolicies( | |
| 222 PolicyStringCallback("{\"shareLocationDisabled\":false}")); | |
| 223 } | |
| 224 | |
| 225 TEST_F(ArcPolicyBridgeTest, ExternalStorageDisabledTest) { | |
| 226 policy_map().Set(policy::key::kExternalStorageDisabled, | |
| 227 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, | |
| 228 policy::POLICY_SOURCE_CLOUD, | |
| 229 base::MakeUnique<base::FundamentalValue>(true), nullptr); | |
| 230 policy_bridge()->GetPolicies( | |
| 231 PolicyStringCallback("{\"mountPhysicalMediaDisabled\":true}")); | |
| 232 } | |
| 233 | |
| 234 TEST_F(ArcPolicyBridgeTest, URLBlacklistTest) { | |
| 235 base::ListValue blacklist; | |
| 236 blacklist.AppendString("www.blacklist1.com"); | |
| 237 blacklist.AppendString("www.blacklist2.com"); | |
| 238 policy_map().Set(policy::key::kURLBlacklist, policy::POLICY_LEVEL_MANDATORY, | |
| 239 policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, | |
| 240 blacklist.CreateDeepCopy(), nullptr); | |
| 241 policy_bridge()->GetPolicies( | |
| 242 PolicyStringCallback("{\"globalAppRestrictions\":" | |
| 243 "{\"com.android.browser:URLBlacklist\":" | |
| 244 "[\"www.blacklist1.com\"," | |
| 245 "\"www.blacklist2.com\"" | |
| 246 "]}}")); | |
| 247 } | |
| 248 | |
| 249 TEST_F(ArcPolicyBridgeTest, URLWhitelistTest) { | |
| 250 base::ListValue whitelist; | |
| 251 whitelist.AppendString("www.whitelist1.com"); | |
| 252 whitelist.AppendString("www.whitelist2.com"); | |
| 253 policy_map().Set(policy::key::kURLWhitelist, policy::POLICY_LEVEL_MANDATORY, | |
| 254 policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, | |
| 255 whitelist.CreateDeepCopy(), nullptr); | |
| 256 policy_bridge()->GetPolicies( | |
| 257 PolicyStringCallback("{\"globalAppRestrictions\":" | |
| 258 "{\"com.android.browser:URLWhitelist\":" | |
| 259 "[\"www.whitelist1.com\"," | |
| 260 "\"www.whitelist2.com\"" | |
| 261 "]}}")); | |
| 262 } | |
| 263 | |
| 264 TEST_F(ArcPolicyBridgeTest, CaCertificateTest) { | |
| 265 // Enable CA certificates sync. | |
| 266 policy_map().Set( | |
| 267 policy::key::kArcCertificatesSyncMode, policy::POLICY_LEVEL_MANDATORY, | |
| 268 policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, | |
| 269 base::MakeUnique<base::FundamentalValue>(ArcCertsSyncMode::COPY_CA_CERTS), | |
| 270 nullptr); | |
| 271 policy_map().Set(policy::key::kOpenNetworkConfiguration, | |
| 272 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, | |
| 273 policy::POLICY_SOURCE_CLOUD, | |
| 274 base::MakeUnique<base::StringValue>(kFakeONC), nullptr); | |
| 275 policy_bridge()->GetPolicies(PolicyStringCallback( | |
| 276 "{\"caCerts\":" | |
| 277 "[{\"X509\":\"TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24" | |
| 278 "sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGl" | |
| 279 "jaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGV" | |
| 280 "saWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Y" | |
| 281 "ga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCB" | |
| 282 "wbGVhc3VyZS4=\"}" | |
| 283 "]}")); | |
| 284 | |
| 285 // Disable CA certificates sync. | |
| 286 policy_map().Set( | |
| 287 policy::key::kArcCertificatesSyncMode, policy::POLICY_LEVEL_MANDATORY, | |
| 288 policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, | |
| 289 base::MakeUnique<base::FundamentalValue>(ArcCertsSyncMode::SYNC_DISABLED), | |
| 290 nullptr); | |
| 291 policy_bridge()->GetPolicies(PolicyStringCallback("{}")); | |
| 292 } | |
| 293 | |
| 294 TEST_F(ArcPolicyBridgeTest, DeveloperToolsDisabledTest) { | |
| 295 policy_map().Set(policy::key::kDeveloperToolsDisabled, | |
| 296 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, | |
| 297 policy::POLICY_SOURCE_CLOUD, | |
| 298 base::MakeUnique<base::FundamentalValue>(true), nullptr); | |
| 299 policy_bridge()->GetPolicies( | |
| 300 PolicyStringCallback("{\"debuggingFeaturesDisabled\":true}")); | |
| 301 } | |
| 302 | |
| 303 TEST_F(ArcPolicyBridgeTest, MultiplePoliciesTest) { | |
| 304 policy_map().Set( | |
| 305 policy::key::kArcPolicy, policy::POLICY_LEVEL_MANDATORY, | |
| 306 policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, | |
| 307 base::MakeUnique<base::StringValue>( | |
| 308 "{\"applications\":" | |
| 309 "[{\"packageName\":\"com.google.android.apps.youtube.kids\"," | |
| 310 "\"installType\":\"REQUIRED\"," | |
| 311 "\"lockTaskAllowed\":false," | |
| 312 "\"permissionGrants\":[]" | |
| 313 "}]," | |
| 314 "\"defaultPermissionPolicy\":\"GRANT\"}"), | |
| 315 nullptr); | |
| 316 policy_map().Set( | |
| 317 policy::key::kHomepageLocation, policy::POLICY_LEVEL_MANDATORY, | |
| 318 policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, | |
| 319 base::MakeUnique<base::StringValue>("http://chromium.org"), nullptr); | |
| 320 policy_map().Set(policy::key::kVideoCaptureAllowed, | |
| 321 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, | |
| 322 policy::POLICY_SOURCE_CLOUD, | |
| 323 base::MakeUnique<base::FundamentalValue>(false), nullptr); | |
| 324 policy_bridge()->GetPolicies(PolicyStringCallback( | |
| 325 "{\"applications\":" | |
| 326 "[{\"installType\":\"REQUIRED\"," | |
| 327 "\"lockTaskAllowed\":false," | |
| 328 "\"packageName\":\"com.google.android.apps.youtube.kids\"," | |
| 329 "\"permissionGrants\":[]" | |
| 330 "}]," | |
| 331 "\"cameraDisabled\":true," | |
| 332 "\"defaultPermissionPolicy\":\"GRANT\"" | |
| 333 "}")); | |
| 334 } | |
| 335 | |
| 336 // This and the following test send the policies through a mojo connection | |
| 337 // between a PolicyInstance and the PolicyBridge. | |
| 338 TEST_F(ArcPolicyBridgeTest, PolicyInstanceUnmanagedTest) { | |
| 339 policy_bridge()->OverrideIsManagedForTesting(false); | |
| 340 policy_instance()->CallGetPolicies(PolicyStringCallback("")); | |
| 341 } | |
| 342 | |
| 343 TEST_F(ArcPolicyBridgeTest, PolicyInstanceManagedTest) { | |
| 344 policy_instance()->CallGetPolicies(PolicyStringCallback("{}")); | |
| 345 } | |
| 346 | |
| 347 } // namespace arc | |
| OLD | NEW |