Index: chrome/browser/policy/cloud/cloud_policy_refresh_scheduler_unittest.cc |
diff --git a/chrome/browser/policy/cloud/cloud_policy_refresh_scheduler_unittest.cc b/chrome/browser/policy/cloud/cloud_policy_refresh_scheduler_unittest.cc |
deleted file mode 100644 |
index 85a256dce2e4c18a513ea98a9b803f37da301f62..0000000000000000000000000000000000000000 |
--- a/chrome/browser/policy/cloud/cloud_policy_refresh_scheduler_unittest.cc |
+++ /dev/null |
@@ -1,493 +0,0 @@ |
-// Copyright (c) 2012 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 "base/callback.h" |
-#include "base/compiler_specific.h" |
-#include "base/memory/ref_counted.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/test/test_simple_task_runner.h" |
-#include "chrome/browser/policy/cloud/cloud_policy_constants.h" |
-#include "chrome/browser/policy/cloud/cloud_policy_refresh_scheduler.h" |
-#include "chrome/browser/policy/cloud/mock_cloud_policy_client.h" |
-#include "chrome/browser/policy/cloud/mock_cloud_policy_store.h" |
-#include "policy/policy_constants.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace em = enterprise_management; |
- |
-using testing::Mock; |
- |
-namespace policy { |
- |
-namespace { |
- |
-const int64 kPolicyRefreshRate = 4 * 60 * 60 * 1000; |
- |
-const int64 kInitialCacheAgeMinutes = 1; |
- |
-} // namespace |
- |
-class CloudPolicyRefreshSchedulerTest : public testing::Test { |
- protected: |
- CloudPolicyRefreshSchedulerTest() |
- : task_runner_(new base::TestSimpleTaskRunner()), |
- network_change_notifier_(net::NetworkChangeNotifier::CreateMock()) {} |
- |
- virtual void SetUp() OVERRIDE { |
- client_.SetDMToken("token"); |
- |
- // Set up the protobuf timestamp to be one minute in the past. Since the |
- // protobuf field only has millisecond precision, we convert the actual |
- // value back to get a millisecond-clamped time stamp for the checks below. |
- store_.policy_.reset(new em::PolicyData()); |
- base::Time now = base::Time::NowFromSystemTime(); |
- base::TimeDelta initial_age = |
- base::TimeDelta::FromMinutes(kInitialCacheAgeMinutes); |
- store_.policy_->set_timestamp( |
- ((now - initial_age) - base::Time::UnixEpoch()).InMilliseconds()); |
- last_update_ = |
- base::Time::UnixEpoch() + |
- base::TimeDelta::FromMilliseconds(store_.policy_->timestamp()); |
- } |
- |
- CloudPolicyRefreshScheduler* CreateRefreshScheduler() { |
- EXPECT_EQ(0u, task_runner_->GetPendingTasks().size()); |
- CloudPolicyRefreshScheduler* scheduler = |
- new CloudPolicyRefreshScheduler(&client_, &store_, task_runner_); |
- scheduler->SetRefreshDelay(kPolicyRefreshRate); |
- // If the store has policy, run the wait-for-invalidations timeout task. |
- if (store_.has_policy()) { |
- EXPECT_EQ(1u, task_runner_->GetPendingTasks().size()); |
- task_runner_->RunPendingTasks(); |
- } |
- return scheduler; |
- } |
- |
- void NotifyIPAddressChanged() { |
- net::NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
- loop_.RunUntilIdle(); |
- } |
- |
- base::TimeDelta GetLastDelay() const { |
- const std::deque<base::TestPendingTask>& pending_tasks = |
- task_runner_->GetPendingTasks(); |
- return |
- pending_tasks.empty() ? base::TimeDelta() : pending_tasks.back().delay; |
- } |
- |
- void CheckTiming(int64 expected_delay_ms) const { |
- CheckTimingWithAge(base::TimeDelta::FromMilliseconds(expected_delay_ms), |
- base::TimeDelta()); |
- } |
- |
- // Checks that the latest refresh scheduled used an offset of |
- // |offset_from_last_refresh| from the time of the previous refresh. |
- // |cache_age| is how old the cache was when the refresh was issued. |
- void CheckTimingWithAge(const base::TimeDelta& offset_from_last_refresh, |
- const base::TimeDelta& cache_age) const { |
- EXPECT_FALSE(task_runner_->GetPendingTasks().empty()); |
- base::Time now(base::Time::NowFromSystemTime()); |
- // |last_update_| was updated and then a refresh was scheduled at time S, |
- // so |last_update_| is a bit before that. |
- // Now is a bit later, N. |
- // GetLastDelay() + S is the time when the refresh will run, T. |
- // |cache_age| is the age of the cache at time S. It was thus created at |
- // S - cache_age. |
- // |
- // Schematically: |
- // |
- // . S . N . . . . . . . T . . . . |
- // | | | |
- // set "last_refresh_" and then scheduled the next refresh; the cache |
- // was "cache_age" old at this point. |
- // | | |
- // some time elapsed on the test execution since then; |
- // this is the current time, "now" |
- // | |
- // the refresh will execute at this time |
- // |
- // So the exact delay is T - S - |cache_age|, but we don't have S here. |
- // |
- // |last_update_| was a bit before S, so if |
- // elapsed = now - |last_update_| then the delay is more than |
- // |offset_from_last_refresh| - elapsed. |
- // |
- // The delay is also less than offset_from_last_refresh, because some time |
- // already elapsed. Additionally, if the cache was already considered old |
- // when the schedule was performed then its age at that time has been |
- // discounted from the delay. So the delay is a bit less than |
- // |offset_from_last_refresh - cache_age|. |
- EXPECT_GE(GetLastDelay(), offset_from_last_refresh - (now - last_update_)); |
- EXPECT_LE(GetLastDelay(), offset_from_last_refresh - cache_age); |
- } |
- |
- void CheckInitialRefresh(bool with_invalidations) const { |
-#if defined(OS_ANDROID) |
- // Android takes the cache age into account for the initial fetch. |
- // Usually the cache age is ignored for the initial refresh, but Android |
- // uses it to restrain from refreshing on every startup. |
- base::TimeDelta rate = base::TimeDelta::FromMilliseconds( |
- with_invalidations |
- ? CloudPolicyRefreshScheduler::kWithInvalidationsRefreshDelayMs |
- : kPolicyRefreshRate); |
- CheckTimingWithAge(rate, |
- base::TimeDelta::FromMinutes(kInitialCacheAgeMinutes)); |
-#else |
- // Other platforms refresh immediately. |
- EXPECT_EQ(base::TimeDelta(), GetLastDelay()); |
-#endif |
- } |
- |
- base::MessageLoop loop_; |
- MockCloudPolicyClient client_; |
- MockCloudPolicyStore store_; |
- scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
- scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_; |
- |
- // Base time for the refresh that the scheduler should be using. |
- base::Time last_update_; |
-}; |
- |
-TEST_F(CloudPolicyRefreshSchedulerTest, InitialRefreshNoPolicy) { |
- store_.policy_.reset(); |
- scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler()); |
- EXPECT_FALSE(task_runner_->GetPendingTasks().empty()); |
- EXPECT_EQ(GetLastDelay(), base::TimeDelta()); |
- EXPECT_CALL(client_, FetchPolicy()).Times(1); |
- task_runner_->RunUntilIdle(); |
-} |
- |
-TEST_F(CloudPolicyRefreshSchedulerTest, InitialRefreshUnmanaged) { |
- store_.policy_->set_state(em::PolicyData::UNMANAGED); |
- scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler()); |
- CheckTiming(CloudPolicyRefreshScheduler::kUnmanagedRefreshDelayMs); |
- EXPECT_CALL(client_, FetchPolicy()).Times(1); |
- task_runner_->RunUntilIdle(); |
-} |
- |
-TEST_F(CloudPolicyRefreshSchedulerTest, InitialRefreshManagedNotYetFetched) { |
- scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler()); |
- EXPECT_FALSE(task_runner_->GetPendingTasks().empty()); |
- CheckInitialRefresh(false); |
- EXPECT_CALL(client_, FetchPolicy()).Times(1); |
- task_runner_->RunUntilIdle(); |
-} |
- |
-TEST_F(CloudPolicyRefreshSchedulerTest, InitialRefreshManagedAlreadyFetched) { |
- last_update_ = base::Time::NowFromSystemTime(); |
- client_.SetPolicy(PolicyNamespaceKey(dm_protocol::kChromeUserPolicyType, |
- std::string()), |
- em::PolicyFetchResponse()); |
- scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler()); |
- CheckTiming(kPolicyRefreshRate); |
- EXPECT_CALL(client_, FetchPolicy()).Times(1); |
- task_runner_->RunUntilIdle(); |
-} |
- |
-TEST_F(CloudPolicyRefreshSchedulerTest, Unregistered) { |
- client_.SetDMToken(std::string()); |
- scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler()); |
- client_.NotifyPolicyFetched(); |
- client_.NotifyRegistrationStateChanged(); |
- client_.NotifyClientError(); |
- scheduler->SetRefreshDelay(12 * 60 * 60 * 1000); |
- store_.NotifyStoreLoaded(); |
- store_.NotifyStoreError(); |
- EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); |
-} |
- |
-TEST_F(CloudPolicyRefreshSchedulerTest, RefreshSoonRateLimit) { |
- scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler()); |
- // Max out the request rate. |
- for (int i = 0; i < 5; ++i) { |
- EXPECT_CALL(client_, FetchPolicy()).Times(1); |
- scheduler->RefreshSoon(); |
- task_runner_->RunUntilIdle(); |
- Mock::VerifyAndClearExpectations(&client_); |
- } |
- // The next refresh is throttled. |
- EXPECT_CALL(client_, FetchPolicy()).Times(0); |
- scheduler->RefreshSoon(); |
- task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&client_); |
-} |
- |
-TEST_F(CloudPolicyRefreshSchedulerTest, InvalidationsAvailable) { |
- scoped_ptr<CloudPolicyRefreshScheduler> scheduler( |
- new CloudPolicyRefreshScheduler(&client_, &store_, task_runner_)); |
- scheduler->SetRefreshDelay(kPolicyRefreshRate); |
- |
- // The scheduler is currently waiting for the invalidations service to |
- // initialize. |
- EXPECT_EQ(1u, task_runner_->GetPendingTasks().size()); |
- |
- // Signal that invalidations are available. The scheduler is currently |
- // waiting for any pending invalidations to be received. |
- scheduler->SetInvalidationServiceAvailability(true); |
- EXPECT_EQ(2u, task_runner_->GetPendingTasks().size()); |
- |
- // Run the invalidation service timeout task. |
- EXPECT_CALL(client_, FetchPolicy()).Times(0); |
- task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&client_); |
- |
- // The initial refresh is scheduled. |
- EXPECT_EQ(1u, task_runner_->GetPendingTasks().size()); |
- CheckInitialRefresh(true); |
- |
- EXPECT_CALL(client_, FetchPolicy()).Times(1); |
- task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&client_); |
- |
- // Complete that fetch. |
- last_update_ = base::Time::NowFromSystemTime(); |
- client_.NotifyPolicyFetched(); |
- |
- // The next refresh has been scheduled using a lower refresh rate. |
- EXPECT_EQ(1u, task_runner_->GetPendingTasks().size()); |
- CheckTiming(CloudPolicyRefreshScheduler::kWithInvalidationsRefreshDelayMs); |
-} |
- |
-TEST_F(CloudPolicyRefreshSchedulerTest, InvalidationsNotAvailable) { |
- scoped_ptr<CloudPolicyRefreshScheduler> scheduler( |
- new CloudPolicyRefreshScheduler(&client_, &store_, task_runner_)); |
- scheduler->SetRefreshDelay(kPolicyRefreshRate); |
- |
- // The scheduler is currently waiting for the invalidations service to |
- // initialize. |
- EXPECT_EQ(1u, task_runner_->GetPendingTasks().size()); |
- |
- // Signal that invalidations are not available. The scheduler will keep |
- // waiting for us. |
- for (int i = 0; i < 10; ++i) { |
- scheduler->SetInvalidationServiceAvailability(false); |
- EXPECT_EQ(1u, task_runner_->GetPendingTasks().size()); |
- } |
- |
- // Run the timeout task. |
- EXPECT_CALL(client_, FetchPolicy()).Times(0); |
- task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&client_); |
- |
- // This scheduled the initial refresh. |
- CheckInitialRefresh(false); |
- |
- // Perform that fetch now. |
- EXPECT_CALL(client_, FetchPolicy()).Times(1); |
- task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&client_); |
- |
- // Complete that fetch. |
- last_update_ = base::Time::NowFromSystemTime(); |
- client_.NotifyPolicyFetched(); |
- |
- // The next refresh has been scheduled at the normal rate. |
- EXPECT_EQ(1u, task_runner_->GetPendingTasks().size()); |
- CheckTiming(kPolicyRefreshRate); |
-} |
- |
-TEST_F(CloudPolicyRefreshSchedulerTest, InvalidationsOffAndOn) { |
- scoped_ptr<CloudPolicyRefreshScheduler> scheduler( |
- new CloudPolicyRefreshScheduler(&client_, &store_, task_runner_)); |
- scheduler->SetRefreshDelay(kPolicyRefreshRate); |
- scheduler->SetInvalidationServiceAvailability(true); |
- // Initial fetch. |
- EXPECT_CALL(client_, FetchPolicy()).Times(1); |
- task_runner_->RunUntilIdle(); |
- Mock::VerifyAndClearExpectations(&client_); |
- last_update_ = base::Time::NowFromSystemTime(); |
- client_.NotifyPolicyFetched(); |
- |
- // The next refresh has been scheduled using a lower refresh rate. |
- // Flush that task. |
- CheckTiming(CloudPolicyRefreshScheduler::kWithInvalidationsRefreshDelayMs); |
- EXPECT_CALL(client_, FetchPolicy()).Times(1); |
- task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&client_); |
- |
- // If the service goes down and comes back up before the timeout then a |
- // refresh is rescheduled at the lower rate again; after executing all |
- // pending tasks only 1 fetch is performed. |
- EXPECT_CALL(client_, FetchPolicy()).Times(0); |
- scheduler->SetInvalidationServiceAvailability(false); |
- scheduler->SetInvalidationServiceAvailability(true); |
- // Run the invalidation service timeout task. |
- task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&client_); |
- // The next refresh has been scheduled using a lower refresh rate. |
- EXPECT_CALL(client_, FetchPolicy()).Times(1); |
- CheckTiming(CloudPolicyRefreshScheduler::kWithInvalidationsRefreshDelayMs); |
- task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&client_); |
-} |
- |
-TEST_F(CloudPolicyRefreshSchedulerTest, InvalidationsDisconnected) { |
- scoped_ptr<CloudPolicyRefreshScheduler> scheduler( |
- new CloudPolicyRefreshScheduler(&client_, &store_, task_runner_)); |
- scheduler->SetRefreshDelay(kPolicyRefreshRate); |
- scheduler->SetInvalidationServiceAvailability(true); |
- // Initial fetch. |
- EXPECT_CALL(client_, FetchPolicy()).Times(1); |
- task_runner_->RunUntilIdle(); |
- Mock::VerifyAndClearExpectations(&client_); |
- last_update_ = base::Time::NowFromSystemTime(); |
- client_.NotifyPolicyFetched(); |
- |
- // The next refresh has been scheduled using a lower refresh rate. |
- // Flush that task. |
- CheckTiming(CloudPolicyRefreshScheduler::kWithInvalidationsRefreshDelayMs); |
- EXPECT_CALL(client_, FetchPolicy()).Times(1); |
- task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&client_); |
- |
- // If the service goes down then the refresh scheduler falls back on the |
- // default polling rate after a timeout. |
- EXPECT_CALL(client_, FetchPolicy()).Times(0); |
- scheduler->SetInvalidationServiceAvailability(false); |
- task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&client_); |
- // The next refresh has been scheduled at the normal rate. |
- CheckTiming(kPolicyRefreshRate); |
-} |
- |
-class CloudPolicyRefreshSchedulerSteadyStateTest |
- : public CloudPolicyRefreshSchedulerTest { |
- protected: |
- CloudPolicyRefreshSchedulerSteadyStateTest() {} |
- |
- virtual void SetUp() OVERRIDE { |
- refresh_scheduler_.reset(CreateRefreshScheduler()); |
- refresh_scheduler_->SetRefreshDelay(kPolicyRefreshRate); |
- CloudPolicyRefreshSchedulerTest::SetUp(); |
- last_update_ = base::Time::NowFromSystemTime(); |
- client_.NotifyPolicyFetched(); |
- CheckTiming(kPolicyRefreshRate); |
- } |
- |
- scoped_ptr<CloudPolicyRefreshScheduler> refresh_scheduler_; |
-}; |
- |
-TEST_F(CloudPolicyRefreshSchedulerSteadyStateTest, OnPolicyFetched) { |
- client_.NotifyPolicyFetched(); |
- CheckTiming(kPolicyRefreshRate); |
-} |
- |
-TEST_F(CloudPolicyRefreshSchedulerSteadyStateTest, OnRegistrationStateChanged) { |
- client_.SetDMToken("new_token"); |
- client_.NotifyRegistrationStateChanged(); |
- EXPECT_EQ(GetLastDelay(), base::TimeDelta()); |
- |
- task_runner_->ClearPendingTasks(); |
- client_.SetDMToken(std::string()); |
- client_.NotifyRegistrationStateChanged(); |
- EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); |
-} |
- |
-TEST_F(CloudPolicyRefreshSchedulerSteadyStateTest, OnStoreLoaded) { |
- store_.NotifyStoreLoaded(); |
- CheckTiming(kPolicyRefreshRate); |
-} |
- |
-TEST_F(CloudPolicyRefreshSchedulerSteadyStateTest, OnStoreError) { |
- task_runner_->ClearPendingTasks(); |
- store_.NotifyStoreError(); |
- EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); |
-} |
- |
-TEST_F(CloudPolicyRefreshSchedulerSteadyStateTest, RefreshDelayChange) { |
- const int delay_short_ms = 5 * 60 * 1000; |
- refresh_scheduler_->SetRefreshDelay(delay_short_ms); |
- CheckTiming(CloudPolicyRefreshScheduler::kRefreshDelayMinMs); |
- |
- const int delay_ms = 12 * 60 * 60 * 1000; |
- refresh_scheduler_->SetRefreshDelay(delay_ms); |
- CheckTiming(delay_ms); |
- |
- const int delay_long_ms = 20 * 24 * 60 * 60 * 1000; |
- refresh_scheduler_->SetRefreshDelay(delay_long_ms); |
- CheckTiming(CloudPolicyRefreshScheduler::kRefreshDelayMaxMs); |
-} |
- |
-TEST_F(CloudPolicyRefreshSchedulerSteadyStateTest, OnIPAddressChanged) { |
- NotifyIPAddressChanged(); |
- CheckTiming(kPolicyRefreshRate); |
- |
- client_.SetStatus(DM_STATUS_REQUEST_FAILED); |
- NotifyIPAddressChanged(); |
- EXPECT_EQ(GetLastDelay(), base::TimeDelta()); |
-} |
- |
-struct ClientErrorTestParam { |
- DeviceManagementStatus client_error; |
- int64 expected_delay_ms; |
- int backoff_factor; |
-}; |
- |
-static const ClientErrorTestParam kClientErrorTestCases[] = { |
- { DM_STATUS_REQUEST_INVALID, |
- CloudPolicyRefreshScheduler::kUnmanagedRefreshDelayMs, 1 }, |
- { DM_STATUS_REQUEST_FAILED, |
- CloudPolicyRefreshScheduler::kInitialErrorRetryDelayMs, 2 }, |
- { DM_STATUS_TEMPORARY_UNAVAILABLE, |
- CloudPolicyRefreshScheduler::kInitialErrorRetryDelayMs, 2 }, |
- { DM_STATUS_HTTP_STATUS_ERROR, |
- CloudPolicyRefreshScheduler::kUnmanagedRefreshDelayMs, 1 }, |
- { DM_STATUS_RESPONSE_DECODING_ERROR, |
- CloudPolicyRefreshScheduler::kUnmanagedRefreshDelayMs, 1 }, |
- { DM_STATUS_SERVICE_MANAGEMENT_NOT_SUPPORTED, |
- CloudPolicyRefreshScheduler::kUnmanagedRefreshDelayMs, 1 }, |
- { DM_STATUS_SERVICE_DEVICE_NOT_FOUND, |
- -1, 1 }, |
- { DM_STATUS_SERVICE_MANAGEMENT_TOKEN_INVALID, |
- -1, 1 }, |
- { DM_STATUS_SERVICE_ACTIVATION_PENDING, |
- kPolicyRefreshRate, 1 }, |
- { DM_STATUS_SERVICE_INVALID_SERIAL_NUMBER, |
- -1, 1 }, |
- { DM_STATUS_SERVICE_MISSING_LICENSES, |
- -1, 1 }, |
- { DM_STATUS_SERVICE_DEVICE_ID_CONFLICT, |
- -1, 1 }, |
- { DM_STATUS_SERVICE_POLICY_NOT_FOUND, |
- kPolicyRefreshRate, 1 }, |
-}; |
- |
-class CloudPolicyRefreshSchedulerClientErrorTest |
- : public CloudPolicyRefreshSchedulerSteadyStateTest, |
- public testing::WithParamInterface<ClientErrorTestParam> { |
-}; |
- |
-TEST_P(CloudPolicyRefreshSchedulerClientErrorTest, OnClientError) { |
- client_.SetStatus(GetParam().client_error); |
- task_runner_->ClearPendingTasks(); |
- |
- // See whether the error triggers the right refresh delay. |
- int64 expected_delay_ms = GetParam().expected_delay_ms; |
- client_.NotifyClientError(); |
- if (expected_delay_ms >= 0) { |
- CheckTiming(expected_delay_ms); |
- |
- // Check whether exponential backoff is working as expected and capped at |
- // the regular refresh rate (if applicable). |
- do { |
- expected_delay_ms *= GetParam().backoff_factor; |
- last_update_ = base::Time::NowFromSystemTime(); |
- client_.NotifyClientError(); |
- CheckTiming(std::max(std::min(expected_delay_ms, kPolicyRefreshRate), |
- GetParam().expected_delay_ms)); |
- } while (GetParam().backoff_factor > 1 && |
- expected_delay_ms <= kPolicyRefreshRate); |
- } else { |
- EXPECT_EQ(base::TimeDelta(), GetLastDelay()); |
- EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); |
- } |
-} |
- |
-INSTANTIATE_TEST_CASE_P(CloudPolicyRefreshSchedulerClientErrorTest, |
- CloudPolicyRefreshSchedulerClientErrorTest, |
- testing::ValuesIn(kClientErrorTestCases)); |
- |
-} // namespace policy |