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