Home | History | Annotate | Download | only in shill
      1 //
      2 // Copyright (C) 2012 The Android Open Source Project
      3 //
      4 // Licensed under the Apache License, Version 2.0 (the "License");
      5 // you may not use this file except in compliance with the License.
      6 // You may obtain a copy of the License at
      7 //
      8 //      http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unless required by applicable law or agreed to in writing, software
     11 // distributed under the License is distributed on an "AS IS" BASIS,
     12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 // See the License for the specific language governing permissions and
     14 // limitations under the License.
     15 //
     16 
     17 #include "shill/dns_server_tester.h"
     18 
     19 #include <memory>
     20 #include <string>
     21 
     22 #include <base/bind.h>
     23 #include <gmock/gmock.h>
     24 #include <gtest/gtest.h>
     25 
     26 #include "shill/mock_connection.h"
     27 #include "shill/mock_control.h"
     28 #include "shill/mock_device_info.h"
     29 #include "shill/mock_dns_client.h"
     30 #include "shill/mock_dns_client_factory.h"
     31 #include "shill/mock_event_dispatcher.h"
     32 #include "shill/net/mock_time.h"
     33 
     34 using base::Bind;
     35 using base::Callback;
     36 using base::Unretained;
     37 using std::string;
     38 using std::vector;
     39 using testing::_;
     40 using testing::AtLeast;
     41 using testing::DoAll;
     42 using testing::InSequence;
     43 using testing::Mock;
     44 using testing::NiceMock;
     45 using testing::Return;
     46 using testing::ReturnRef;
     47 using testing::SetArgumentPointee;
     48 using testing::StrictMock;
     49 using testing::Test;
     50 
     51 namespace shill {
     52 
     53 namespace {
     54 const char kInterfaceName[] = "int0";
     55 const char kDNSServer0[] = "8.8.8.8";
     56 const char kDNSServer1[] = "8.8.4.4";
     57 const char* kDNSServers[] = { kDNSServer0, kDNSServer1 };
     58 }  // namespace
     59 
     60 class DNSServerTesterTest : public Test {
     61  public:
     62   DNSServerTesterTest()
     63       : device_info_(
     64             new NiceMock<MockDeviceInfo>(&control_, nullptr, nullptr, nullptr)),
     65         connection_(new StrictMock<MockConnection>(device_info_.get())),
     66         interface_name_(kInterfaceName),
     67         dns_servers_(kDNSServers, kDNSServers + 2) {}
     68 
     69   virtual void SetUp() {
     70     EXPECT_CALL(*connection_.get(), interface_name())
     71           .WillRepeatedly(ReturnRef(interface_name_));
     72     dns_server_tester_.reset(
     73         new DNSServerTester(connection_.get(),
     74                             &dispatcher_,
     75                             dns_servers_,
     76                             false,
     77                             callback_target_.result_callback()));
     78   }
     79 
     80  protected:
     81   class CallbackTarget {
     82    public:
     83     CallbackTarget()
     84         : result_callback_(Bind(&CallbackTarget::ResultCallback,
     85                                 Unretained(this))) {
     86     }
     87 
     88     MOCK_METHOD1(ResultCallback, void(const DNSServerTester::Status status));
     89     Callback<void(const DNSServerTester::Status)>& result_callback() {
     90       return result_callback_;
     91     }
     92 
     93    private:
     94     Callback<void(const DNSServerTester::Status)> result_callback_;
     95   };
     96 
     97   DNSServerTester* dns_server_tester() { return dns_server_tester_.get(); }
     98   MockEventDispatcher& dispatcher() { return dispatcher_; }
     99   CallbackTarget& callback_target() { return callback_target_; }
    100 
    101   void ExpectReset() {
    102     EXPECT_TRUE(callback_target_.result_callback().Equals(
    103         dns_server_tester_->dns_result_callback_));
    104   }
    105 
    106  private:
    107   StrictMock<MockEventDispatcher> dispatcher_;
    108   MockControl control_;
    109   std::unique_ptr<MockDeviceInfo> device_info_;
    110   scoped_refptr<MockConnection> connection_;
    111   CallbackTarget callback_target_;
    112   const string interface_name_;
    113   vector<string> dns_servers_;
    114   std::unique_ptr<DNSServerTester> dns_server_tester_;
    115 };
    116 
    117 TEST_F(DNSServerTesterTest, Constructor) {
    118   ExpectReset();
    119 }
    120 
    121 TEST_F(DNSServerTesterTest, StartAttempt) {
    122   // Start attempt with no delay.
    123   EXPECT_CALL(dispatcher(), PostDelayedTask(_, 0));
    124   dns_server_tester()->StartAttempt(0);
    125 
    126   // Start attempt with delay.
    127   EXPECT_CALL(dispatcher(), PostDelayedTask(_, 100));
    128   dns_server_tester()->StartAttempt(100);
    129 }
    130 
    131 TEST_F(DNSServerTesterTest, StartAttemptTask) {
    132   // Setup mock DNS test client.
    133   MockDNSClient* dns_test_client = new MockDNSClient();
    134   dns_server_tester()->dns_test_client_.reset(dns_test_client);
    135 
    136   // DNS test task started successfully.
    137   EXPECT_CALL(*dns_test_client, Start(_, _)).WillOnce(Return(true));
    138   EXPECT_CALL(callback_target(), ResultCallback(_)).Times(0);
    139   dns_server_tester()->StartAttemptTask();
    140   Mock::VerifyAndClearExpectations(dns_test_client);
    141 
    142   // DNS test task failed to start.
    143   EXPECT_CALL(*dns_test_client, Start(_, _)).WillOnce(Return(false));
    144   EXPECT_CALL(callback_target(),
    145               ResultCallback(DNSServerTester::kStatusFailure)).Times(1);
    146   dns_server_tester()->StartAttemptTask();
    147   Mock::VerifyAndClearExpectations(dns_test_client);
    148 }
    149 
    150 TEST_F(DNSServerTesterTest, AttemptCompleted) {
    151   // DNS test attempt succeed with retry_until_success_ not set.
    152   dns_server_tester()->retry_until_success_ = false;
    153   EXPECT_CALL(callback_target(),
    154               ResultCallback(DNSServerTester::kStatusSuccess)).Times(1);
    155   dns_server_tester()->CompleteAttempt(DNSServerTester::kStatusSuccess);
    156 
    157   // DNS test attempt succeed with retry_until_success_ being set.
    158   dns_server_tester()->retry_until_success_ = true;
    159   EXPECT_CALL(callback_target(),
    160               ResultCallback(DNSServerTester::kStatusSuccess)).Times(1);
    161   dns_server_tester()->CompleteAttempt(DNSServerTester::kStatusSuccess);
    162 
    163   // DNS test attempt failed with retry_until_success_ not set.
    164   dns_server_tester()->retry_until_success_ = false;
    165   EXPECT_CALL(callback_target(),
    166               ResultCallback(DNSServerTester::kStatusFailure)).Times(1);
    167   dns_server_tester()->CompleteAttempt(DNSServerTester::kStatusFailure);
    168 
    169   // DNS test attempt failed with retry_until_success_ being set.
    170   dns_server_tester()->retry_until_success_ = true;
    171   EXPECT_CALL(callback_target(), ResultCallback(_)).Times(0);
    172   EXPECT_CALL(dispatcher(), PostDelayedTask(_, _)).Times(1);
    173   dns_server_tester()->CompleteAttempt(DNSServerTester::kStatusFailure);
    174 }
    175 
    176 TEST_F(DNSServerTesterTest, StopAttempt) {
    177   // Setup mock DNS test client.
    178   MockDNSClient* dns_test_client = new MockDNSClient();
    179   dns_server_tester()->dns_test_client_.reset(dns_test_client);
    180 
    181   // DNS test task started successfully.
    182   EXPECT_CALL(*dns_test_client, Start(_, _)).WillOnce(Return(true));
    183   EXPECT_CALL(callback_target(), ResultCallback(_)).Times(0);
    184   dns_server_tester()->StartAttemptTask();
    185   Mock::VerifyAndClearExpectations(dns_test_client);
    186 
    187   // Stop the DNS test attempt.
    188   EXPECT_CALL(*dns_test_client, Stop()).Times(1);
    189   EXPECT_CALL(callback_target(), ResultCallback(_)).Times(0);
    190   dns_server_tester()->StopAttempt();
    191   Mock::VerifyAndClearExpectations(dns_test_client);
    192 }
    193 
    194 }  // namespace shill
    195