102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project// Copyright (c) 2012 The Chromium Authors. All rights reserved.
202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project// Use of this source code is governed by a BSD-style license that can be
302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project// found in the LICENSE file.
402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "remoting/protocol/pairing_registry.h"
602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <stdlib.h>
802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <algorithm>
1002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "base/bind.h"
1202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "base/compiler_specific.h"
1302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "base/memory/scoped_ptr.h"
1402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "base/message_loop/message_loop.h"
1502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "base/run_loop.h"
1602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "base/thread_task_runner_handle.h"
1702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "base/values.h"
1802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "remoting/protocol/protocol_mock_objects.h"
1902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "testing/gmock/include/gmock/gmock.h"
2002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "testing/gtest/include/gtest/gtest.h"
2102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
2202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectusing testing::Sequence;
2302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
2402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectnamespace {
2502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
2602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectusing remoting::protocol::PairingRegistry;
2702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
2802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectclass MockPairingRegistryCallbacks {
2902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project public:
3002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  MockPairingRegistryCallbacks() {}
3102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  virtual ~MockPairingRegistryCallbacks() {}
3202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  MOCK_METHOD1(DoneCallback, void(bool));
3402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  MOCK_METHOD1(GetAllPairingsCallbackPtr, void(base::ListValue*));
3502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  MOCK_METHOD1(GetPairingCallback, void(PairingRegistry::Pairing));
3602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  void GetAllPairingsCallback(scoped_ptr<base::ListValue> pairings) {
3802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    GetAllPairingsCallbackPtr(pairings.get());
3902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
4002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
4102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project private:
4202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  DISALLOW_COPY_AND_ASSIGN(MockPairingRegistryCallbacks);
4302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project};
4402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
4502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project// Verify that a pairing Dictionary has correct entries, but doesn't include
4602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project// any shared secret.
4702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid VerifyPairing(PairingRegistry::Pairing expected,
4802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                   const base::DictionaryValue& actual) {
4902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  std::string value;
5002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  EXPECT_TRUE(actual.GetString(PairingRegistry::kClientNameKey, &value));
5102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  EXPECT_EQ(expected.client_name(), value);
5202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  EXPECT_TRUE(actual.GetString(PairingRegistry::kClientIdKey, &value));
5302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  EXPECT_EQ(expected.client_id(), value);
5402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  EXPECT_FALSE(actual.HasKey(PairingRegistry::kSharedSecretKey));
5602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
5702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}  // namespace
5902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
6002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectnamespace remoting {
6102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectnamespace protocol {
6202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
6302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectclass PairingRegistryTest : public testing::Test {
6402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project public:
6502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  virtual void SetUp() OVERRIDE {
6602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    callback_count_ = 0;
6702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
6802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
6902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  void set_pairings(scoped_ptr<base::ListValue> pairings) {
7002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    pairings_ = pairings.Pass();
7102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
7202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  void ExpectSecret(const std::string& expected,
7402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    PairingRegistry::Pairing actual) {
7502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    EXPECT_EQ(expected, actual.shared_secret());
7602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    ++callback_count_;
7702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
7802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  void ExpectSaveSuccess(bool success) {
8002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    EXPECT_TRUE(success);
8102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    ++callback_count_;
8202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
8302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
8402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project protected:
8502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  base::MessageLoop message_loop_;
8602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  base::RunLoop run_loop_;
8702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
8802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int callback_count_;
8902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  scoped_ptr<base::ListValue> pairings_;
9002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project};
9102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectTEST_F(PairingRegistryTest, CreateAndGetPairings) {
9302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  scoped_refptr<PairingRegistry> registry = new SynchronousPairingRegistry(
9402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      scoped_ptr<PairingRegistry::Delegate>(new MockPairingRegistryDelegate()));
9502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  PairingRegistry::Pairing pairing_1 = registry->CreatePairing("my_client");
9602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  PairingRegistry::Pairing pairing_2 = registry->CreatePairing("my_client");
9702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  EXPECT_NE(pairing_1.shared_secret(), pairing_2.shared_secret());
9902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  registry->GetPairing(pairing_1.client_id(),
10102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                       base::Bind(&PairingRegistryTest::ExpectSecret,
10202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                  base::Unretained(this),
10302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                  pairing_1.shared_secret()));
10402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  EXPECT_EQ(1, callback_count_);
10502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  // Check that the second client is paired with a different shared secret.
10702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  registry->GetPairing(pairing_2.client_id(),
10802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                       base::Bind(&PairingRegistryTest::ExpectSecret,
10902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                  base::Unretained(this),
11002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                  pairing_2.shared_secret()));
11102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  EXPECT_EQ(2, callback_count_);
11202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
11302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectTEST_F(PairingRegistryTest, GetAllPairings) {
11502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  scoped_refptr<PairingRegistry> registry = new SynchronousPairingRegistry(
11602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      scoped_ptr<PairingRegistry::Delegate>(new MockPairingRegistryDelegate()));
11702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  PairingRegistry::Pairing pairing_1 = registry->CreatePairing("client1");
11802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  PairingRegistry::Pairing pairing_2 = registry->CreatePairing("client2");
11902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
12002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  registry->GetAllPairings(
12102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      base::Bind(&PairingRegistryTest::set_pairings,
12202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                 base::Unretained(this)));
12302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
12402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  ASSERT_EQ(2u, pairings_->GetSize());
12502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  const base::DictionaryValue* actual_pairing_1;
12602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  const base::DictionaryValue* actual_pairing_2;
12702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  ASSERT_TRUE(pairings_->GetDictionary(0, &actual_pairing_1));
12802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  ASSERT_TRUE(pairings_->GetDictionary(1, &actual_pairing_2));
12902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
13002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  // Ordering is not guaranteed, so swap if necessary.
13102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  std::string actual_client_id;
13202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  ASSERT_TRUE(actual_pairing_1->GetString(PairingRegistry::kClientIdKey,
13302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                          &actual_client_id));
13402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (actual_client_id != pairing_1.client_id()) {
13502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    std::swap(actual_pairing_1, actual_pairing_2);
13602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
13702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
13802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  VerifyPairing(pairing_1, *actual_pairing_1);
13902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  VerifyPairing(pairing_2, *actual_pairing_2);
14002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
14102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
14202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectTEST_F(PairingRegistryTest, DeletePairing) {
14302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  scoped_refptr<PairingRegistry> registry = new SynchronousPairingRegistry(
14402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      scoped_ptr<PairingRegistry::Delegate>(new MockPairingRegistryDelegate()));
14502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  PairingRegistry::Pairing pairing_1 = registry->CreatePairing("client1");
14602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  PairingRegistry::Pairing pairing_2 = registry->CreatePairing("client2");
14702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
14802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  registry->DeletePairing(
14902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      pairing_1.client_id(),
15002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      base::Bind(&PairingRegistryTest::ExpectSaveSuccess,
15102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                 base::Unretained(this)));
15202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  // Re-read the list, and verify it only has the pairing_2 client.
15402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  registry->GetAllPairings(
15502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      base::Bind(&PairingRegistryTest::set_pairings,
15602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                 base::Unretained(this)));
15702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  ASSERT_EQ(1u, pairings_->GetSize());
15902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  const base::DictionaryValue* actual_pairing_2;
16002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  ASSERT_TRUE(pairings_->GetDictionary(0, &actual_pairing_2));
16102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  std::string actual_client_id;
16202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  ASSERT_TRUE(actual_pairing_2->GetString(PairingRegistry::kClientIdKey,
16302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                          &actual_client_id));
16402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  EXPECT_EQ(pairing_2.client_id(), actual_client_id);
16502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
16602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
16702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectTEST_F(PairingRegistryTest, ClearAllPairings) {
16802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  scoped_refptr<PairingRegistry> registry = new SynchronousPairingRegistry(
16902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      scoped_ptr<PairingRegistry::Delegate>(new MockPairingRegistryDelegate()));
17002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  PairingRegistry::Pairing pairing_1 = registry->CreatePairing("client1");
17102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  PairingRegistry::Pairing pairing_2 = registry->CreatePairing("client2");
17202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  registry->ClearAllPairings(
17402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      base::Bind(&PairingRegistryTest::ExpectSaveSuccess,
17502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                 base::Unretained(this)));
17602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  // Re-read the list, and verify it is empty.
17802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  registry->GetAllPairings(
17902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      base::Bind(&PairingRegistryTest::set_pairings,
18002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                 base::Unretained(this)));
18102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  EXPECT_TRUE(pairings_->empty());
18302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
18402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectACTION_P(QuitMessageLoop, callback) {
18602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  callback.Run();
18702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
18802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectMATCHER_P(EqualsClientName, client_name, "") {
19002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return arg.client_name() == client_name;
19102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
19202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
19302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectMATCHER(NoPairings, "") {
19402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return arg->empty();
19502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
19602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
19702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectTEST_F(PairingRegistryTest, SerializedRequests) {
19802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  MockPairingRegistryCallbacks callbacks;
19902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  Sequence s;
20002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  EXPECT_CALL(callbacks, GetPairingCallback(EqualsClientName("client1")))
20102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      .InSequence(s);
20202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  EXPECT_CALL(callbacks, GetPairingCallback(EqualsClientName("client2")))
20302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      .InSequence(s);
20402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  EXPECT_CALL(callbacks, DoneCallback(true))
20502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      .InSequence(s);
20602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  EXPECT_CALL(callbacks, GetPairingCallback(EqualsClientName("client1")))
20702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      .InSequence(s);
20802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  EXPECT_CALL(callbacks, GetPairingCallback(EqualsClientName("")))
20902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      .InSequence(s);
21002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  EXPECT_CALL(callbacks, DoneCallback(true))
21102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      .InSequence(s);
21202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  EXPECT_CALL(callbacks, GetAllPairingsCallbackPtr(NoPairings()))
21302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      .InSequence(s);
21402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  EXPECT_CALL(callbacks, GetPairingCallback(EqualsClientName("client3")))
21502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      .InSequence(s)
21602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      .WillOnce(QuitMessageLoop(run_loop_.QuitClosure()));
21702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
21802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  scoped_refptr<PairingRegistry> registry = new PairingRegistry(
21902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      base::ThreadTaskRunnerHandle::Get(),
22002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      scoped_ptr<PairingRegistry::Delegate>(new MockPairingRegistryDelegate()));
22102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  PairingRegistry::Pairing pairing_1 = registry->CreatePairing("client1");
22202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  PairingRegistry::Pairing pairing_2 = registry->CreatePairing("client2");
22302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  registry->GetPairing(
22402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      pairing_1.client_id(),
22502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      base::Bind(&MockPairingRegistryCallbacks::GetPairingCallback,
22602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                 base::Unretained(&callbacks)));
22702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  registry->GetPairing(
22802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      pairing_2.client_id(),
22902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      base::Bind(&MockPairingRegistryCallbacks::GetPairingCallback,
23002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                 base::Unretained(&callbacks)));
23102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  registry->DeletePairing(
23202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      pairing_2.client_id(),
23302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      base::Bind(&MockPairingRegistryCallbacks::DoneCallback,
23402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                 base::Unretained(&callbacks)));
23502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  registry->GetPairing(
23602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      pairing_1.client_id(),
23702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      base::Bind(&MockPairingRegistryCallbacks::GetPairingCallback,
23802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                 base::Unretained(&callbacks)));
23902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  registry->GetPairing(
24002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      pairing_2.client_id(),
24102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      base::Bind(&MockPairingRegistryCallbacks::GetPairingCallback,
24202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                 base::Unretained(&callbacks)));
24302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  registry->ClearAllPairings(
24402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      base::Bind(&MockPairingRegistryCallbacks::DoneCallback,
24502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                 base::Unretained(&callbacks)));
24602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  registry->GetAllPairings(
24702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      base::Bind(&MockPairingRegistryCallbacks::GetAllPairingsCallback,
24802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                 base::Unretained(&callbacks)));
24902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  PairingRegistry::Pairing pairing_3 = registry->CreatePairing("client3");
25002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  registry->GetPairing(
25102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      pairing_3.client_id(),
25202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      base::Bind(&MockPairingRegistryCallbacks::GetPairingCallback,
25302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                 base::Unretained(&callbacks)));
25402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
25502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  run_loop_.Run();
25602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
25702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
25802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}  // namespace protocol
25902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}  // namespace remoting
26002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project