blob: faf29134a8883fc25a3027fddf8790a2993b4520 [file] [log] [blame]
Darin Petkovca432fc2011-07-08 15:56:57 -07001// Copyright (c) 2011 The Chromium OS 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 <sys/socket.h>
6#include <linux/netlink.h>
7
Eric Shienbrood3e20a232012-02-16 11:35:56 -05008#include <base/bind.h>
Darin Petkovca432fc2011-07-08 15:56:57 -07009#include <base/memory/scoped_ptr.h>
10#include <gmock/gmock.h>
11#include <gtest/gtest.h>
12
13#include "shill/rtnl_handler.h"
14#include "shill/rtnl_listener.h"
Chris Masone2aa97072011-08-09 17:35:08 -070015#include "shill/rtnl_message.h"
Darin Petkovca432fc2011-07-08 15:56:57 -070016
Eric Shienbrood3e20a232012-02-16 11:35:56 -050017using base::Bind;
18using base::Callback;
19using base::Unretained;
Darin Petkovca432fc2011-07-08 15:56:57 -070020using testing::_;
Chris Masone2aa97072011-08-09 17:35:08 -070021using testing::A;
Darin Petkovca432fc2011-07-08 15:56:57 -070022using testing::Test;
23
24namespace shill {
25
26class RTNLListenerTest : public Test {
27 public:
28 RTNLListenerTest()
Eric Shienbrood3e20a232012-02-16 11:35:56 -050029 : callback_(Bind(&RTNLListenerTest::ListenerCallback,
30 Unretained(this))) {}
Darin Petkovca432fc2011-07-08 15:56:57 -070031
Eric Shienbrood3e20a232012-02-16 11:35:56 -050032 MOCK_METHOD1(ListenerCallback, void(const RTNLMessage &));
Darin Petkovca432fc2011-07-08 15:56:57 -070033
Han Shen4afba202012-12-17 08:48:35 -080034 virtual void SetUp() {
35 // RTNLHandler is a singleton, there's no guarentee that it is not
36 // setup/used by other unittests. Clear "listeners_" field before we run
37 // tests.
38 RTNLHandler::GetInstance()->listeners_.clear();
39 }
40
Darin Petkovca432fc2011-07-08 15:56:57 -070041 protected:
Eric Shienbrood3e20a232012-02-16 11:35:56 -050042 Callback<void(const RTNLMessage &)> callback_;
Darin Petkovca432fc2011-07-08 15:56:57 -070043};
44
45TEST_F(RTNLListenerTest, NoRun) {
46 {
Eric Shienbrood3e20a232012-02-16 11:35:56 -050047 RTNLListener listener(RTNLHandler::kRequestAddr, callback_);
Darin Petkovca432fc2011-07-08 15:56:57 -070048 EXPECT_EQ(1, RTNLHandler::GetInstance()->listeners_.size());
Chris Masone2aa97072011-08-09 17:35:08 -070049 RTNLMessage message;
Eric Shienbrood3e20a232012-02-16 11:35:56 -050050 EXPECT_CALL(*this, ListenerCallback(_)).Times(0);
Chris Masone2aa97072011-08-09 17:35:08 -070051 listener.NotifyEvent(RTNLHandler::kRequestLink, message);
Darin Petkovca432fc2011-07-08 15:56:57 -070052 }
53 EXPECT_EQ(0, RTNLHandler::GetInstance()->listeners_.size());
54}
55
56TEST_F(RTNLListenerTest, Run) {
57 {
58 RTNLListener listener(
59 RTNLHandler::kRequestLink | RTNLHandler::kRequestAddr,
Eric Shienbrood3e20a232012-02-16 11:35:56 -050060 callback_);
Darin Petkovca432fc2011-07-08 15:56:57 -070061 EXPECT_EQ(1, RTNLHandler::GetInstance()->listeners_.size());
Chris Masone2aa97072011-08-09 17:35:08 -070062 RTNLMessage message;
Eric Shienbrood3e20a232012-02-16 11:35:56 -050063 EXPECT_CALL(*this, ListenerCallback(A<const RTNLMessage &>())).Times(1);
Chris Masone2aa97072011-08-09 17:35:08 -070064 listener.NotifyEvent(RTNLHandler::kRequestLink, message);
Darin Petkovca432fc2011-07-08 15:56:57 -070065 }
66 EXPECT_EQ(0, RTNLHandler::GetInstance()->listeners_.size());
67}
68
69} // namespace shill