1*8542734aSAndroid Build Coastguard Worker /*
2*8542734aSAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project
3*8542734aSAndroid Build Coastguard Worker *
4*8542734aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*8542734aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*8542734aSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*8542734aSAndroid Build Coastguard Worker *
8*8542734aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*8542734aSAndroid Build Coastguard Worker *
10*8542734aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*8542734aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*8542734aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8542734aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*8542734aSAndroid Build Coastguard Worker * limitations under the License.
15*8542734aSAndroid Build Coastguard Worker */
16*8542734aSAndroid Build Coastguard Worker
17*8542734aSAndroid Build Coastguard Worker #include <linux/netfilter/nfnetlink_log.h>
18*8542734aSAndroid Build Coastguard Worker
19*8542734aSAndroid Build Coastguard Worker #include <arpa/inet.h>
20*8542734aSAndroid Build Coastguard Worker #include <sys/socket.h>
21*8542734aSAndroid Build Coastguard Worker #include <netinet/in.h>
22*8542734aSAndroid Build Coastguard Worker #include <netinet/ip.h>
23*8542734aSAndroid Build Coastguard Worker #include <netinet/tcp.h>
24*8542734aSAndroid Build Coastguard Worker
25*8542734aSAndroid Build Coastguard Worker #include <gmock/gmock.h>
26*8542734aSAndroid Build Coastguard Worker #include <gtest/gtest.h>
27*8542734aSAndroid Build Coastguard Worker
28*8542734aSAndroid Build Coastguard Worker #include "NetlinkManager.h"
29*8542734aSAndroid Build Coastguard Worker #include "WakeupController.h"
30*8542734aSAndroid Build Coastguard Worker
31*8542734aSAndroid Build Coastguard Worker using ::testing::StrictMock;
32*8542734aSAndroid Build Coastguard Worker using ::testing::Test;
33*8542734aSAndroid Build Coastguard Worker using ::testing::DoAll;
34*8542734aSAndroid Build Coastguard Worker using ::testing::SaveArg;
35*8542734aSAndroid Build Coastguard Worker using ::testing::Return;
36*8542734aSAndroid Build Coastguard Worker using ::testing::_;
37*8542734aSAndroid Build Coastguard Worker
38*8542734aSAndroid Build Coastguard Worker namespace android {
39*8542734aSAndroid Build Coastguard Worker namespace net {
40*8542734aSAndroid Build Coastguard Worker
41*8542734aSAndroid Build Coastguard Worker const uint32_t kDefaultPacketCopyRange = WakeupController::kDefaultPacketCopyRange;
42*8542734aSAndroid Build Coastguard Worker
43*8542734aSAndroid Build Coastguard Worker using netdutils::status::ok;
44*8542734aSAndroid Build Coastguard Worker
45*8542734aSAndroid Build Coastguard Worker class MockNetdEventListener {
46*8542734aSAndroid Build Coastguard Worker public:
47*8542734aSAndroid Build Coastguard Worker MOCK_METHOD10(onWakeupEvent,
48*8542734aSAndroid Build Coastguard Worker void(const std::string& prefix, int uid, int ether, int ipNextHeader,
49*8542734aSAndroid Build Coastguard Worker const std::vector<uint8_t>& dstHw, const std::string& srcIp,
50*8542734aSAndroid Build Coastguard Worker const std::string& dstIp, int srcPort, int dstPort, uint64_t timestampNs));
51*8542734aSAndroid Build Coastguard Worker };
52*8542734aSAndroid Build Coastguard Worker
53*8542734aSAndroid Build Coastguard Worker class MockIptablesRestore : public IptablesRestoreInterface {
54*8542734aSAndroid Build Coastguard Worker public:
55*8542734aSAndroid Build Coastguard Worker ~MockIptablesRestore() override = default;
56*8542734aSAndroid Build Coastguard Worker MOCK_METHOD3(execute, int(const IptablesTarget target, const std::string& commands,
57*8542734aSAndroid Build Coastguard Worker std::string* output));
58*8542734aSAndroid Build Coastguard Worker };
59*8542734aSAndroid Build Coastguard Worker
60*8542734aSAndroid Build Coastguard Worker class MockNFLogListener : public NFLogListenerInterface {
61*8542734aSAndroid Build Coastguard Worker public:
62*8542734aSAndroid Build Coastguard Worker ~MockNFLogListener() override = default;
63*8542734aSAndroid Build Coastguard Worker MOCK_METHOD2(subscribe, netdutils::Status(uint16_t nfLogGroup, const DispatchFn& fn));
64*8542734aSAndroid Build Coastguard Worker MOCK_METHOD3(subscribe,
65*8542734aSAndroid Build Coastguard Worker netdutils::Status(uint16_t nfLogGroup, uint32_t copyRange, const DispatchFn& fn));
66*8542734aSAndroid Build Coastguard Worker MOCK_METHOD1(unsubscribe, netdutils::Status(uint16_t nfLogGroup));
67*8542734aSAndroid Build Coastguard Worker };
68*8542734aSAndroid Build Coastguard Worker
69*8542734aSAndroid Build Coastguard Worker class WakeupControllerTest : public Test {
70*8542734aSAndroid Build Coastguard Worker protected:
WakeupControllerTest()71*8542734aSAndroid Build Coastguard Worker WakeupControllerTest() {
72*8542734aSAndroid Build Coastguard Worker EXPECT_CALL(mListener,
73*8542734aSAndroid Build Coastguard Worker subscribe(NetlinkManager::NFLOG_WAKEUP_GROUP, kDefaultPacketCopyRange, _))
74*8542734aSAndroid Build Coastguard Worker .WillOnce(DoAll(SaveArg<2>(&mMessageHandler), Return(ok)));
75*8542734aSAndroid Build Coastguard Worker EXPECT_CALL(mListener,
76*8542734aSAndroid Build Coastguard Worker unsubscribe(NetlinkManager::NFLOG_WAKEUP_GROUP)).WillOnce(Return(ok));
77*8542734aSAndroid Build Coastguard Worker EXPECT_OK(mController.init(&mListener));
78*8542734aSAndroid Build Coastguard Worker }
79*8542734aSAndroid Build Coastguard Worker
80*8542734aSAndroid Build Coastguard Worker StrictMock<MockNetdEventListener> mEventListener;
81*8542734aSAndroid Build Coastguard Worker StrictMock<MockIptablesRestore> mIptables;
82*8542734aSAndroid Build Coastguard Worker StrictMock<MockNFLogListener> mListener;
83*8542734aSAndroid Build Coastguard Worker WakeupController mController{
__anon19d47e2b0102() 84*8542734aSAndroid Build Coastguard Worker [this](const WakeupController::ReportArgs& args) {
85*8542734aSAndroid Build Coastguard Worker mEventListener.onWakeupEvent(args.prefix, args.uid, args.ethertype, args.ipNextHeader,
86*8542734aSAndroid Build Coastguard Worker args.dstHw, args.srcIp, args.dstIp, args.srcPort,
87*8542734aSAndroid Build Coastguard Worker args.dstPort, args.timestampNs);
88*8542734aSAndroid Build Coastguard Worker },
89*8542734aSAndroid Build Coastguard Worker &mIptables};
90*8542734aSAndroid Build Coastguard Worker NFLogListenerInterface::DispatchFn mMessageHandler;
91*8542734aSAndroid Build Coastguard Worker };
92*8542734aSAndroid Build Coastguard Worker
TEST_F(WakeupControllerTest,msgHandlerWithPartialAttributes)93*8542734aSAndroid Build Coastguard Worker TEST_F(WakeupControllerTest, msgHandlerWithPartialAttributes) {
94*8542734aSAndroid Build Coastguard Worker const char kPrefix[] = "test:prefix";
95*8542734aSAndroid Build Coastguard Worker const uid_t kUid = 8734;
96*8542734aSAndroid Build Coastguard Worker const gid_t kGid = 2222;
97*8542734aSAndroid Build Coastguard Worker const uint64_t kNsPerS = 1000000000ULL;
98*8542734aSAndroid Build Coastguard Worker const uint64_t kTsNs = 9999 + (34 * kNsPerS);
99*8542734aSAndroid Build Coastguard Worker
100*8542734aSAndroid Build Coastguard Worker struct Msg {
101*8542734aSAndroid Build Coastguard Worker nlmsghdr nlmsg;
102*8542734aSAndroid Build Coastguard Worker nfgenmsg nfmsg;
103*8542734aSAndroid Build Coastguard Worker nlattr uidAttr;
104*8542734aSAndroid Build Coastguard Worker uid_t uid;
105*8542734aSAndroid Build Coastguard Worker nlattr gidAttr;
106*8542734aSAndroid Build Coastguard Worker gid_t gid;
107*8542734aSAndroid Build Coastguard Worker nlattr tsAttr;
108*8542734aSAndroid Build Coastguard Worker timespec ts;
109*8542734aSAndroid Build Coastguard Worker nlattr prefixAttr;
110*8542734aSAndroid Build Coastguard Worker char prefix[sizeof(kPrefix)];
111*8542734aSAndroid Build Coastguard Worker } msg = {};
112*8542734aSAndroid Build Coastguard Worker
113*8542734aSAndroid Build Coastguard Worker msg.uidAttr.nla_type = NFULA_UID;
114*8542734aSAndroid Build Coastguard Worker msg.uidAttr.nla_len = sizeof(msg.uidAttr) + sizeof(msg.uid);
115*8542734aSAndroid Build Coastguard Worker msg.uid = htonl(kUid);
116*8542734aSAndroid Build Coastguard Worker
117*8542734aSAndroid Build Coastguard Worker msg.gidAttr.nla_type = NFULA_GID;
118*8542734aSAndroid Build Coastguard Worker msg.gidAttr.nla_len = sizeof(msg.gidAttr) + sizeof(msg.gid);
119*8542734aSAndroid Build Coastguard Worker msg.gid = htonl(kGid);
120*8542734aSAndroid Build Coastguard Worker
121*8542734aSAndroid Build Coastguard Worker msg.tsAttr.nla_type = NFULA_TIMESTAMP;
122*8542734aSAndroid Build Coastguard Worker msg.tsAttr.nla_len = sizeof(msg.tsAttr) + sizeof(msg.ts);
123*8542734aSAndroid Build Coastguard Worker msg.ts.tv_sec = htonl(kTsNs / kNsPerS);
124*8542734aSAndroid Build Coastguard Worker msg.ts.tv_nsec = htonl(kTsNs % kNsPerS);
125*8542734aSAndroid Build Coastguard Worker
126*8542734aSAndroid Build Coastguard Worker msg.prefixAttr.nla_type = NFULA_PREFIX;
127*8542734aSAndroid Build Coastguard Worker msg.prefixAttr.nla_len = sizeof(msg.prefixAttr) + sizeof(msg.prefix);
128*8542734aSAndroid Build Coastguard Worker memcpy(msg.prefix, kPrefix, sizeof(kPrefix));
129*8542734aSAndroid Build Coastguard Worker
130*8542734aSAndroid Build Coastguard Worker auto payload = drop(netdutils::makeSlice(msg), offsetof(Msg, uidAttr));
131*8542734aSAndroid Build Coastguard Worker EXPECT_CALL(mEventListener,
132*8542734aSAndroid Build Coastguard Worker onWakeupEvent(kPrefix, kUid, -1, -1, std::vector<uint8_t>(), "", "", -1, -1, kTsNs));
133*8542734aSAndroid Build Coastguard Worker mMessageHandler(msg.nlmsg, msg.nfmsg, payload);
134*8542734aSAndroid Build Coastguard Worker }
135*8542734aSAndroid Build Coastguard Worker
TEST_F(WakeupControllerTest,msgHandler)136*8542734aSAndroid Build Coastguard Worker TEST_F(WakeupControllerTest, msgHandler) {
137*8542734aSAndroid Build Coastguard Worker const char kPrefix[] = "test:prefix";
138*8542734aSAndroid Build Coastguard Worker const uid_t kUid = 8734;
139*8542734aSAndroid Build Coastguard Worker const gid_t kGid = 2222;
140*8542734aSAndroid Build Coastguard Worker const std::vector<uint8_t> kMacAddr = {11, 22, 33, 44, 55, 66};
141*8542734aSAndroid Build Coastguard Worker const char* kSrcIpAddr = "192.168.2.1";
142*8542734aSAndroid Build Coastguard Worker const char* kDstIpAddr = "192.168.2.23";
143*8542734aSAndroid Build Coastguard Worker const uint16_t kEthertype = 0x800;
144*8542734aSAndroid Build Coastguard Worker const uint8_t kIpNextHeader = 6;
145*8542734aSAndroid Build Coastguard Worker const uint16_t kSrcPort = 1238;
146*8542734aSAndroid Build Coastguard Worker const uint16_t kDstPort = 4567;
147*8542734aSAndroid Build Coastguard Worker const uint64_t kNsPerS = 1000000000ULL;
148*8542734aSAndroid Build Coastguard Worker const uint64_t kTsNs = 9999 + (34 * kNsPerS);
149*8542734aSAndroid Build Coastguard Worker
150*8542734aSAndroid Build Coastguard Worker struct Msg {
151*8542734aSAndroid Build Coastguard Worker nlmsghdr nlmsg;
152*8542734aSAndroid Build Coastguard Worker nfgenmsg nfmsg;
153*8542734aSAndroid Build Coastguard Worker nlattr uidAttr;
154*8542734aSAndroid Build Coastguard Worker uid_t uid;
155*8542734aSAndroid Build Coastguard Worker nlattr gidAttr;
156*8542734aSAndroid Build Coastguard Worker gid_t gid;
157*8542734aSAndroid Build Coastguard Worker nlattr tsAttr;
158*8542734aSAndroid Build Coastguard Worker timespec ts;
159*8542734aSAndroid Build Coastguard Worker nlattr prefixAttr;
160*8542734aSAndroid Build Coastguard Worker char prefix[sizeof(kPrefix)];
161*8542734aSAndroid Build Coastguard Worker nlattr packetHeaderAttr;
162*8542734aSAndroid Build Coastguard Worker struct nfulnl_msg_packet_hdr packetHeader;
163*8542734aSAndroid Build Coastguard Worker nlattr hardwareAddrAttr;
164*8542734aSAndroid Build Coastguard Worker struct nfulnl_msg_packet_hw hardwareAddr;
165*8542734aSAndroid Build Coastguard Worker nlattr packetPayloadAttr;
166*8542734aSAndroid Build Coastguard Worker struct iphdr ipHeader;
167*8542734aSAndroid Build Coastguard Worker struct tcphdr tcpHeader;
168*8542734aSAndroid Build Coastguard Worker } msg = {};
169*8542734aSAndroid Build Coastguard Worker
170*8542734aSAndroid Build Coastguard Worker msg.prefixAttr.nla_type = NFULA_PREFIX;
171*8542734aSAndroid Build Coastguard Worker msg.prefixAttr.nla_len = sizeof(msg.prefixAttr) + sizeof(msg.prefix);
172*8542734aSAndroid Build Coastguard Worker memcpy(msg.prefix, kPrefix, sizeof(kPrefix));
173*8542734aSAndroid Build Coastguard Worker
174*8542734aSAndroid Build Coastguard Worker msg.uidAttr.nla_type = NFULA_UID;
175*8542734aSAndroid Build Coastguard Worker msg.uidAttr.nla_len = sizeof(msg.uidAttr) + sizeof(msg.uid);
176*8542734aSAndroid Build Coastguard Worker msg.uid = htonl(kUid);
177*8542734aSAndroid Build Coastguard Worker
178*8542734aSAndroid Build Coastguard Worker msg.gidAttr.nla_type = NFULA_GID;
179*8542734aSAndroid Build Coastguard Worker msg.gidAttr.nla_len = sizeof(msg.gidAttr) + sizeof(msg.gid);
180*8542734aSAndroid Build Coastguard Worker msg.gid = htonl(kGid);
181*8542734aSAndroid Build Coastguard Worker
182*8542734aSAndroid Build Coastguard Worker msg.tsAttr.nla_type = NFULA_TIMESTAMP;
183*8542734aSAndroid Build Coastguard Worker msg.tsAttr.nla_len = sizeof(msg.tsAttr) + sizeof(msg.ts);
184*8542734aSAndroid Build Coastguard Worker msg.ts.tv_sec = htonl(kTsNs / kNsPerS);
185*8542734aSAndroid Build Coastguard Worker msg.ts.tv_nsec = htonl(kTsNs % kNsPerS);
186*8542734aSAndroid Build Coastguard Worker
187*8542734aSAndroid Build Coastguard Worker msg.packetHeaderAttr.nla_type = NFULA_PACKET_HDR;
188*8542734aSAndroid Build Coastguard Worker msg.packetHeaderAttr.nla_len = sizeof(msg.packetHeaderAttr) + sizeof(msg.packetHeader);
189*8542734aSAndroid Build Coastguard Worker msg.packetHeader.hw_protocol = htons(kEthertype);
190*8542734aSAndroid Build Coastguard Worker
191*8542734aSAndroid Build Coastguard Worker msg.hardwareAddrAttr.nla_type = NFULA_HWADDR;
192*8542734aSAndroid Build Coastguard Worker msg.hardwareAddrAttr.nla_len = sizeof(msg.hardwareAddrAttr) + sizeof(msg.hardwareAddr);
193*8542734aSAndroid Build Coastguard Worker msg.hardwareAddr.hw_addrlen = htons(kMacAddr.size());
194*8542734aSAndroid Build Coastguard Worker std::copy(kMacAddr.begin(), kMacAddr.end(), msg.hardwareAddr.hw_addr);
195*8542734aSAndroid Build Coastguard Worker
196*8542734aSAndroid Build Coastguard Worker msg.packetPayloadAttr.nla_type = NFULA_PAYLOAD;
197*8542734aSAndroid Build Coastguard Worker msg.packetPayloadAttr.nla_len =
198*8542734aSAndroid Build Coastguard Worker sizeof(msg.packetPayloadAttr) + sizeof(msg.ipHeader) + sizeof(msg.tcpHeader);
199*8542734aSAndroid Build Coastguard Worker msg.ipHeader.protocol = IPPROTO_TCP;
200*8542734aSAndroid Build Coastguard Worker msg.ipHeader.ihl = sizeof(msg.ipHeader) / 4; // ipv4 IHL counts 32 bit words.
201*8542734aSAndroid Build Coastguard Worker inet_pton(AF_INET, kSrcIpAddr, &msg.ipHeader.saddr);
202*8542734aSAndroid Build Coastguard Worker inet_pton(AF_INET, kDstIpAddr, &msg.ipHeader.daddr);
203*8542734aSAndroid Build Coastguard Worker msg.tcpHeader.th_sport = htons(kSrcPort);
204*8542734aSAndroid Build Coastguard Worker msg.tcpHeader.th_dport = htons(kDstPort);
205*8542734aSAndroid Build Coastguard Worker
206*8542734aSAndroid Build Coastguard Worker auto payload = drop(netdutils::makeSlice(msg), offsetof(Msg, uidAttr));
207*8542734aSAndroid Build Coastguard Worker EXPECT_CALL(mEventListener, onWakeupEvent(kPrefix, kUid, kEthertype, kIpNextHeader, kMacAddr,
208*8542734aSAndroid Build Coastguard Worker kSrcIpAddr, kDstIpAddr, kSrcPort, kDstPort, kTsNs));
209*8542734aSAndroid Build Coastguard Worker mMessageHandler(msg.nlmsg, msg.nfmsg, payload);
210*8542734aSAndroid Build Coastguard Worker }
211*8542734aSAndroid Build Coastguard Worker
TEST_F(WakeupControllerTest,badAttr)212*8542734aSAndroid Build Coastguard Worker TEST_F(WakeupControllerTest, badAttr) {
213*8542734aSAndroid Build Coastguard Worker const char kPrefix[] = "test:prefix";
214*8542734aSAndroid Build Coastguard Worker const uid_t kUid = 8734;
215*8542734aSAndroid Build Coastguard Worker const gid_t kGid = 2222;
216*8542734aSAndroid Build Coastguard Worker const uint64_t kNsPerS = 1000000000ULL;
217*8542734aSAndroid Build Coastguard Worker const uint64_t kTsNs = 9999 + (34 * kNsPerS);
218*8542734aSAndroid Build Coastguard Worker
219*8542734aSAndroid Build Coastguard Worker struct Msg {
220*8542734aSAndroid Build Coastguard Worker nlmsghdr nlmsg;
221*8542734aSAndroid Build Coastguard Worker nfgenmsg nfmsg;
222*8542734aSAndroid Build Coastguard Worker nlattr uidAttr;
223*8542734aSAndroid Build Coastguard Worker uid_t uid;
224*8542734aSAndroid Build Coastguard Worker nlattr invalid0;
225*8542734aSAndroid Build Coastguard Worker nlattr invalid1;
226*8542734aSAndroid Build Coastguard Worker nlattr gidAttr;
227*8542734aSAndroid Build Coastguard Worker gid_t gid;
228*8542734aSAndroid Build Coastguard Worker nlattr tsAttr;
229*8542734aSAndroid Build Coastguard Worker timespec ts;
230*8542734aSAndroid Build Coastguard Worker nlattr prefixAttr;
231*8542734aSAndroid Build Coastguard Worker char prefix[sizeof(kPrefix)];
232*8542734aSAndroid Build Coastguard Worker } msg = {};
233*8542734aSAndroid Build Coastguard Worker
234*8542734aSAndroid Build Coastguard Worker msg.uidAttr.nla_type = 999;
235*8542734aSAndroid Build Coastguard Worker msg.uidAttr.nla_len = sizeof(msg.uidAttr) + sizeof(msg.uid);
236*8542734aSAndroid Build Coastguard Worker msg.uid = htonl(kUid);
237*8542734aSAndroid Build Coastguard Worker
238*8542734aSAndroid Build Coastguard Worker msg.invalid0.nla_type = 0;
239*8542734aSAndroid Build Coastguard Worker msg.invalid0.nla_len = 0;
240*8542734aSAndroid Build Coastguard Worker msg.invalid1.nla_type = 0;
241*8542734aSAndroid Build Coastguard Worker msg.invalid1.nla_len = 1;
242*8542734aSAndroid Build Coastguard Worker
243*8542734aSAndroid Build Coastguard Worker msg.gidAttr.nla_type = NFULA_GID;
244*8542734aSAndroid Build Coastguard Worker msg.gidAttr.nla_len = sizeof(msg.gidAttr) + sizeof(msg.gid);
245*8542734aSAndroid Build Coastguard Worker msg.gid = htonl(kGid);
246*8542734aSAndroid Build Coastguard Worker
247*8542734aSAndroid Build Coastguard Worker msg.tsAttr.nla_type = NFULA_TIMESTAMP;
248*8542734aSAndroid Build Coastguard Worker msg.tsAttr.nla_len = sizeof(msg.tsAttr) - 2;
249*8542734aSAndroid Build Coastguard Worker msg.ts.tv_sec = htonl(kTsNs / kNsPerS);
250*8542734aSAndroid Build Coastguard Worker msg.ts.tv_nsec = htonl(kTsNs % kNsPerS);
251*8542734aSAndroid Build Coastguard Worker
252*8542734aSAndroid Build Coastguard Worker msg.prefixAttr.nla_type = NFULA_UID;
253*8542734aSAndroid Build Coastguard Worker msg.prefixAttr.nla_len = sizeof(msg.prefixAttr) + sizeof(msg.prefix);
254*8542734aSAndroid Build Coastguard Worker memcpy(msg.prefix, kPrefix, sizeof(kPrefix));
255*8542734aSAndroid Build Coastguard Worker
256*8542734aSAndroid Build Coastguard Worker auto payload = drop(netdutils::makeSlice(msg), offsetof(Msg, uidAttr));
257*8542734aSAndroid Build Coastguard Worker EXPECT_CALL(mEventListener,
258*8542734aSAndroid Build Coastguard Worker onWakeupEvent("", 1952805748, -1, -1, std::vector<uint8_t>(), "", "", -1, -1, 0));
259*8542734aSAndroid Build Coastguard Worker mMessageHandler(msg.nlmsg, msg.nfmsg, payload);
260*8542734aSAndroid Build Coastguard Worker }
261*8542734aSAndroid Build Coastguard Worker
TEST_F(WakeupControllerTest,unterminatedString)262*8542734aSAndroid Build Coastguard Worker TEST_F(WakeupControllerTest, unterminatedString) {
263*8542734aSAndroid Build Coastguard Worker char ones[20] = {};
264*8542734aSAndroid Build Coastguard Worker memset(ones, 1, sizeof(ones));
265*8542734aSAndroid Build Coastguard Worker
266*8542734aSAndroid Build Coastguard Worker struct Msg {
267*8542734aSAndroid Build Coastguard Worker nlmsghdr nlmsg;
268*8542734aSAndroid Build Coastguard Worker nfgenmsg nfmsg;
269*8542734aSAndroid Build Coastguard Worker nlattr prefixAttr;
270*8542734aSAndroid Build Coastguard Worker char prefix[sizeof(ones)];
271*8542734aSAndroid Build Coastguard Worker } msg = {};
272*8542734aSAndroid Build Coastguard Worker
273*8542734aSAndroid Build Coastguard Worker msg.prefixAttr.nla_type = NFULA_PREFIX;
274*8542734aSAndroid Build Coastguard Worker msg.prefixAttr.nla_len = sizeof(msg.prefixAttr) + sizeof(msg.prefix);
275*8542734aSAndroid Build Coastguard Worker memcpy(msg.prefix, ones, sizeof(ones));
276*8542734aSAndroid Build Coastguard Worker
277*8542734aSAndroid Build Coastguard Worker const auto expected = std::string(ones, sizeof(ones) - 1);
278*8542734aSAndroid Build Coastguard Worker auto payload = drop(netdutils::makeSlice(msg), offsetof(Msg, prefixAttr));
279*8542734aSAndroid Build Coastguard Worker EXPECT_CALL(mEventListener,
280*8542734aSAndroid Build Coastguard Worker onWakeupEvent(expected, -1, -1, -1, std::vector<uint8_t>(), "", "", -1, -1, 0));
281*8542734aSAndroid Build Coastguard Worker mMessageHandler(msg.nlmsg, msg.nfmsg, payload);
282*8542734aSAndroid Build Coastguard Worker }
283*8542734aSAndroid Build Coastguard Worker
TEST_F(WakeupControllerTest,addInterface)284*8542734aSAndroid Build Coastguard Worker TEST_F(WakeupControllerTest, addInterface) {
285*8542734aSAndroid Build Coastguard Worker const char kPrefix[] = "test:prefix";
286*8542734aSAndroid Build Coastguard Worker const char kIfName[] = "wlan8";
287*8542734aSAndroid Build Coastguard Worker const uint32_t kMark = 0x12345678;
288*8542734aSAndroid Build Coastguard Worker const uint32_t kMask = 0x0F0F0F0F;
289*8542734aSAndroid Build Coastguard Worker const char kExpected[] =
290*8542734aSAndroid Build Coastguard Worker "*mangle\n"
291*8542734aSAndroid Build Coastguard Worker "-A wakeupctrl_mangle_INPUT -i test:prefix"
292*8542734aSAndroid Build Coastguard Worker " -m mark --mark 0x12345678/0x0f0f0f0f -m limit --limit 10/s"
293*8542734aSAndroid Build Coastguard Worker " -j NFLOG --nflog-prefix wlan8 --nflog-group 3 --nflog-threshold 8\n"
294*8542734aSAndroid Build Coastguard Worker "COMMIT\n";
295*8542734aSAndroid Build Coastguard Worker EXPECT_CALL(mIptables, execute(V4V6, kExpected, _)).WillOnce(Return(0));
296*8542734aSAndroid Build Coastguard Worker EXPECT_OK(mController.addInterface(kPrefix, kIfName, kMark, kMask));
297*8542734aSAndroid Build Coastguard Worker }
298*8542734aSAndroid Build Coastguard Worker
TEST_F(WakeupControllerTest,delInterface)299*8542734aSAndroid Build Coastguard Worker TEST_F(WakeupControllerTest, delInterface) {
300*8542734aSAndroid Build Coastguard Worker const char kPrefix[] = "test:prefix";
301*8542734aSAndroid Build Coastguard Worker const char kIfName[] = "wlan8";
302*8542734aSAndroid Build Coastguard Worker const uint32_t kMark = 0x12345678;
303*8542734aSAndroid Build Coastguard Worker const uint32_t kMask = 0xF0F0F0F0;
304*8542734aSAndroid Build Coastguard Worker const char kExpected[] =
305*8542734aSAndroid Build Coastguard Worker "*mangle\n"
306*8542734aSAndroid Build Coastguard Worker "-D wakeupctrl_mangle_INPUT -i test:prefix"
307*8542734aSAndroid Build Coastguard Worker " -m mark --mark 0x12345678/0xf0f0f0f0 -m limit --limit 10/s"
308*8542734aSAndroid Build Coastguard Worker " -j NFLOG --nflog-prefix wlan8 --nflog-group 3 --nflog-threshold 8\n"
309*8542734aSAndroid Build Coastguard Worker "COMMIT\n";
310*8542734aSAndroid Build Coastguard Worker EXPECT_CALL(mIptables, execute(V4V6, kExpected, _)).WillOnce(Return(0));
311*8542734aSAndroid Build Coastguard Worker EXPECT_OK(mController.delInterface(kPrefix, kIfName, kMark, kMask));
312*8542734aSAndroid Build Coastguard Worker }
313*8542734aSAndroid Build Coastguard Worker
314*8542734aSAndroid Build Coastguard Worker } // namespace net
315*8542734aSAndroid Build Coastguard Worker } // namespace android
316