Home | History | Annotate | Download | only in pairing
      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 PairingSession.
     16 
     17 #include <gtest/gtest.h>
     18 #include <polo/pairing/clientpairingsession.h>
     19 #include "polo/pairing/mocks.h"
     20 #include "polo/wire/mocks.h"
     21 
     22 using ::testing::Const;
     23 using ::testing::InSequence;
     24 using ::testing::Mock;
     25 using ::testing::Return;
     26 using ::testing::ReturnRef;
     27 using ::testing::StrictMock;
     28 using ::testing::_;
     29 
     30 namespace polo {
     31 namespace pairing {
     32 
     33 class TestPairingSession : public PairingSession {
     34  public:
     35   TestPairingSession(wire::PoloWireAdapter* wire,
     36                      PairingContext* context,
     37                      PoloChallengeResponse* challenge)
     38       : PairingSession(wire, context, challenge) {
     39   }
     40 
     41   void TestDoPairingPhase() {
     42     DoPairingPhase();
     43   }
     44 
     45   bool TestSetConfiguration(const message::ConfigurationMessage& message) {
     46     return SetConfiguration(message);
     47   }
     48 
     49   const message::ConfigurationMessage* GetConfiguration() {
     50     return configuration();
     51   }
     52 
     53   const message::OptionsMessage& GetLocalOptions() {
     54     return local_options();
     55   }
     56 
     57   void TestOnSecretMessage(const message::SecretMessage& message) {
     58     OnSecretMessage(message);
     59   }
     60 
     61   void TestOnSecretAckmessage(const message::SecretAckMessage& message) {
     62     OnSecretAckMessage(message);
     63   }
     64 
     65   MOCK_METHOD0(DoInitializationPhase, void());
     66   MOCK_METHOD0(DoConfigurationPhase, void());
     67   MOCK_METHOD1(OnConfigurationMessage,
     68                void(const pairing::message::ConfigurationMessage& message));
     69   MOCK_METHOD1(OnConfigurationAckMessage,
     70                void(const pairing::message::ConfigurationAckMessage& message));
     71   MOCK_METHOD1(OnOptionsMessage,
     72                void(const pairing::message::OptionsMessage& message));
     73   MOCK_METHOD1(OnPairingRequestMessage,
     74                void(const pairing::message::PairingRequestMessage& message));
     75   MOCK_METHOD1(OnPairingRequestAckMessage,
     76                void(const pairing::message::PairingRequestAckMessage& message));
     77 };
     78 
     79 class PairingSessionTest : public ::testing::Test {
     80  protected:
     81   PairingSessionTest()
     82       : interface_(),
     83         wire_(&interface_),
     84         challenge_(),
     85         context_(NULL, NULL, false),
     86         session_(&wire_, &context_, &challenge_) {
     87   }
     88 
     89   virtual void SetUp() {
     90   }
     91 
     92   virtual void TearDown() {
     93   }
     94 
     95   void InitSession() {
     96     InSequence sequence;
     97 
     98     EXPECT_CALL(listener_, OnSessionCreated());
     99     EXPECT_CALL(session_, DoInitializationPhase());
    100 
    101     session_.DoPair(&listener_);
    102   }
    103 
    104   StrictMock<wire::MockWireInterface> interface_;
    105   StrictMock<wire::MockWireAdapter> wire_;
    106   StrictMock<MockChallengeResponse> challenge_;
    107   PairingContext context_;
    108   StrictMock<MockPairingListener> listener_;
    109   StrictMock<TestPairingSession> session_;
    110 };
    111 
    112 TEST_F(PairingSessionTest, DoPair) {
    113   // Test the base SetUp case which initializes the pairing session.
    114   InitSession();
    115 }
    116 
    117 TEST_F(PairingSessionTest, SetConfiguration) {
    118   encoding::EncodingOption encoding(encoding::EncodingOption::kHexadecimal, 8);
    119   message::ConfigurationMessage configuration(encoding,
    120       message::OptionsMessage::kInputDevice);
    121   session_.TestSetConfiguration(configuration);
    122 
    123   ASSERT_TRUE(session_.GetConfiguration());
    124   ASSERT_EQ(encoding::EncodingOption::kHexadecimal,
    125             session_.GetConfiguration()->encoding().encoding_type());
    126   ASSERT_EQ(8, session_.GetConfiguration()->encoding().symbol_length());
    127   ASSERT_EQ(message::OptionsMessage::kInputDevice,
    128             session_.GetConfiguration()->client_role());
    129 
    130   ASSERT_TRUE(session_.encoder());
    131   ASSERT_EQ(2, session_.encoder()->symbols_per_byte());
    132 }
    133 
    134 TEST_F(PairingSessionTest, DoPairingPhaseInputDevice) {
    135   InitSession();
    136   InSequence sequence;
    137 
    138   encoding::EncodingOption encoding(encoding::EncodingOption::kHexadecimal, 8);
    139   message::ConfigurationMessage configuration(encoding,
    140       message::OptionsMessage::kInputDevice);
    141   session_.TestSetConfiguration(configuration);
    142 
    143   EXPECT_CALL(listener_, OnPerformInputDeviceRole());
    144 
    145   session_.TestDoPairingPhase();
    146 }
    147 
    148 TEST_F(PairingSessionTest, DoPairingPhaseDisplayDevice) {
    149   InitSession();
    150   InSequence sequence;
    151 
    152   encoding::EncodingOption encoding(encoding::EncodingOption::kHexadecimal, 8);
    153   message::ConfigurationMessage configuration(encoding,
    154       message::OptionsMessage::kDisplayDevice);
    155   session_.TestSetConfiguration(configuration);
    156 
    157   EXPECT_CALL(challenge_, GetGamma(_)).WillOnce(Return(new Gamma(10, 0x5)));
    158   EXPECT_CALL(listener_, OnPerformOutputDeviceRole(Gamma(10, 0x5)));
    159   EXPECT_CALL(wire_, GetNextMessage());
    160 
    161   session_.TestDoPairingPhase();
    162 }
    163 
    164 TEST_F(PairingSessionTest, AddInputEncoding) {
    165   encoding::EncodingOption encoding(encoding::EncodingOption::kHexadecimal, 8);
    166   session_.AddInputEncoding(encoding);
    167   ASSERT_TRUE(session_.GetLocalOptions().SupportsInputEncoding(encoding));
    168 }
    169 
    170 TEST_F(PairingSessionTest, AddInputEncodingInvalidEncoding) {
    171   encoding::EncodingOption encoding(encoding::EncodingOption::kHexadecimal, 1);
    172     session_.AddInputEncoding(encoding);
    173   ASSERT_FALSE(session_.GetLocalOptions().SupportsInputEncoding(encoding));
    174 }
    175 
    176 TEST_F(PairingSessionTest, AddOutputEncoding) {
    177   encoding::EncodingOption encoding(encoding::EncodingOption::kHexadecimal, 8);
    178   session_.AddOutputEncoding(encoding);
    179   ASSERT_TRUE(session_.GetLocalOptions().SupportsOutputEncoding(encoding));
    180 }
    181 
    182 TEST_F(PairingSessionTest, AddOutputEncodingInvalidEncoding) {
    183   encoding::EncodingOption encoding(encoding::EncodingOption::kUnknown, 8);
    184   session_.AddOutputEncoding(encoding);
    185   ASSERT_FALSE(session_.GetLocalOptions().SupportsOutputEncoding(encoding));
    186 }
    187 
    188 TEST_F(PairingSessionTest, SetSecret) {
    189   InitSession();
    190   InSequence sequence;
    191 
    192   // Do the setup so the session is expecting the secret.
    193   encoding::EncodingOption encoding(encoding::EncodingOption::kHexadecimal, 8);
    194   message::ConfigurationMessage configuration(encoding,
    195       message::OptionsMessage::kInputDevice);
    196   session_.TestSetConfiguration(configuration);
    197 
    198   EXPECT_CALL(listener_, OnPerformInputDeviceRole());
    199 
    200   session_.TestDoPairingPhase();
    201 
    202   Gamma gamma(5, 0x1);
    203   Nonce nonce(5, 0x2);
    204   Alpha alpha(5, 0x3);
    205 
    206   EXPECT_CALL(challenge_, CheckGamma(gamma)).WillOnce(Return(true));
    207   EXPECT_CALL(challenge_, ExtractNonce(gamma))
    208       .WillOnce(Return(new Nonce(nonce)));
    209   EXPECT_CALL(challenge_, GetAlpha(nonce))
    210       .WillOnce(Return(new Alpha(alpha)));
    211 
    212   EXPECT_CALL(wire_, SendSecretMessage(_));
    213   EXPECT_CALL(wire_, GetNextMessage());
    214 
    215   session_.SetSecret(gamma);
    216 }
    217 
    218 TEST_F(PairingSessionTest, OnSecretMessage) {
    219   InitSession();
    220   InSequence sequence;
    221 
    222   // Do the setup to set the secret.
    223   encoding::EncodingOption encoding(encoding::EncodingOption::kHexadecimal, 8);
    224   message::ConfigurationMessage configuration(encoding,
    225       message::OptionsMessage::kInputDevice);
    226   session_.TestSetConfiguration(configuration);
    227 
    228   EXPECT_CALL(listener_, OnPerformInputDeviceRole());
    229 
    230   session_.TestDoPairingPhase();
    231 
    232   Gamma gamma(5, 0x1);
    233   Nonce nonce(5, 0x2);
    234   Alpha alpha(5, 0x3);
    235 
    236   EXPECT_CALL(challenge_, CheckGamma(gamma)).WillOnce(Return(true));
    237   EXPECT_CALL(challenge_, ExtractNonce(gamma))
    238       .WillOnce(Return(new Nonce(nonce)));
    239   EXPECT_CALL(challenge_, GetAlpha(nonce))
    240       .WillOnce(Return(new Alpha(alpha)));
    241 
    242   EXPECT_CALL(wire_, SendSecretMessage(_));
    243   EXPECT_CALL(wire_, GetNextMessage());
    244 
    245   session_.SetSecret(gamma);
    246 
    247   EXPECT_CALL(challenge_, GetAlpha(nonce))
    248       .WillOnce(Return(new Alpha(alpha)));
    249 
    250   EXPECT_CALL(challenge_, GetAlpha(nonce))
    251         .WillOnce(Return(new Alpha(alpha)));
    252 
    253   EXPECT_CALL(wire_, SendSecretAckMessage(_));
    254   EXPECT_CALL(listener_, OnPairingSuccess());
    255 
    256   message::SecretMessage message(alpha);
    257   session_.TestOnSecretMessage(message);
    258 }
    259 
    260 TEST_F(PairingSessionTest, OnSecretAckMessage) {
    261   EXPECT_CALL(listener_, OnPairingSuccess());
    262 
    263   Alpha alpha(5, 0x3);
    264   message::SecretAckMessage message(alpha);
    265   session_.TestOnSecretAckmessage(message);
    266 }
    267 
    268 }  // namespace pairing
    269 }  // namespace polo
    270