1*84e33947SAndroid Build Coastguard Worker /* 2*84e33947SAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project 3*84e33947SAndroid Build Coastguard Worker * 4*84e33947SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*84e33947SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*84e33947SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*84e33947SAndroid Build Coastguard Worker * 8*84e33947SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*84e33947SAndroid Build Coastguard Worker * 10*84e33947SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*84e33947SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*84e33947SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*84e33947SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*84e33947SAndroid Build Coastguard Worker * limitations under the License. 15*84e33947SAndroid Build Coastguard Worker */ 16*84e33947SAndroid Build Coastguard Worker 17*84e33947SAndroid Build Coastguard Worker #include "fake_link.h" 18*84e33947SAndroid Build Coastguard Worker 19*84e33947SAndroid Build Coastguard Worker #include <cstring> 20*84e33947SAndroid Build Coastguard Worker 21*84e33947SAndroid Build Coastguard Worker #include "chpp/log.h" 22*84e33947SAndroid Build Coastguard Worker #include "packet_util.h" 23*84e33947SAndroid Build Coastguard Worker 24*84e33947SAndroid Build Coastguard Worker namespace chpp::test { 25*84e33947SAndroid Build Coastguard Worker appendTxPacket(uint8_t * data,size_t len)26*84e33947SAndroid Build Coastguard Workervoid FakeLink::appendTxPacket(uint8_t *data, size_t len) { 27*84e33947SAndroid Build Coastguard Worker std::vector<uint8_t> pkt; 28*84e33947SAndroid Build Coastguard Worker pkt.resize(len); 29*84e33947SAndroid Build Coastguard Worker memcpy(pkt.data(), data, len); 30*84e33947SAndroid Build Coastguard Worker checkPacketValidity(pkt); 31*84e33947SAndroid Build Coastguard Worker { 32*84e33947SAndroid Build Coastguard Worker std::lock_guard<std::mutex> lock(mMutex); 33*84e33947SAndroid Build Coastguard Worker mTxPackets.emplace_back(std::move(pkt)); 34*84e33947SAndroid Build Coastguard Worker mCondVar.notify_all(); 35*84e33947SAndroid Build Coastguard Worker } 36*84e33947SAndroid Build Coastguard Worker } 37*84e33947SAndroid Build Coastguard Worker getTxPacketCount()38*84e33947SAndroid Build Coastguard Workerint FakeLink::getTxPacketCount() { 39*84e33947SAndroid Build Coastguard Worker std::lock_guard<std::mutex> lock(mMutex); 40*84e33947SAndroid Build Coastguard Worker return static_cast<int>(mTxPackets.size()); 41*84e33947SAndroid Build Coastguard Worker } 42*84e33947SAndroid Build Coastguard Worker waitForTxPacket(std::chrono::milliseconds timeout)43*84e33947SAndroid Build Coastguard Workerbool FakeLink::waitForTxPacket(std::chrono::milliseconds timeout) { 44*84e33947SAndroid Build Coastguard Worker std::unique_lock<std::mutex> lock(mMutex); 45*84e33947SAndroid Build Coastguard Worker auto now = std::chrono::system_clock::now(); 46*84e33947SAndroid Build Coastguard Worker CHPP_LOGD("FakeLink::WaitForTxPacket waiting..."); 47*84e33947SAndroid Build Coastguard Worker while (mTxPackets.empty()) { 48*84e33947SAndroid Build Coastguard Worker std::cv_status status = mCondVar.wait_until(lock, now + timeout); 49*84e33947SAndroid Build Coastguard Worker if (status == std::cv_status::timeout) { 50*84e33947SAndroid Build Coastguard Worker return false; 51*84e33947SAndroid Build Coastguard Worker } 52*84e33947SAndroid Build Coastguard Worker } 53*84e33947SAndroid Build Coastguard Worker return true; 54*84e33947SAndroid Build Coastguard Worker } 55*84e33947SAndroid Build Coastguard Worker popTxPacket()56*84e33947SAndroid Build Coastguard Workerstd::vector<uint8_t> FakeLink::popTxPacket() { 57*84e33947SAndroid Build Coastguard Worker std::lock_guard<std::mutex> lock(mMutex); 58*84e33947SAndroid Build Coastguard Worker assert(!mTxPackets.empty()); 59*84e33947SAndroid Build Coastguard Worker std::vector<uint8_t> vec = std::move(mTxPackets.back()); 60*84e33947SAndroid Build Coastguard Worker mTxPackets.pop_back(); 61*84e33947SAndroid Build Coastguard Worker return vec; 62*84e33947SAndroid Build Coastguard Worker } 63*84e33947SAndroid Build Coastguard Worker reset()64*84e33947SAndroid Build Coastguard Workervoid FakeLink::reset() { 65*84e33947SAndroid Build Coastguard Worker std::lock_guard<std::mutex> lock(mMutex); 66*84e33947SAndroid Build Coastguard Worker mTxPackets.clear(); 67*84e33947SAndroid Build Coastguard Worker } 68*84e33947SAndroid Build Coastguard Worker 69*84e33947SAndroid Build Coastguard Worker } // namespace chpp::test