blob: fdefca4aa9db1390f8b79c86874d7375cfb141e7 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "test_util.h"
#include <zxtest/zxtest.h>
namespace network {
namespace testing {
FakeMacDeviceImpl::FakeMacDeviceImpl() {
// setup default info
features_.multicast_filter_count = MAX_MAC_FILTER / 2;
features_.supported_modes = kSupportedModesMask;
ZX_ASSERT(zx::event::create(0, &event_) == ZX_OK);
}
zx_status_t FakeMacDeviceImpl::CreateChild(std::unique_ptr<MacAddrDeviceInterface>* out) {
auto protocol = proto();
return MacAddrDeviceInterface::Create(ddk::MacAddrImplProtocolClient(&protocol), out);
}
void FakeMacDeviceImpl::MacAddrImplGetAddress(uint8_t* out_mac) { memcpy(out_mac, mac_, MAC_SIZE); }
void FakeMacDeviceImpl::MacAddrImplGetFeatures(features_t* out_features) {
*out_features = features_;
}
void FakeMacDeviceImpl::MacAddrImplSetMode(mode_t mode, const uint8_t* multicast_macs_list,
size_t multicast_macs_count) {
EXPECT_EQ(mode & kSupportedModesMask, mode);
EXPECT_NE(mode, 0);
mode_t old_mode = mode_;
mode_ = mode;
addresses_.clear();
for (size_t i = 0; i < multicast_macs_count; i++) {
MacAddress mac{};
memcpy(mac.octets.data(), multicast_macs_list, MAC_SIZE);
multicast_macs_list += MAC_SIZE;
addresses_.push_back(mac);
}
// Signal only if this wasn't the first time, given we always get a SetMode on startup.
if (old_mode != 0) {
event_.signal(0, kConfigurationChangedEvent);
}
}
zx_status_t FakeMacDeviceImpl::WaitConfigurationChanged() {
auto status = event_.wait_one(kConfigurationChangedEvent, zx::time::infinite(), nullptr);
event_.signal(kConfigurationChangedEvent, 0);
return status;
}
} // namespace testing
} // namespace network