1ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal/* 2ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal * Copyright (C) 2016, The Android Open Source Project 3ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal * 4ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal * Licensed under the Apache License, Version 2.0 (the "License"); 5ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal * you may not use this file except in compliance with the License. 6ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal * You may obtain a copy of the License at 7ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal * 8ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal * http://www.apache.org/licenses/LICENSE-2.0 9ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal * 10ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal * Unless required by applicable law or agreed to in writing, software 11ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal * distributed under the License is distributed on an "AS IS" BASIS, 12ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal * See the License for the specific language governing permissions and 14ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal * limitations under the License. 15ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal */ 16ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal 17b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal#include <array> 18960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal#include <iostream> 19ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal#include <memory> 20b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal#include <tuple> 21ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal 22ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal#include "gmock/gmock.h" 23ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal#include "gtest/gtest.h" 24ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal 25b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal#include "wifilogd/local_utils.h" 26ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal#include "wifilogd/os.h" 27ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal#include "wifilogd/tests/mock_raw_os.h" 28ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal 29960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal// This function must be defined in the same namespace as |timespec|. Hence the 30960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal// placement of this function at the top level. 31960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawalinline void PrintTo(const timespec& ts, ::std::ostream* os) { 32960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal *os << "[secs:" << ts.tv_sec << " " 33960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal << "nsecs:" << ts.tv_nsec << "]"; 34960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal} 35960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal 36ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawalnamespace android { 37ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawalnamespace wifilogd { 38ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawalnamespace { 39ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal 40ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawalusing ::testing::_; 41960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawalusing ::testing::Invoke; 42960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawalusing ::testing::InSequence; 43960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawalusing ::testing::Matcher; 44960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawalusing ::testing::MatcherInterface; 45960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawalusing ::testing::MatchResultListener; 46960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawalusing ::testing::NotNull; 47960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawalusing ::testing::Pointee; 48ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawalusing ::testing::Return; 49ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawalusing ::testing::SetArgumentPointee; 50b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawalusing ::testing::SetErrnoAndReturn; 51ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawalusing ::testing::StrictMock; 52a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawalusing ::testing::StrEq; 53ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal 54b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawalusing local_utils::GetMaxVal; 55b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal 56ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawalclass OsTest : public ::testing::Test { 57ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal public: 58ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal OsTest() { 59ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal raw_os_ = new StrictMock<MockRawOs>(); 60ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal os_ = std::unique_ptr<Os>(new Os(std::unique_ptr<RawOs>(raw_os_))); 61ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal } 62ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal 63ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal protected: 64ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal std::unique_ptr<Os> os_; 65ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal // We use a raw pointer to access the mock, since ownership passes 66ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal // to |os_|. 67ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal MockRawOs* raw_os_; 68ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal}; 69ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal 70960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawalclass TimespecMatcher : public MatcherInterface<const timespec&> { 71960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal public: 72960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal explicit TimespecMatcher(const timespec& expected) : expected_(expected) {} 73960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal 74960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal virtual void DescribeTo(::std::ostream* os) const { 75960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal *os << "equals "; 76960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal PrintTo(expected_, os); 77960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal } 78960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal 79960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal virtual bool MatchAndExplain(const timespec& actual, 80960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal MatchResultListener* /* listener */) const { 81960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal return actual.tv_sec == expected_.tv_sec && 82960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal actual.tv_nsec == expected_.tv_nsec; 83960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal } 84960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal 85960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal private: 86960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal const timespec& expected_; 87960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal}; 88960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal 89960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawalMatcher<const timespec&> EqualsTimespec(const timespec& expected) { 90960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal return MakeMatcher(new TimespecMatcher(expected)); 91960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal} 92960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal 93ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal} // namespace 94ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal 95a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawalTEST_F(OsTest, GetControlSocketReturnsFdAndZeroOnSuccess) { 96a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawal constexpr char kSocketName[] = "fake-daemon"; 97a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawal constexpr int kFakeValidFd = 100; 98a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawal EXPECT_CALL(*raw_os_, GetControlSocket(StrEq(kSocketName))) 99a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawal .WillOnce(Return(kFakeValidFd)); 100a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawal 101a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawal constexpr std::tuple<int, Os::Errno> kExpectedResult{kFakeValidFd, 0}; 102a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawal EXPECT_EQ(kExpectedResult, os_->GetControlSocket(kSocketName)); 103a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawal} 104a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawal 105a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawalTEST_F(OsTest, GetControlSocketReturnsInvalidFdAndErrorOnFailure) { 106a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawal constexpr char kSocketName[] = "fake-daemon"; 107a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawal constexpr Os::Errno kError = EINVAL; 108a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawal EXPECT_CALL(*raw_os_, GetControlSocket(StrEq(kSocketName))) 109a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawal .WillOnce(SetErrnoAndReturn(kError, -1)); 110a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawal 111a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawal constexpr std::tuple<int, Os::Errno> kExpectedResult{Os::kInvalidFd, kError}; 112a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawal EXPECT_EQ(kExpectedResult, os_->GetControlSocket(kSocketName)); 113a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawal} 114a5bb08c1cf8a8d1ff097fa7a050d7787e9821c6amukesh agrawal 115ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawalTEST_F(OsTest, GetTimestampSucceeds) { 116ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal constexpr auto kFakeSecs = 1U; 117ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal constexpr auto kFakeNsecs = 2U; 118ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal constexpr struct timespec fake_time { kFakeSecs, kFakeNsecs }; 119ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal EXPECT_CALL(*raw_os_, ClockGettime(_, _)) 120ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal .WillOnce(DoAll(SetArgumentPointee<1>(fake_time), Return(0))); 121ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal 122ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal const Os::Timestamp received = os_->GetTimestamp(CLOCK_REALTIME); 123ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal EXPECT_EQ(kFakeSecs, received.secs); 124ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal EXPECT_EQ(kFakeNsecs, received.nsecs); 125ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal} 126ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal 127960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawalTEST_F(OsTest, NanosleepPassesNormalValueToSyscall) { 128960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal constexpr auto kSleepTimeNsec = 100; 129960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal EXPECT_CALL(*raw_os_, 130960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal Nanosleep(Pointee(EqualsTimespec({0, kSleepTimeNsec})), _)); 131960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal os_->Nanosleep(kSleepTimeNsec); 132960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal} 133960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal 134960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawalTEST_F(OsTest, NanosleepPassesMaxmimalValueToSyscall) { 135960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal EXPECT_CALL(*raw_os_, 136960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal Nanosleep(Pointee(EqualsTimespec({0, Os::kMaxNanos})), _)); 137960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal os_->Nanosleep(Os::kMaxNanos); 138960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal} 139960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal 140960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawalTEST_F(OsTest, NanosleepPassesZeroValueToSyscall) { 141960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal EXPECT_CALL(*raw_os_, Nanosleep(Pointee(EqualsTimespec({0, 0})), _)); 142960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal os_->Nanosleep(0); 143960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal} 144960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal 145960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawalTEST_F(OsTest, NanosleepClampsOverlyLargeValue) { 146960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal EXPECT_CALL(*raw_os_, 147960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal Nanosleep(Pointee(EqualsTimespec({0, Os::kMaxNanos})), _)); 148960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal os_->Nanosleep(Os::kMaxNanos + 1); 149960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal} 150960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal 151960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawalTEST_F(OsTest, NanosleepRetriesOnInterruptedCall) { 152960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal InSequence seq; 153960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal EXPECT_CALL(*raw_os_, Nanosleep(_, NotNull())) 154960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal .WillOnce(Invoke([](const timespec* /* desired */, timespec* remaining) { 155960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal *remaining = {0, 100}; 156960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal errno = EINTR; 157960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal return -1; 158960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal })); 159960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal EXPECT_CALL(*raw_os_, Nanosleep(Pointee(EqualsTimespec({0, 100})), _)); 160960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal os_->Nanosleep(Os::kMaxNanos); 161960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal} 162960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal 163960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawalTEST_F(OsTest, NanosleepRetriesMultipleTimesIfNecessary) { 164960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal InSequence seq; 165960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal EXPECT_CALL(*raw_os_, Nanosleep(_, NotNull())) 166960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal .WillOnce(Invoke([](const timespec* /* desired */, timespec* remaining) { 167960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal *remaining = {0, 100}; 168960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal errno = EINTR; 169960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal return -1; 170960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal })); 171960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal EXPECT_CALL(*raw_os_, Nanosleep(_, NotNull())) 172960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal .WillOnce(Invoke([](const timespec* /* desired */, timespec* remaining) { 173960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal *remaining = {0, 50}; 174960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal errno = EINTR; 175960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal return -1; 176960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal })); 177960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal EXPECT_CALL(*raw_os_, Nanosleep(Pointee(EqualsTimespec({0, 50})), _)); 178960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal os_->Nanosleep(Os::kMaxNanos); 179960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal} 180960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal 181960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawalTEST_F(OsTest, NanosleepIgnoresEintrWithZeroTimeRemaining) { 182960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal InSequence seq; 183960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal EXPECT_CALL(*raw_os_, Nanosleep(_, NotNull())) 184960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal .WillOnce(Invoke([](const timespec* /* desired */, timespec* remaining) { 185960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal *remaining = {0, 0}; 186960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal errno = EINTR; 187960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal return -1; 188960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal })); 189960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal EXPECT_CALL(*raw_os_, Nanosleep(_, _)).Times(0); 190960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal os_->Nanosleep(Os::kMaxNanos); 191960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal} 192960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal 193d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawalTEST_F(OsTest, ReceiveDatagramReturnsCorrectValueForMaxSizedDatagram) { 194d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr int kFakeFd = 100; 195d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal std::array<uint8_t, 8192> buffer{}; 196d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal EXPECT_CALL(*raw_os_, Recv(kFakeFd, buffer.data(), buffer.size(), MSG_TRUNC)) 197d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal .WillOnce(Return(buffer.size())); 198d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal 199d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr std::tuple<size_t, Os::Errno> kExpectedResult{buffer.size(), 0}; 200d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal EXPECT_EQ(kExpectedResult, 201d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal os_->ReceiveDatagram(kFakeFd, buffer.data(), buffer.size())); 202d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal} 203d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal 204d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawalTEST_F(OsTest, ReceieveDatagramReturnsCorrectValueForRegularSizedDatagram) { 205d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr int kFakeFd = 100; 206d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr auto kReadBufferSize = 8192; 207d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr auto kDatagramSize = kReadBufferSize / 2; 208d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal std::array<uint8_t, kReadBufferSize> buffer{}; 209d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal EXPECT_CALL(*raw_os_, Recv(kFakeFd, buffer.data(), buffer.size(), MSG_TRUNC)) 210d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal .WillOnce(Return(kDatagramSize)); 211d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal 212d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr std::tuple<size_t, Os::Errno> kExpectedResult{kDatagramSize, 0}; 213d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal EXPECT_EQ(kExpectedResult, 214d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal os_->ReceiveDatagram(kFakeFd, buffer.data(), buffer.size())); 215d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal} 216d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal 217d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawalTEST_F(OsTest, ReceieveDatagramReturnsCorrectValueForOversizedDatagram) { 218d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr int kFakeFd = 100; 219d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr auto kReadBufferSize = 8192; 220d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr auto kDatagramSize = kReadBufferSize * 2; 221d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal std::array<uint8_t, kReadBufferSize> buffer{}; 222d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal EXPECT_CALL(*raw_os_, Recv(kFakeFd, buffer.data(), buffer.size(), MSG_TRUNC)) 223d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal .WillOnce(Return(kDatagramSize)); 224d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal 225d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr std::tuple<size_t, Os::Errno> kExpectedResult{kDatagramSize, 0}; 226d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal EXPECT_EQ(kExpectedResult, 227d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal os_->ReceiveDatagram(kFakeFd, buffer.data(), buffer.size())); 228d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal} 229d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal 230d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawalTEST_F(OsTest, ReceieveDatagramReturnsCorrectValueForZeroByteDatagram) { 231d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr int kFakeFd = 100; 232d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal std::array<uint8_t, 8192> buffer{}; 233d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal EXPECT_CALL(*raw_os_, Recv(kFakeFd, buffer.data(), buffer.size(), MSG_TRUNC)) 234d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal .WillOnce(Return(0)); 235d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal 236d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr std::tuple<size_t, Os::Errno> kExpectedResult{0, 0}; 237d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal EXPECT_EQ(kExpectedResult, 238d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal os_->ReceiveDatagram(kFakeFd, buffer.data(), buffer.size())); 239d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal} 240d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal 241d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawalTEST_F(OsTest, ReceieveDatagramReturnsCorrectValueOnFailure) { 242d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr int kFakeFd = 100; 243d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr Os::Errno kError = EBADF; 244d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal std::array<uint8_t, 8192> buffer{}; 245d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal EXPECT_CALL(*raw_os_, Recv(kFakeFd, buffer.data(), buffer.size(), MSG_TRUNC)) 246d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal .WillOnce(SetErrnoAndReturn(kError, -1)); 247d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal 248d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr std::tuple<size_t, Os::Errno> kExpectedResult{0, kError}; 249d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal EXPECT_EQ(kExpectedResult, 250d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal os_->ReceiveDatagram(kFakeFd, buffer.data(), buffer.size())); 251d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal} 252d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal 253b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawalTEST_F(OsTest, WriteReturnsCorrectValueForSuccessfulWrite) { 254b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal constexpr int kFakeFd = 100; 255b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal constexpr std::array<uint8_t, 8192> buffer{}; 256b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal EXPECT_CALL(*raw_os_, Write(kFakeFd, buffer.data(), buffer.size())) 257b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal .WillOnce(Return(buffer.size())); 258b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal 259b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal constexpr std::tuple<size_t, Os::Errno> kExpectedResult{buffer.size(), 0}; 260b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal EXPECT_EQ(kExpectedResult, os_->Write(kFakeFd, buffer.data(), buffer.size())); 261b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal} 262b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal 263b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawalTEST_F(OsTest, WriteReturnsCorrectValueForTruncatedWrite) { 264b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal constexpr int kFakeFd = 100; 265b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal constexpr int kBytesWritten = 4096; 266b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal constexpr std::array<uint8_t, 8192> buffer{}; 267b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal EXPECT_CALL(*raw_os_, Write(kFakeFd, buffer.data(), buffer.size())) 268b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal .WillOnce(Return(kBytesWritten)); 269b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal 270b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal constexpr std::tuple<size_t, Os::Errno> kExpectedResult{kBytesWritten, 0}; 271b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal EXPECT_EQ(kExpectedResult, os_->Write(kFakeFd, buffer.data(), buffer.size())); 272b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal} 273b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal 274d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawalTEST_F(OsTest, WriteReturnsCorrectValueForSuccessfulZeroByteWrite) { 275d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr int kFakeFd = 100; 276d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr std::array<uint8_t, 0> buffer{}; 277d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal EXPECT_CALL(*raw_os_, Write(kFakeFd, buffer.data(), 0)).WillOnce(Return(0)); 278d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal 279d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr std::tuple<size_t, Os::Errno> kExpectedResult{0, 0}; 280d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal EXPECT_EQ(kExpectedResult, os_->Write(kFakeFd, buffer.data(), buffer.size())); 281d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal} 282d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal 283b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawalTEST_F(OsTest, WriteReturnsCorrectValueForFailedWrite) { 284b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal constexpr int kFakeFd = 100; 285d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr Os::Errno kError = EBADF; 286b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal constexpr std::array<uint8_t, 8192> buffer{}; 287b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal EXPECT_CALL(*raw_os_, Write(kFakeFd, buffer.data(), buffer.size())) 288b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal .WillOnce(SetErrnoAndReturn(kError, -1)); 289b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal 290b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal constexpr std::tuple<size_t, Os::Errno> kExpectedResult{0, kError}; 291b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal EXPECT_EQ(kExpectedResult, os_->Write(kFakeFd, buffer.data(), buffer.size())); 292b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal} 293b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal 294d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawalTEST_F(OsTest, WriteReturnsCorrectValueForFailedZeroByteWrite) { 295d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr int kFakeFd = 100; 296d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr Os::Errno kError = EBADF; 297d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr std::array<uint8_t, 0> buffer{}; 298d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal EXPECT_CALL(*raw_os_, Write(kFakeFd, buffer.data(), 0)) 299d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal .WillOnce(SetErrnoAndReturn(kError, -1)); 300d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal 301d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr std::tuple<size_t, Os::Errno> kExpectedResult{0, kError}; 302d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal EXPECT_EQ(kExpectedResult, os_->Write(kFakeFd, buffer.data(), buffer.size())); 303d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal} 304d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal 305ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal// Per 3067e979c369670feea99b9aff42bc366a903cf7049mukesh agrawal// github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md#death-tests, 307ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal// death tests should be specially named. 308ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawalusing OsDeathTest = OsTest; 309ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal 310ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawalTEST_F(OsDeathTest, GetTimestampOverlyLargeNsecsCausesDeath) { 311ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal constexpr auto kFakeSecs = 1U; 312ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal constexpr auto kFakeNsecs = 1000 * 1000 * 1000; 313ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal constexpr struct timespec fake_time { kFakeSecs, kFakeNsecs }; 314ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal ON_CALL(*raw_os_, ClockGettime(_, _)) 315ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal .WillByDefault(DoAll(SetArgumentPointee<1>(fake_time), Return(0))); 316ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal EXPECT_DEATH(os_->GetTimestamp(CLOCK_REALTIME), "Check failed"); 317ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal} 318ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal 319ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawalTEST_F(OsDeathTest, GetTimestampRawOsErrorCausesDeath) { 320ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal ON_CALL(*raw_os_, ClockGettime(_, _)).WillByDefault(Return(-1)); 321ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal EXPECT_DEATH(os_->GetTimestamp(CLOCK_REALTIME), "Unexpected error"); 322ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal} 323ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal 324960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawalTEST_F(OsDeathTest, NanosleepUnexpectedErrorCausesDeath) { 325960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal ON_CALL(*raw_os_, Nanosleep(Pointee(EqualsTimespec({0, Os::kMaxNanos})), _)) 326960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal .WillByDefault(SetErrnoAndReturn(EFAULT, -1)); 327960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal EXPECT_DEATH(os_->Nanosleep(Os::kMaxNanos), "Unexpected error"); 328960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal} 329960c8a88c83c55c21a3286628591a41d2fb42231mukesh agrawal 330d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawalTEST_F(OsDeathTest, ReceiveDatagramWithOverlyLargeBufferCausesDeath) { 331d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal constexpr int kFakeFd = 100; 332d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal std::array<uint8_t, 8192> buffer{}; 333d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal EXPECT_DEATH( 334d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal os_->ReceiveDatagram(kFakeFd, buffer.data(), GetMaxVal<size_t>()), 335d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal "Check failed"); 336d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal} 337d75fd9e9b73995a6303ae99977ab1baf9db9b42fmukesh agrawal 338b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawalTEST_F(OsDeathTest, WriteWithOverlyLargeBufferCausesDeath) { 339b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal constexpr int kFakeFd = 100; 340b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal constexpr std::array<uint8_t, 8192> buffer{}; 341b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal EXPECT_DEATH(os_->Write(kFakeFd, buffer.data(), GetMaxVal<size_t>()), 342b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal "Check failed"); 343b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal} 344b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal 345b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawalTEST_F(OsDeathTest, WriteWithOverrunCausesDeath) { 346b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal constexpr int kFakeFd = 100; 347b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal constexpr std::array<uint8_t, 8192> buffer{}; 348b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal ON_CALL(*raw_os_, Write(kFakeFd, buffer.data(), buffer.size())) 349b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal .WillByDefault(Return(buffer.size() + 1)); 350b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal EXPECT_DEATH(os_->Write(kFakeFd, buffer.data(), buffer.size()), 351b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal "Check failed"); 352b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal} 353b8f8f6ab38fe147fa7aed5cdd9f9ce0e5a3a2e2fmukesh agrawal 354ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal} // namespace wifilogd 355ec533e0f59b7e88bac734d538f596ab095bc74camukesh agrawal} // namespace android 356