Home | History | Annotate | Download | only in policy
      1 // Copyright 2014 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 "chrome/browser/chromeos/policy/server_backed_state_keys_broker.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/bind_helpers.h"
      9 #include "base/macros.h"
     10 #include "base/message_loop/message_loop.h"
     11 #include "base/run_loop.h"
     12 #include "base/test/test_simple_task_runner.h"
     13 #include "chromeos/dbus/fake_session_manager_client.h"
     14 #include "testing/gtest/include/gtest/gtest.h"
     15 
     16 namespace policy {
     17 
     18 class ServerBackedStateKeysBrokerTest : public testing::Test {
     19  public:
     20   ServerBackedStateKeysBrokerTest()
     21       : task_runner_(new base::TestSimpleTaskRunner()),
     22         broker_(&fake_session_manager_client_, task_runner_),
     23         first_boot_(false),
     24         updated_(false),
     25         callback_invoked_(false) {
     26     state_keys_.push_back("1");
     27     state_keys_.push_back("2");
     28     state_keys_.push_back("3");
     29     fake_session_manager_client_.set_server_backed_state_keys(state_keys_);
     30   }
     31   virtual ~ServerBackedStateKeysBrokerTest() {}
     32 
     33   void StateKeysUpdated() {
     34     updated_ = true;
     35   }
     36 
     37   void ExpectGood() {
     38     EXPECT_FALSE(broker_.pending());
     39     EXPECT_TRUE(broker_.available());
     40     EXPECT_EQ(state_keys_, broker_.state_keys());
     41     EXPECT_EQ(state_keys_.front(), broker_.current_state_key());
     42   }
     43 
     44   void HandleStateKeysCallback(const std::vector<std::string>& state_keys,
     45                                bool first_boot) {
     46     callback_invoked_ = true;
     47     callback_state_keys_ = state_keys;
     48     first_boot_ = first_boot;
     49   }
     50 
     51  protected:
     52   base::MessageLoop loop_;
     53   scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
     54   chromeos::FakeSessionManagerClient fake_session_manager_client_;
     55   ServerBackedStateKeysBroker broker_;
     56   std::vector<std::string> state_keys_;
     57   bool first_boot_;
     58   bool updated_;
     59   std::vector<std::string> callback_state_keys_;
     60   bool callback_invoked_;
     61 
     62  private:
     63   DISALLOW_COPY_AND_ASSIGN(ServerBackedStateKeysBrokerTest);
     64 };
     65 
     66 TEST_F(ServerBackedStateKeysBrokerTest, Load) {
     67   EXPECT_TRUE(broker_.pending());
     68   EXPECT_FALSE(broker_.available());
     69   EXPECT_TRUE(broker_.state_keys().empty());
     70   EXPECT_TRUE(broker_.current_state_key().empty());
     71 
     72   ServerBackedStateKeysBroker::Subscription subscription =
     73       broker_.RegisterUpdateCallback(
     74           base::Bind(&ServerBackedStateKeysBrokerTest::StateKeysUpdated,
     75                      base::Unretained(this)));
     76   base::RunLoop().RunUntilIdle();
     77   EXPECT_TRUE(updated_);
     78   ExpectGood();
     79 }
     80 
     81 TEST_F(ServerBackedStateKeysBrokerTest, Retry) {
     82   fake_session_manager_client_.set_server_backed_state_keys(
     83       std::vector<std::string>());
     84 
     85   ServerBackedStateKeysBroker::Subscription subscription =
     86       broker_.RegisterUpdateCallback(
     87           base::Bind(&ServerBackedStateKeysBrokerTest::StateKeysUpdated,
     88                      base::Unretained(this)));
     89   base::RunLoop().RunUntilIdle();
     90   EXPECT_TRUE(updated_);
     91 
     92   EXPECT_FALSE(broker_.pending());
     93   EXPECT_FALSE(broker_.available());
     94   EXPECT_TRUE(broker_.state_keys().empty());
     95   EXPECT_TRUE(broker_.current_state_key().empty());
     96 
     97   fake_session_manager_client_.set_server_backed_state_keys(state_keys_);
     98   updated_ = false;
     99   ServerBackedStateKeysBroker::Subscription subscription2 =
    100       broker_.RegisterUpdateCallback(base::Bind(&base::DoNothing));
    101   base::RunLoop().RunUntilIdle();
    102   EXPECT_TRUE(updated_);
    103   ExpectGood();
    104 }
    105 
    106 TEST_F(ServerBackedStateKeysBrokerTest, Refresh) {
    107   ServerBackedStateKeysBroker::Subscription subscription =
    108       broker_.RegisterUpdateCallback(
    109           base::Bind(&ServerBackedStateKeysBrokerTest::StateKeysUpdated,
    110                      base::Unretained(this)));
    111   base::RunLoop().RunUntilIdle();
    112   EXPECT_TRUE(updated_);
    113   ExpectGood();
    114 
    115   // Update callbacks get fired if the keys change.
    116   state_keys_.erase(state_keys_.begin());
    117   state_keys_.push_back("4");
    118   fake_session_manager_client_.set_server_backed_state_keys(state_keys_);
    119   updated_ = false;
    120   task_runner_->RunPendingTasks();
    121   base::RunLoop().RunUntilIdle();
    122   EXPECT_TRUE(updated_);
    123   ExpectGood();
    124 
    125   // No update callback if the keys are unchanged.
    126   updated_ = false;
    127   task_runner_->RunPendingTasks();
    128   base::RunLoop().RunUntilIdle();
    129   EXPECT_FALSE(updated_);
    130   ExpectGood();
    131 }
    132 
    133 TEST_F(ServerBackedStateKeysBrokerTest, Request) {
    134   broker_.RequestStateKeys(
    135       base::Bind(&ServerBackedStateKeysBrokerTest::HandleStateKeysCallback,
    136                  base::Unretained(this)));
    137   base::RunLoop().RunUntilIdle();
    138   ExpectGood();
    139   EXPECT_TRUE(callback_invoked_);
    140   EXPECT_FALSE(first_boot_);
    141   EXPECT_EQ(state_keys_, callback_state_keys_);
    142 }
    143 
    144 TEST_F(ServerBackedStateKeysBrokerTest, RequestFailure) {
    145   fake_session_manager_client_.set_server_backed_state_keys(
    146       std::vector<std::string>());
    147 
    148   broker_.RequestStateKeys(
    149       base::Bind(&ServerBackedStateKeysBrokerTest::HandleStateKeysCallback,
    150                  base::Unretained(this)));
    151   base::RunLoop().RunUntilIdle();
    152   EXPECT_TRUE(callback_invoked_);
    153   EXPECT_TRUE(callback_state_keys_.empty());
    154 }
    155 
    156 }  // namespace policy
    157