1// Copyright 2012 Google Inc. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// Tests for ServerPairingSession.
16
17#include <gtest/gtest.h>
18#include <polo/pairing/serverpairingsession.h>
19#include "polo/pairing/mocks.h"
20#include "polo/wire/mocks.h"
21
22using ::testing::InSequence;
23using ::testing::Mock;
24using ::testing::Return;
25using ::testing::StrictMock;
26using ::testing::_;
27
28namespace polo {
29namespace pairing {
30
31class TestServerPairingSession : public ServerPairingSession {
32 public:
33  TestServerPairingSession(wire::PoloWireAdapter* wire,
34                          PairingContext* context,
35                          PoloChallengeResponse* challenge)
36      : ServerPairingSession(wire, context, challenge, "server1") {
37  }
38
39  void TestDoInitializationPhase() {
40    DoInitializationPhase();
41  }
42
43  void TestDoConfigurationPhase() {
44    DoConfigurationPhase();
45  }
46
47  bool TestSetConfiguration(const message::ConfigurationMessage& config) {
48    return SetConfiguration(config);
49  }
50};
51
52class ServerPairingSessionTest : public ::testing::Test {
53 protected:
54  ServerPairingSessionTest()
55      : interface_(),
56        wire_(&interface_),
57        challenge_(),
58        context_(NULL, NULL, true),
59        session_(&wire_, &context_, &challenge_) {
60  }
61
62  virtual void SetUp() {
63  }
64
65  virtual void TearDown() {
66  }
67
68  void InitSession() {
69    InSequence sequence;
70
71    EXPECT_CALL(listener_, OnSessionCreated());
72    EXPECT_CALL(wire_, GetNextMessage());
73
74    session_.DoPair(&listener_);
75  }
76
77  StrictMock<wire::MockWireInterface> interface_;
78  StrictMock<wire::MockWireAdapter> wire_;
79  StrictMock<MockChallengeResponse> challenge_;
80  PairingContext context_;
81  StrictMock<MockPairingListener> listener_;
82  StrictMock<TestServerPairingSession> session_;
83};
84
85TEST_F(ServerPairingSessionTest, DoInitializationPhase) {
86  InitSession();
87}
88
89TEST_F(ServerPairingSessionTest, DoConfigurationPhase) {
90  InitSession();
91  InSequence sequence;
92  EXPECT_CALL(wire_, GetNextMessage());
93
94  session_.TestDoInitializationPhase();
95}
96
97TEST_F(ServerPairingSessionTest, OnPairingRequestMessage) {
98  InitSession();
99  InSequence sequence;
100  EXPECT_CALL(wire_, SendPairingRequestAckMessage(_));
101  EXPECT_CALL(wire_, GetNextMessage());
102
103  message::PairingRequestMessage message("service1");
104  session_.OnPairingRequestMessage(message);
105}
106
107TEST_F(ServerPairingSessionTest, OnOptionsMessage) {
108  InitSession();
109  InSequence sequence;
110  EXPECT_CALL(wire_, SendOptionsMessage(_));
111  EXPECT_CALL(wire_, GetNextMessage());
112
113  message::OptionsMessage message;
114  session_.OnOptionsMessage(message);
115}
116
117TEST_F(ServerPairingSessionTest, OnConfigurationMessage) {
118  encoding::EncodingOption encoding(encoding::EncodingOption::kHexadecimal, 8);
119  session_.AddInputEncoding(encoding);
120  session_.AddOutputEncoding(encoding);
121
122  InitSession();
123
124  InSequence sequence;
125  EXPECT_CALL(wire_, SendConfigurationAckMessage(_));
126
127  EXPECT_CALL(challenge_, GetGamma(_)).WillOnce(Return(new Gamma(5, 0x5)));
128  EXPECT_CALL(listener_, OnPerformOutputDeviceRole(Gamma(5, 0x5)));
129  EXPECT_CALL(wire_, GetNextMessage());
130
131  message::ConfigurationMessage message(encoding,
132      message::OptionsMessage::kInputDevice);
133  session_.OnConfigurationMessage(message);
134}
135
136}  // namespace pairing
137}  // namespace polo
138