xref: /aosp_15_r20/system/netd/server/WakeupControllerTest.cpp (revision 8542734a0dd1db395a4d42aae09c37f3c3c3e7a1)
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