121 lines
4 KiB
C++
121 lines
4 KiB
C++
//
|
|
// Copyright (C) 2012 The Android Open Source Project
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
|
|
#include "shill/dhcp/dhcp_provider.h"
|
|
|
|
#include <base/files/file_util.h>
|
|
#include <base/files/scoped_temp_dir.h>
|
|
#include <base/strings/stringprintf.h>
|
|
|
|
#include "shill/dhcp/dhcp_config.h"
|
|
#include "shill/mock_control.h"
|
|
#include "shill/mock_dhcp_properties.h"
|
|
#include "shill/mock_event_dispatcher.h"
|
|
|
|
using base::FilePath;
|
|
using base::ScopedTempDir;
|
|
using testing::_;
|
|
using testing::DoAll;
|
|
using testing::Return;
|
|
using testing::SaveArg;
|
|
using testing::SetArgPointee;
|
|
using testing::StrictMock;
|
|
using testing::Test;
|
|
|
|
namespace shill {
|
|
|
|
namespace {
|
|
const char kDeviceName[] = "testdevicename";
|
|
const char kStorageIdentifier[] = "teststorageidentifier";
|
|
const bool kArpGateway = false;
|
|
} // namespace
|
|
|
|
class DHCPProviderTest : public Test {
|
|
public:
|
|
DHCPProviderTest() : provider_(DHCPProvider::GetInstance()) {
|
|
provider_->control_interface_ = &control_;
|
|
provider_->dispatcher_ = &dispatcher_;
|
|
}
|
|
|
|
void SetUp() {
|
|
// DHCPProvider is a singleton, there is no guarentee that it is
|
|
// not setup/used elsewhere, so reset its state before running our
|
|
// tests.
|
|
provider_->configs_.clear();
|
|
provider_->recently_unbound_pids_.clear();
|
|
}
|
|
|
|
protected:
|
|
void RetireUnboundPID(int pid) { provider_->RetireUnboundPID(pid); }
|
|
|
|
MockControl control_;
|
|
DHCPProvider* provider_;
|
|
StrictMock<MockEventDispatcher> dispatcher_;
|
|
};
|
|
|
|
TEST_F(DHCPProviderTest, CreateIPv4Config) {
|
|
DhcpProperties dhcp_props;
|
|
|
|
DHCPConfigRefPtr config = provider_->CreateIPv4Config(kDeviceName,
|
|
kStorageIdentifier,
|
|
kArpGateway,
|
|
dhcp_props);
|
|
EXPECT_TRUE(config.get());
|
|
EXPECT_EQ(kDeviceName, config->device_name());
|
|
EXPECT_TRUE(provider_->configs_.empty());
|
|
}
|
|
|
|
TEST_F(DHCPProviderTest, DestroyLease) {
|
|
ScopedTempDir temp_dir;
|
|
FilePath lease_file;
|
|
EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
|
|
provider_->root_ = temp_dir.path();
|
|
lease_file = provider_->root_.Append(base::StringPrintf(
|
|
DHCPProvider::kDHCPCDPathFormatLease,
|
|
kDeviceName));
|
|
EXPECT_TRUE(base::CreateDirectory(lease_file.DirName()));
|
|
EXPECT_EQ(0, base::WriteFile(lease_file, "", 0));
|
|
EXPECT_TRUE(base::PathExists(lease_file));
|
|
provider_->DestroyLease(kDeviceName);
|
|
EXPECT_FALSE(base::PathExists(lease_file));
|
|
}
|
|
|
|
TEST_F(DHCPProviderTest, BindAndUnbind) {
|
|
int kPid = 999;
|
|
EXPECT_EQ(nullptr, provider_->GetConfig(kPid));
|
|
EXPECT_FALSE(provider_->IsRecentlyUnbound(kPid));
|
|
DhcpProperties dhcp_props;
|
|
|
|
DHCPConfigRefPtr config = provider_->CreateIPv4Config(kDeviceName,
|
|
kStorageIdentifier,
|
|
kArpGateway,
|
|
dhcp_props);
|
|
provider_->BindPID(kPid, config);
|
|
EXPECT_NE(nullptr, provider_->GetConfig(kPid));
|
|
EXPECT_FALSE(provider_->IsRecentlyUnbound(kPid));
|
|
|
|
base::Closure task;
|
|
EXPECT_CALL(dispatcher_, PostDelayedTask(_, _)); // TODO(pstew): crbug/502320
|
|
provider_->UnbindPID(kPid);
|
|
EXPECT_EQ(nullptr, provider_->GetConfig(kPid));
|
|
EXPECT_TRUE(provider_->IsRecentlyUnbound(kPid));
|
|
|
|
RetireUnboundPID(kPid); // Execute as if the PostDelayedTask() timer expired.
|
|
EXPECT_EQ(nullptr, provider_->GetConfig(kPid));
|
|
EXPECT_FALSE(provider_->IsRecentlyUnbound(kPid));
|
|
}
|
|
|
|
} // namespace shill
|