1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project
3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License");
5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License.
6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at
7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//      http://www.apache.org/licenses/LICENSE-2.0
9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software
11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS,
12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and
14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License.
15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
1698dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkov
17675d0b0f04936050a357722f52dc078a3ab671d8Peter Qiu#include "shill/dhcp/dhcp_provider.h"
182b10554b6c736f3421102d483b74b70bb82f997cChris Masone
1911c213f3cf64f27a0e42ee6da95e98bd1d4b3202Ben Chan#include <base/files/file_util.h>
200e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulk#include <base/files/scoped_temp_dir.h>
21a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/stringprintf.h>
220e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulk
23675d0b0f04936050a357722f52dc078a3ab671d8Peter Qiu#include "shill/dhcp/dhcp_config.h"
2419e30406a1d3123892007d20438527dc4b2f92c3Chris Masone#include "shill/mock_control.h"
2515d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silberstein#include "shill/mock_dhcp_properties.h"
26d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart#include "shill/mock_event_dispatcher.h"
2798dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkov
280e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath;
290e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::ScopedTempDir;
30d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewartusing testing::_;
3115d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silbersteinusing testing::DoAll;
3215d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silbersteinusing testing::Return;
33d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewartusing testing::SaveArg;
3415d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silbersteinusing testing::SetArgPointee;
35d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewartusing testing::StrictMock;
3698dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkovusing testing::Test;
3798dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkov
3898dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkovnamespace shill {
3998dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkov
4098dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkovnamespace {
4198dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkovconst char kDeviceName[] = "testdevicename";
42d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewartconst char kStorageIdentifier[] = "teststorageidentifier";
43d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewartconst bool kArpGateway = false;
448a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko}  // namespace
4598dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkov
4698dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkovclass DHCPProviderTest : public Test {
4798dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkov public:
48f65e928d8cd59338cec95a7daa6957f6c510fd2eDarin Petkov  DHCPProviderTest() : provider_(DHCPProvider::GetInstance()) {
4919e30406a1d3123892007d20438527dc4b2f92c3Chris Masone    provider_->control_interface_ = &control_;
50d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart    provider_->dispatcher_ = &dispatcher_;
51d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart  }
52d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart
53d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart  void SetUp() {
544afba20439a10cd7e30831ac8ba664ca468a0bd6Han Shen    // DHCPProvider is a singleton, there is no guarentee that it is
554afba20439a10cd7e30831ac8ba664ca468a0bd6Han Shen    // not setup/used elsewhere, so reset its state before running our
564afba20439a10cd7e30831ac8ba664ca468a0bd6Han Shen    // tests.
574afba20439a10cd7e30831ac8ba664ca468a0bd6Han Shen    provider_->configs_.clear();
58d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart    provider_->recently_unbound_pids_.clear();
5998dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkov  }
6098dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkov
6198dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkov protected:
626b7a7b59a91f2fd5bcf871ac97bdfda5ae9bdd60Paul Stewart  void RetireUnboundPID(int pid) { provider_->RetireUnboundPID(pid); }
636b7a7b59a91f2fd5bcf871ac97bdfda5ae9bdd60Paul Stewart
6419e30406a1d3123892007d20438527dc4b2f92c3Chris Masone  MockControl control_;
650bfabaae654ba3bf597a303b7517a0e14fd65089Paul Stewart  DHCPProvider* provider_;
66d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart  StrictMock<MockEventDispatcher> dispatcher_;
6798dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkov};
6898dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkov
698e0151e84f077cc9c0646d5bafd925ed235a1c12Peter QiuTEST_F(DHCPProviderTest, CreateIPv4Config) {
7015d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silberstein  DhcpProperties dhcp_props;
7115d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silberstein
728e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu  DHCPConfigRefPtr config = provider_->CreateIPv4Config(kDeviceName,
738e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu                                                        kStorageIdentifier,
7415d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silberstein                                                        kArpGateway,
7515d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silberstein                                                        dhcp_props);
7698dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkov  EXPECT_TRUE(config.get());
77f65e928d8cd59338cec95a7daa6957f6c510fd2eDarin Petkov  EXPECT_EQ(kDeviceName, config->device_name());
7898dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkov  EXPECT_TRUE(provider_->configs_.empty());
7998dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkov}
8098dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkov
810e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert ChaulkTEST_F(DHCPProviderTest, DestroyLease) {
820e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulk  ScopedTempDir temp_dir;
830e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulk  FilePath lease_file;
840e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulk  EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
850e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulk  provider_->root_ = temp_dir.path();
860e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulk  lease_file = provider_->root_.Append(base::StringPrintf(
870e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulk      DHCPProvider::kDHCPCDPathFormatLease,
880e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulk      kDeviceName));
89a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_TRUE(base::CreateDirectory(lease_file.DirName()));
906fbf64f493a9aae7d743888039c61a57386203dbBen Chan  EXPECT_EQ(0, base::WriteFile(lease_file, "", 0));
91a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_TRUE(base::PathExists(lease_file));
920e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulk  provider_->DestroyLease(kDeviceName);
93a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_FALSE(base::PathExists(lease_file));
940e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulk}
950e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulk
96d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul StewartTEST_F(DHCPProviderTest, BindAndUnbind) {
97d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart  int kPid = 999;
98d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart  EXPECT_EQ(nullptr, provider_->GetConfig(kPid));
99d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart  EXPECT_FALSE(provider_->IsRecentlyUnbound(kPid));
10015d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silberstein  DhcpProperties dhcp_props;
101d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart
102d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart  DHCPConfigRefPtr config = provider_->CreateIPv4Config(kDeviceName,
103d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart                                                        kStorageIdentifier,
10415d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silberstein                                                        kArpGateway,
10515d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silberstein                                                        dhcp_props);
106d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart  provider_->BindPID(kPid, config);
107d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart  EXPECT_NE(nullptr, provider_->GetConfig(kPid));
108d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart  EXPECT_FALSE(provider_->IsRecentlyUnbound(kPid));
109d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart
110d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart  base::Closure task;
1116b7a7b59a91f2fd5bcf871ac97bdfda5ae9bdd60Paul Stewart  EXPECT_CALL(dispatcher_, PostDelayedTask(_, _));  // TODO(pstew): crbug/502320
112d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart  provider_->UnbindPID(kPid);
113d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart  EXPECT_EQ(nullptr, provider_->GetConfig(kPid));
114d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart  EXPECT_TRUE(provider_->IsRecentlyUnbound(kPid));
115d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart
1166b7a7b59a91f2fd5bcf871ac97bdfda5ae9bdd60Paul Stewart  RetireUnboundPID(kPid);  // Execute as if the PostDelayedTask() timer expired.
117d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart  EXPECT_EQ(nullptr, provider_->GetConfig(kPid));
118d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart  EXPECT_FALSE(provider_->IsRecentlyUnbound(kPid));
119d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart}
120d1c7b413bf7e1f264d1acfdfb2f698413f6cf352Paul Stewart
12198dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkov}  // namespace shill
122