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