• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #define LOG_TAG "VtsOffloadControlV1_0TargetTest"
18 
19 #include <VtsHalHidlTargetCallbackBase.h>
20 #include <VtsHalHidlTargetTestBase.h>
21 #include <VtsHalHidlTargetTestEnvBase.h>
22 #include <android-base/stringprintf.h>
23 #include <android-base/unique_fd.h>
24 #include <android/hardware/tetheroffload/config/1.0/IOffloadConfig.h>
25 #include <android/hardware/tetheroffload/control/1.0/IOffloadControl.h>
26 #include <android/hardware/tetheroffload/control/1.0/types.h>
27 #include <linux/netfilter/nfnetlink.h>
28 #include <linux/netlink.h>
29 #include <net/if.h>
30 #include <sys/socket.h>
31 #include <unistd.h>
32 #include <set>
33 
34 using android::base::StringPrintf;
35 using android::base::unique_fd;
36 using android::hardware::hidl_handle;
37 using android::hardware::hidl_string;
38 using android::hardware::hidl_vec;
39 using android::hardware::Return;
40 using android::hardware::tetheroffload::config::V1_0::IOffloadConfig;
41 using android::hardware::tetheroffload::control::V1_0::IOffloadControl;
42 using android::hardware::tetheroffload::control::V1_0::IPv4AddrPortPair;
43 using android::hardware::tetheroffload::control::V1_0::ITetheringOffloadCallback;
44 using android::hardware::tetheroffload::control::V1_0::OffloadCallbackEvent;
45 using android::hardware::tetheroffload::control::V1_0::NatTimeoutUpdate;
46 using android::hardware::tetheroffload::control::V1_0::NetworkProtocol;
47 using android::hardware::Void;
48 using android::sp;
49 
50 enum class ExpectBoolean {
51     Ignored = -1,
52     False = 0,
53     True = 1,
54 };
55 
56 constexpr const char* TEST_IFACE = "rmnet_data0";
57 
58 // We use #defines here so as to get local lamba captures and error message line numbers
59 #define ASSERT_TRUE_CALLBACK                                                    \
60     [&](bool success, std::string errMsg) {                                     \
61         std::string msg = StringPrintf("unexpected error: %s", errMsg.c_str()); \
62         ASSERT_TRUE(success) << msg;                                            \
63     }
64 
65 #define ASSERT_FALSE_CALLBACK                                                 \
66     [&](bool success, std::string errMsg) {                                   \
67         std::string msg = StringPrintf("expected error: %s", errMsg.c_str()); \
68         ASSERT_FALSE(success) << msg;                                         \
69     }
70 
71 #define ASSERT_ZERO_BYTES_CALLBACK            \
72     [&](uint64_t rxBytes, uint64_t txBytes) { \
73         EXPECT_EQ(0ULL, rxBytes);             \
74         EXPECT_EQ(0ULL, txBytes);             \
75     }
76 
asSockaddr(const sockaddr_nl * nladdr)77 inline const sockaddr* asSockaddr(const sockaddr_nl* nladdr) {
78     return reinterpret_cast<const sockaddr*>(nladdr);
79 }
80 
conntrackSocket(unsigned groups)81 int conntrackSocket(unsigned groups) {
82     unique_fd s(socket(AF_NETLINK, SOCK_DGRAM, NETLINK_NETFILTER));
83     if (s.get() < 0) {
84         return -errno;
85     }
86 
87     const struct sockaddr_nl bind_addr = {
88         .nl_family = AF_NETLINK, .nl_pad = 0, .nl_pid = 0, .nl_groups = groups,
89     };
90     if (::bind(s.get(), asSockaddr(&bind_addr), sizeof(bind_addr)) < 0) {
91         return -errno;
92     }
93 
94     const struct sockaddr_nl kernel_addr = {
95         .nl_family = AF_NETLINK, .nl_pad = 0, .nl_pid = 0, .nl_groups = groups,
96     };
97     if (connect(s.get(), asSockaddr(&kernel_addr), sizeof(kernel_addr)) != 0) {
98         return -errno;
99     }
100 
101     return s.release();
102 }
103 
104 constexpr char kCallbackOnEvent[] = "onEvent";
105 constexpr char kCallbackUpdateTimeout[] = "updateTimeout";
106 
107 class TetheringOffloadCallbackArgs {
108    public:
109     OffloadCallbackEvent last_event;
110     NatTimeoutUpdate last_params;
111 };
112 
113 // Test environment for OffloadControl HIDL HAL.
114 class OffloadControlHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase {
115    public:
116     // get the test environment singleton
Instance()117     static OffloadControlHidlEnvironment* Instance() {
118         static OffloadControlHidlEnvironment* instance = new OffloadControlHidlEnvironment;
119         return instance;
120     }
121 
registerTestServices()122     virtual void registerTestServices() override {
123         registerTestService<IOffloadConfig>();
124         registerTestService<IOffloadControl>();
125     }
126    private:
OffloadControlHidlEnvironment()127     OffloadControlHidlEnvironment() {}
128 };
129 
130 class OffloadControlHidlTestBase : public testing::VtsHalHidlTargetTestBase {
131    public:
SetUp()132     virtual void SetUp() override {
133         setupConfigHal();
134         prepareControlHal();
135     }
136 
TearDown()137     virtual void TearDown() override {
138         // For good measure, we should try stopOffload() once more. Since we
139         // don't know where we are in HAL call test cycle we don't know what
140         // return code to actually expect, so we just ignore it.
141         stopOffload(ExpectBoolean::Ignored);
142     }
143 
144     // The IOffloadConfig HAL is tested more thoroughly elsewhere. He we just
145     // setup everything correctly and verify basic readiness.
setupConfigHal()146     void setupConfigHal() {
147         config = testing::VtsHalHidlTargetTestBase::getService<IOffloadConfig>(
148             OffloadControlHidlEnvironment::Instance()->getServiceName<IOffloadConfig>());
149         ASSERT_NE(nullptr, config.get()) << "Could not get HIDL instance";
150 
151         unique_fd fd1(conntrackSocket(NF_NETLINK_CONNTRACK_NEW | NF_NETLINK_CONNTRACK_DESTROY));
152         if (fd1.get() < 0) {
153             ALOGE("Unable to create conntrack handles: %d/%s", errno, strerror(errno));
154             FAIL();
155         }
156         native_handle_t* const nativeHandle1 = native_handle_create(1, 0);
157         nativeHandle1->data[0] = fd1.release();
158         hidl_handle h1;
159         h1.setTo(nativeHandle1, true);
160 
161         unique_fd fd2(conntrackSocket(NF_NETLINK_CONNTRACK_UPDATE | NF_NETLINK_CONNTRACK_DESTROY));
162         if (fd2.get() < 0) {
163             ALOGE("Unable to create conntrack handles: %d/%s", errno, strerror(errno));
164             FAIL();
165         }
166         native_handle_t* const nativeHandle2 = native_handle_create(1, 0);
167         nativeHandle2->data[0] = fd2.release();
168         hidl_handle h2;
169         h2.setTo(nativeHandle2, true);
170 
171         const Return<void> ret = config->setHandles(h1, h2, ASSERT_TRUE_CALLBACK);
172         ASSERT_TRUE(ret.isOk());
173     }
174 
prepareControlHal()175     void prepareControlHal() {
176         control = testing::VtsHalHidlTargetTestBase::getService<IOffloadControl>(
177             OffloadControlHidlEnvironment::Instance()->getServiceName<IOffloadControl>());
178         ASSERT_NE(nullptr, control.get()) << "Could not get HIDL instance";
179 
180         control_cb = new TetheringOffloadCallback();
181         ASSERT_NE(nullptr, control_cb.get()) << "Could not get get offload callback";
182     }
183 
initOffload(const bool expected_result)184     void initOffload(const bool expected_result) {
185         auto init_cb = [&](bool success, std::string errMsg) {
186             std::string msg = StringPrintf("Unexpectedly %s to init offload: %s",
187                                            success ? "succeeded" : "failed", errMsg.c_str());
188             ASSERT_EQ(expected_result, success) << msg;
189         };
190         const Return<void> ret = control->initOffload(control_cb, init_cb);
191         ASSERT_TRUE(ret.isOk());
192     }
193 
setupControlHal()194     void setupControlHal() {
195         prepareControlHal();
196         initOffload(true);
197     }
198 
stopOffload(const ExpectBoolean value)199     void stopOffload(const ExpectBoolean value) {
200         auto cb = [&](bool success, const hidl_string& errMsg) {
201             switch (value) {
202                 case ExpectBoolean::False:
203                     ASSERT_EQ(false, success) << "Unexpectedly able to stop offload: " << errMsg;
204                     break;
205                 case ExpectBoolean::True:
206                     ASSERT_EQ(true, success) << "Unexpectedly failed to stop offload: " << errMsg;
207                     break;
208                 case ExpectBoolean::Ignored:
209                     break;
210             }
211         };
212         const Return<void> ret = control->stopOffload(cb);
213         ASSERT_TRUE(ret.isOk());
214     }
215 
216     // Callback class for both events and NAT timeout updates.
217     class TetheringOffloadCallback
218         : public testing::VtsHalHidlTargetCallbackBase<TetheringOffloadCallbackArgs>,
219           public ITetheringOffloadCallback {
220        public:
221         TetheringOffloadCallback() = default;
222         virtual ~TetheringOffloadCallback() = default;
223 
onEvent(OffloadCallbackEvent event)224         Return<void> onEvent(OffloadCallbackEvent event) override {
225             const TetheringOffloadCallbackArgs args{.last_event = event};
226             NotifyFromCallback(kCallbackOnEvent, args);
227             return Void();
228         };
229 
updateTimeout(const NatTimeoutUpdate & params)230         Return<void> updateTimeout(const NatTimeoutUpdate& params) override {
231             const TetheringOffloadCallbackArgs args{.last_params = params};
232             NotifyFromCallback(kCallbackUpdateTimeout, args);
233             return Void();
234         };
235     };
236 
237     sp<IOffloadConfig> config;
238     sp<IOffloadControl> control;
239     sp<TetheringOffloadCallback> control_cb;
240 };
241 
242 // Call initOffload() multiple times. Check that non-first initOffload() calls return false.
TEST_F(OffloadControlHidlTestBase,AdditionalInitsWithoutStopReturnFalse)243 TEST_F(OffloadControlHidlTestBase, AdditionalInitsWithoutStopReturnFalse) {
244     initOffload(true);
245     initOffload(false);
246     initOffload(false);
247     initOffload(false);
248 }
249 
250 // Check that calling stopOffload() without first having called initOffload() returns false.
TEST_F(OffloadControlHidlTestBase,MultipleStopsWithoutInitReturnFalse)251 TEST_F(OffloadControlHidlTestBase, MultipleStopsWithoutInitReturnFalse) {
252     stopOffload(ExpectBoolean::False);
253     stopOffload(ExpectBoolean::False);
254     stopOffload(ExpectBoolean::False);
255 }
256 
257 // Check whether the specified interface is up.
interfaceIsUp(const char * name)258 bool interfaceIsUp(const char* name) {
259     if (name == nullptr) return false;
260     struct ifreq ifr = {};
261     strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
262     int sock = socket(AF_INET6, SOCK_DGRAM, 0);
263     if (sock == -1) return false;
264     int ret = ioctl(sock, SIOCGIFFLAGS, &ifr, sizeof(ifr));
265     close(sock);
266     return (ret == 0) && (ifr.ifr_flags & IFF_UP);
267 }
268 
269 // Check that calling stopOffload() after a complete init/stop cycle returns false.
TEST_F(OffloadControlHidlTestBase,AdditionalStopsWithInitReturnFalse)270 TEST_F(OffloadControlHidlTestBase, AdditionalStopsWithInitReturnFalse) {
271     initOffload(true);
272     // Call setUpstreamParameters() so that "offload" can be reasonably said
273     // to be both requested and operational.
274     const hidl_string v4Addr("192.0.0.2");
275     const hidl_string v4Gw("192.0.0.1");
276     const vector<hidl_string> v6Gws{hidl_string("fe80::db8:1"), hidl_string("fe80::db8:2")};
277     const Return<void> upstream =
278         control->setUpstreamParameters(TEST_IFACE, v4Addr, v4Gw, v6Gws, ASSERT_TRUE_CALLBACK);
279     EXPECT_TRUE(upstream.isOk());
280     if (!interfaceIsUp(TEST_IFACE)) {
281         return;
282     }
283     SCOPED_TRACE("Expecting stopOffload to succeed");
284     stopOffload(ExpectBoolean::Ignored);  // balance out initOffload(true)
285     SCOPED_TRACE("Expecting stopOffload to fail the first time");
286     stopOffload(ExpectBoolean::False);
287     SCOPED_TRACE("Expecting stopOffload to fail the second time");
288     stopOffload(ExpectBoolean::False);
289 }
290 
291 // Check that calling setLocalPrefixes() without first having called initOffload() returns false.
TEST_F(OffloadControlHidlTestBase,SetLocalPrefixesWithoutInitReturnsFalse)292 TEST_F(OffloadControlHidlTestBase, SetLocalPrefixesWithoutInitReturnsFalse) {
293     const vector<hidl_string> prefixes{hidl_string("2001:db8::/64")};
294     const Return<void> ret = control->setLocalPrefixes(prefixes, ASSERT_FALSE_CALLBACK);
295     EXPECT_TRUE(ret.isOk());
296 }
297 
298 // Check that calling getForwardedStats() without first having called initOffload()
299 // returns zero bytes statistics.
TEST_F(OffloadControlHidlTestBase,GetForwardedStatsWithoutInitReturnsZeroValues)300 TEST_F(OffloadControlHidlTestBase, GetForwardedStatsWithoutInitReturnsZeroValues) {
301     const hidl_string upstream(TEST_IFACE);
302     const Return<void> ret = control->getForwardedStats(upstream, ASSERT_ZERO_BYTES_CALLBACK);
303     EXPECT_TRUE(ret.isOk());
304 }
305 
306 // Check that calling setDataLimit() without first having called initOffload() returns false.
TEST_F(OffloadControlHidlTestBase,SetDataLimitWithoutInitReturnsFalse)307 TEST_F(OffloadControlHidlTestBase, SetDataLimitWithoutInitReturnsFalse) {
308     const hidl_string upstream(TEST_IFACE);
309     const uint64_t limit = 5000ULL;
310     const Return<void> ret = control->setDataLimit(upstream, limit, ASSERT_FALSE_CALLBACK);
311     EXPECT_TRUE(ret.isOk());
312 }
313 
314 // Check that calling setUpstreamParameters() without first having called initOffload()
315 // returns false.
TEST_F(OffloadControlHidlTestBase,SetUpstreamParametersWithoutInitReturnsFalse)316 TEST_F(OffloadControlHidlTestBase, SetUpstreamParametersWithoutInitReturnsFalse) {
317     const hidl_string iface(TEST_IFACE);
318     const hidl_string v4Addr("192.0.2.0/24");
319     const hidl_string v4Gw("192.0.2.1");
320     const vector<hidl_string> v6Gws{hidl_string("fe80::db8:1")};
321     const Return<void> ret =
322         control->setUpstreamParameters(iface, v4Addr, v4Gw, v6Gws, ASSERT_FALSE_CALLBACK);
323     EXPECT_TRUE(ret.isOk());
324 }
325 
326 // Check that calling addDownstream() with an IPv4 prefix without first having called
327 // initOffload() returns false.
TEST_F(OffloadControlHidlTestBase,AddIPv4DownstreamWithoutInitReturnsFalse)328 TEST_F(OffloadControlHidlTestBase, AddIPv4DownstreamWithoutInitReturnsFalse) {
329     const hidl_string iface(TEST_IFACE);
330     const hidl_string prefix("192.0.2.0/24");
331     const Return<void> ret = control->addDownstream(iface, prefix, ASSERT_FALSE_CALLBACK);
332     EXPECT_TRUE(ret.isOk());
333 }
334 
335 // Check that calling addDownstream() with an IPv6 prefix without first having called
336 // initOffload() returns false.
TEST_F(OffloadControlHidlTestBase,AddIPv6DownstreamWithoutInitReturnsFalse)337 TEST_F(OffloadControlHidlTestBase, AddIPv6DownstreamWithoutInitReturnsFalse) {
338     const hidl_string iface(TEST_IFACE);
339     const hidl_string prefix("2001:db8::/64");
340     const Return<void> ret = control->addDownstream(iface, prefix, ASSERT_FALSE_CALLBACK);
341     EXPECT_TRUE(ret.isOk());
342 }
343 
344 // Check that calling removeDownstream() with an IPv4 prefix without first having called
345 // initOffload() returns false.
TEST_F(OffloadControlHidlTestBase,RemoveIPv4DownstreamWithoutInitReturnsFalse)346 TEST_F(OffloadControlHidlTestBase, RemoveIPv4DownstreamWithoutInitReturnsFalse) {
347     const hidl_string iface(TEST_IFACE);
348     const hidl_string prefix("192.0.2.0/24");
349     const Return<void> ret = control->removeDownstream(iface, prefix, ASSERT_FALSE_CALLBACK);
350     EXPECT_TRUE(ret.isOk());
351 }
352 
353 // Check that calling removeDownstream() with an IPv6 prefix without first having called
354 // initOffload() returns false.
TEST_F(OffloadControlHidlTestBase,RemoveIPv6DownstreamWithoutInitReturnsFalse)355 TEST_F(OffloadControlHidlTestBase, RemoveIPv6DownstreamWithoutInitReturnsFalse) {
356     const hidl_string iface(TEST_IFACE);
357     const hidl_string prefix("2001:db8::/64");
358     const Return<void> ret = control->removeDownstream(iface, prefix, ASSERT_FALSE_CALLBACK);
359     EXPECT_TRUE(ret.isOk());
360 }
361 
362 class OffloadControlHidlTest : public OffloadControlHidlTestBase {
363    public:
SetUp()364     virtual void SetUp() override {
365         setupConfigHal();
366         setupControlHal();
367     }
368 
TearDown()369     virtual void TearDown() override {
370         // For good measure, we should try stopOffload() once more. Since we
371         // don't know where we are in HAL call test cycle we don't know what
372         // return code to actually expect, so we just ignore it.
373         stopOffload(ExpectBoolean::Ignored);
374     }
375 };
376 
377 /*
378  * Tests for IOffloadControl::setLocalPrefixes().
379  */
380 
381 // Test setLocalPrefixes() accepts an IPv4 address.
TEST_F(OffloadControlHidlTest,SetLocalPrefixesIPv4AddressOk)382 TEST_F(OffloadControlHidlTest, SetLocalPrefixesIPv4AddressOk) {
383     const vector<hidl_string> prefixes{hidl_string("192.0.2.1")};
384     const Return<void> ret = control->setLocalPrefixes(prefixes, ASSERT_TRUE_CALLBACK);
385     EXPECT_TRUE(ret.isOk());
386 }
387 
388 // Test setLocalPrefixes() accepts an IPv6 address.
TEST_F(OffloadControlHidlTest,SetLocalPrefixesIPv6AddressOk)389 TEST_F(OffloadControlHidlTest, SetLocalPrefixesIPv6AddressOk) {
390     const vector<hidl_string> prefixes{hidl_string("fe80::1")};
391     const Return<void> ret = control->setLocalPrefixes(prefixes, ASSERT_TRUE_CALLBACK);
392     EXPECT_TRUE(ret.isOk());
393 }
394 
395 // Test setLocalPrefixes() accepts both IPv4 and IPv6 prefixes.
TEST_F(OffloadControlHidlTest,SetLocalPrefixesIPv4v6PrefixesOk)396 TEST_F(OffloadControlHidlTest, SetLocalPrefixesIPv4v6PrefixesOk) {
397     const vector<hidl_string> prefixes{hidl_string("192.0.2.0/24"), hidl_string("fe80::/64")};
398     const Return<void> ret = control->setLocalPrefixes(prefixes, ASSERT_TRUE_CALLBACK);
399     EXPECT_TRUE(ret.isOk());
400 }
401 
402 // Test that setLocalPrefixes() fails given empty input. There is always
403 // a non-empty set of local prefixes; when all networking interfaces are down
404 // we still apply {127.0.0.0/8, ::1/128, fe80::/64} here.
TEST_F(OffloadControlHidlTest,SetLocalPrefixesEmptyFails)405 TEST_F(OffloadControlHidlTest, SetLocalPrefixesEmptyFails) {
406     const vector<hidl_string> prefixes{};
407     const Return<void> ret = control->setLocalPrefixes(prefixes, ASSERT_FALSE_CALLBACK);
408     EXPECT_TRUE(ret.isOk());
409 }
410 
411 // Test setLocalPrefixes() fails on incorrectly formed input strings.
TEST_F(OffloadControlHidlTest,SetLocalPrefixesInvalidFails)412 TEST_F(OffloadControlHidlTest, SetLocalPrefixesInvalidFails) {
413     const vector<hidl_string> prefixes{hidl_string("192.0.2.0/24"), hidl_string("invalid")};
414     const Return<void> ret = control->setLocalPrefixes(prefixes, ASSERT_FALSE_CALLBACK);
415     EXPECT_TRUE(ret.isOk());
416 }
417 
418 /*
419  * Tests for IOffloadControl::getForwardedStats().
420  */
421 
422 // Test that getForwardedStats() for a non-existent upstream yields zero bytes statistics.
TEST_F(OffloadControlHidlTest,GetForwardedStatsInvalidUpstreamIface)423 TEST_F(OffloadControlHidlTest, GetForwardedStatsInvalidUpstreamIface) {
424     const hidl_string upstream("invalid");
425     const Return<void> ret = control->getForwardedStats(upstream, ASSERT_ZERO_BYTES_CALLBACK);
426     EXPECT_TRUE(ret.isOk());
427 }
428 
429 // TEST_IFACE is presumed to exist on the device and be up. No packets
430 // are ever actually caused to be forwarded.
TEST_F(OffloadControlHidlTest,GetForwardedStatsDummyIface)431 TEST_F(OffloadControlHidlTest, GetForwardedStatsDummyIface) {
432     const hidl_string upstream(TEST_IFACE);
433     const Return<void> ret = control->getForwardedStats(upstream, ASSERT_ZERO_BYTES_CALLBACK);
434     EXPECT_TRUE(ret.isOk());
435 }
436 
437 /*
438  * Tests for IOffloadControl::setDataLimit().
439  */
440 
441 // Test that setDataLimit() for an empty interface name fails.
TEST_F(OffloadControlHidlTest,SetDataLimitEmptyUpstreamIfaceFails)442 TEST_F(OffloadControlHidlTest, SetDataLimitEmptyUpstreamIfaceFails) {
443     const hidl_string upstream("");
444     const uint64_t limit = 5000ULL;
445     const Return<void> ret = control->setDataLimit(upstream, limit, ASSERT_FALSE_CALLBACK);
446     EXPECT_TRUE(ret.isOk());
447 }
448 
449 // TEST_IFACE is presumed to exist on the device and be up. No packets
450 // are ever actually caused to be forwarded.
TEST_F(OffloadControlHidlTest,SetDataLimitNonZeroOk)451 TEST_F(OffloadControlHidlTest, SetDataLimitNonZeroOk) {
452     const hidl_string upstream(TEST_IFACE);
453     const uint64_t limit = 5000ULL;
454     const Return<void> ret = control->setDataLimit(upstream, limit, ASSERT_TRUE_CALLBACK);
455     EXPECT_TRUE(ret.isOk());
456 }
457 
458 // TEST_IFACE is presumed to exist on the device and be up. No packets
459 // are ever actually caused to be forwarded.
TEST_F(OffloadControlHidlTest,SetDataLimitZeroOk)460 TEST_F(OffloadControlHidlTest, SetDataLimitZeroOk) {
461     const hidl_string upstream(TEST_IFACE);
462     const uint64_t limit = 0ULL;
463     const Return<void> ret = control->setDataLimit(upstream, limit, ASSERT_TRUE_CALLBACK);
464     EXPECT_TRUE(ret.isOk());
465 }
466 
467 /*
468  * Tests for IOffloadControl::setUpstreamParameters().
469  */
470 
471 // TEST_IFACE is presumed to exist on the device and be up. No packets
472 // are ever actually caused to be forwarded.
TEST_F(OffloadControlHidlTest,SetUpstreamParametersIPv6OnlyOk)473 TEST_F(OffloadControlHidlTest, SetUpstreamParametersIPv6OnlyOk) {
474     const hidl_string iface(TEST_IFACE);
475     const hidl_string v4Addr("");
476     const hidl_string v4Gw("");
477     const vector<hidl_string> v6Gws{hidl_string("fe80::db8:1"), hidl_string("fe80::db8:2")};
478     const Return<void> ret =
479         control->setUpstreamParameters(iface, v4Addr, v4Gw, v6Gws, ASSERT_TRUE_CALLBACK);
480     EXPECT_TRUE(ret.isOk());
481 }
482 
483 // TEST_IFACE is presumed to exist on the device and be up. No packets
484 // are ever actually caused to be forwarded.
TEST_F(OffloadControlHidlTest,SetUpstreamParametersAlternateIPv6OnlyOk)485 TEST_F(OffloadControlHidlTest, SetUpstreamParametersAlternateIPv6OnlyOk) {
486     const hidl_string iface(TEST_IFACE);
487     const hidl_string v4Addr;
488     const hidl_string v4Gw;
489     const vector<hidl_string> v6Gws{hidl_string("fe80::db8:1"), hidl_string("fe80::db8:3")};
490     const Return<void> ret =
491         control->setUpstreamParameters(iface, v4Addr, v4Gw, v6Gws, ASSERT_TRUE_CALLBACK);
492     EXPECT_TRUE(ret.isOk());
493 }
494 
495 // TEST_IFACE is presumed to exist on the device and be up. No packets
496 // are ever actually caused to be forwarded.
TEST_F(OffloadControlHidlTest,SetUpstreamParametersIPv4OnlyOk)497 TEST_F(OffloadControlHidlTest, SetUpstreamParametersIPv4OnlyOk) {
498     const hidl_string iface(TEST_IFACE);
499     const hidl_string v4Addr("192.0.2.2");
500     const hidl_string v4Gw("192.0.2.1");
501     const vector<hidl_string> v6Gws{};
502     const Return<void> ret =
503         control->setUpstreamParameters(iface, v4Addr, v4Gw, v6Gws, ASSERT_TRUE_CALLBACK);
504     EXPECT_TRUE(ret.isOk());
505 }
506 
507 // TEST_IFACE is presumed to exist on the device and be up. No packets
508 // are ever actually caused to be forwarded.
TEST_F(OffloadControlHidlTest,SetUpstreamParametersIPv4v6Ok)509 TEST_F(OffloadControlHidlTest, SetUpstreamParametersIPv4v6Ok) {
510     const hidl_string iface(TEST_IFACE);
511     const hidl_string v4Addr("192.0.2.2");
512     const hidl_string v4Gw("192.0.2.1");
513     const vector<hidl_string> v6Gws{hidl_string("fe80::db8:1"), hidl_string("fe80::db8:2")};
514     const Return<void> ret =
515         control->setUpstreamParameters(iface, v4Addr, v4Gw, v6Gws, ASSERT_TRUE_CALLBACK);
516     EXPECT_TRUE(ret.isOk());
517 }
518 
519 // Test that setUpstreamParameters() fails when all parameters are empty.
TEST_F(OffloadControlHidlTest,SetUpstreamParametersEmptyFails)520 TEST_F(OffloadControlHidlTest, SetUpstreamParametersEmptyFails) {
521     const hidl_string iface("");
522     const hidl_string v4Addr("");
523     const hidl_string v4Gw("");
524     const vector<hidl_string> v6Gws{};
525     const Return<void> ret =
526         control->setUpstreamParameters(iface, v4Addr, v4Gw, v6Gws, ASSERT_FALSE_CALLBACK);
527     EXPECT_TRUE(ret.isOk());
528 }
529 
530 // Test that setUpstreamParameters() fails when given empty or non-existent interface names.
TEST_F(OffloadControlHidlTest,SetUpstreamParametersBogusIfaceFails)531 TEST_F(OffloadControlHidlTest, SetUpstreamParametersBogusIfaceFails) {
532     const hidl_string v4Addr("192.0.2.2");
533     const hidl_string v4Gw("192.0.2.1");
534     const vector<hidl_string> v6Gws{hidl_string("fe80::db8:1")};
535     for (const auto& bogus : {"", "invalid"}) {
536         SCOPED_TRACE(StringPrintf("iface='%s'", bogus));
537         const hidl_string iface(bogus);
538         const Return<void> ret =
539             control->setUpstreamParameters(iface, v4Addr, v4Gw, v6Gws, ASSERT_FALSE_CALLBACK);
540         EXPECT_TRUE(ret.isOk());
541     }
542 }
543 
544 // Test that setUpstreamParameters() fails when given unparseable IPv4 addresses.
TEST_F(OffloadControlHidlTest,SetUpstreamParametersInvalidIPv4AddrFails)545 TEST_F(OffloadControlHidlTest, SetUpstreamParametersInvalidIPv4AddrFails) {
546     const hidl_string iface(TEST_IFACE);
547     const hidl_string v4Gw("192.0.2.1");
548     const vector<hidl_string> v6Gws{hidl_string("fe80::db8:1")};
549     for (const auto& bogus : {"invalid", "192.0.2"}) {
550         SCOPED_TRACE(StringPrintf("v4addr='%s'", bogus));
551         const hidl_string v4Addr(bogus);
552         const Return<void> ret =
553             control->setUpstreamParameters(iface, v4Addr, v4Gw, v6Gws, ASSERT_FALSE_CALLBACK);
554         EXPECT_TRUE(ret.isOk());
555     }
556 }
557 
558 // Test that setUpstreamParameters() fails when given unparseable IPv4 gateways.
TEST_F(OffloadControlHidlTest,SetUpstreamParametersInvalidIPv4GatewayFails)559 TEST_F(OffloadControlHidlTest, SetUpstreamParametersInvalidIPv4GatewayFails) {
560     const hidl_string iface(TEST_IFACE);
561     const hidl_string v4Addr("192.0.2.2");
562     const vector<hidl_string> v6Gws{hidl_string("fe80::db8:1")};
563     for (const auto& bogus : {"invalid", "192.0.2"}) {
564         SCOPED_TRACE(StringPrintf("v4gateway='%s'", bogus));
565         const hidl_string v4Gw(bogus);
566         const Return<void> ret =
567             control->setUpstreamParameters(iface, v4Addr, v4Gw, v6Gws, ASSERT_FALSE_CALLBACK);
568         EXPECT_TRUE(ret.isOk());
569     }
570 }
571 
572 // Test that setUpstreamParameters() fails when given unparseable IPv6 gateways.
TEST_F(OffloadControlHidlTest,SetUpstreamParametersBadIPv6GatewaysFail)573 TEST_F(OffloadControlHidlTest, SetUpstreamParametersBadIPv6GatewaysFail) {
574     const hidl_string iface(TEST_IFACE);
575     const hidl_string v4Addr("192.0.2.2");
576     const hidl_string v4Gw("192.0.2.1");
577     for (const auto& bogus : {"", "invalid", "fe80::bogus", "192.0.2.66"}) {
578         SCOPED_TRACE(StringPrintf("v6gateway='%s'", bogus));
579         const vector<hidl_string> v6Gws{hidl_string("fe80::1"), hidl_string(bogus)};
580         const Return<void> ret =
581             control->setUpstreamParameters(iface, v4Addr, v4Gw, v6Gws, ASSERT_FALSE_CALLBACK);
582         EXPECT_TRUE(ret.isOk());
583     }
584 }
585 
586 /*
587  * Tests for IOffloadControl::addDownstream().
588  */
589 
590 // Test addDownstream() works given an IPv4 prefix.
TEST_F(OffloadControlHidlTest,AddDownstreamIPv4)591 TEST_F(OffloadControlHidlTest, AddDownstreamIPv4) {
592     const hidl_string iface("dummy0");
593     const hidl_string prefix("192.0.2.0/24");
594     const Return<void> ret = control->addDownstream(iface, prefix, ASSERT_TRUE_CALLBACK);
595     EXPECT_TRUE(ret.isOk());
596 }
597 
598 // Test addDownstream() works given an IPv6 prefix.
TEST_F(OffloadControlHidlTest,AddDownstreamIPv6)599 TEST_F(OffloadControlHidlTest, AddDownstreamIPv6) {
600     const hidl_string iface("dummy0");
601     const hidl_string prefix("2001:db8::/64");
602     const Return<void> ret = control->addDownstream(iface, prefix, ASSERT_TRUE_CALLBACK);
603     EXPECT_TRUE(ret.isOk());
604 }
605 
606 // Test addDownstream() fails given all empty parameters.
TEST_F(OffloadControlHidlTest,AddDownstreamEmptyFails)607 TEST_F(OffloadControlHidlTest, AddDownstreamEmptyFails) {
608     const hidl_string iface("");
609     const hidl_string prefix("");
610     const Return<void> ret = control->addDownstream(iface, prefix, ASSERT_FALSE_CALLBACK);
611     EXPECT_TRUE(ret.isOk());
612 }
613 
614 // Test addDownstream() fails given empty or non-existent interface names.
TEST_F(OffloadControlHidlTest,AddDownstreamInvalidIfaceFails)615 TEST_F(OffloadControlHidlTest, AddDownstreamInvalidIfaceFails) {
616     const hidl_string prefix("192.0.2.0/24");
617     for (const auto& bogus : {"", "invalid"}) {
618         SCOPED_TRACE(StringPrintf("iface='%s'", bogus));
619         const hidl_string iface(bogus);
620         const Return<void> ret = control->addDownstream(iface, prefix, ASSERT_FALSE_CALLBACK);
621         EXPECT_TRUE(ret.isOk());
622     }
623 }
624 
625 // Test addDownstream() fails given unparseable prefix arguments.
TEST_F(OffloadControlHidlTest,AddDownstreamBogusPrefixFails)626 TEST_F(OffloadControlHidlTest, AddDownstreamBogusPrefixFails) {
627     const hidl_string iface("dummy0");
628     for (const auto& bogus : {"", "192.0.2/24", "2001:db8/64"}) {
629         SCOPED_TRACE(StringPrintf("prefix='%s'", bogus));
630         const hidl_string prefix(bogus);
631         const Return<void> ret = control->addDownstream(iface, prefix, ASSERT_FALSE_CALLBACK);
632         EXPECT_TRUE(ret.isOk());
633     }
634 }
635 
636 /*
637  * Tests for IOffloadControl::removeDownstream().
638  */
639 
640 // Test removeDownstream() works given an IPv4 prefix.
TEST_F(OffloadControlHidlTest,RemoveDownstreamIPv4)641 TEST_F(OffloadControlHidlTest, RemoveDownstreamIPv4) {
642     const hidl_string iface("dummy0");
643     const hidl_string prefix("192.0.2.0/24");
644     // First add the downstream, otherwise removeDownstream logic can reasonably
645     // return false for downstreams not previously added.
646     const Return<void> add = control->addDownstream(iface, prefix, ASSERT_TRUE_CALLBACK);
647     EXPECT_TRUE(add.isOk());
648     const Return<void> del = control->removeDownstream(iface, prefix, ASSERT_TRUE_CALLBACK);
649     EXPECT_TRUE(del.isOk());
650 }
651 
652 // Test removeDownstream() works given an IPv6 prefix.
TEST_F(OffloadControlHidlTest,RemoveDownstreamIPv6)653 TEST_F(OffloadControlHidlTest, RemoveDownstreamIPv6) {
654     const hidl_string iface("dummy0");
655     const hidl_string prefix("2001:db8::/64");
656     // First add the downstream, otherwise removeDownstream logic can reasonably
657     // return false for downstreams not previously added.
658     const Return<void> add = control->addDownstream(iface, prefix, ASSERT_TRUE_CALLBACK);
659     EXPECT_TRUE(add.isOk());
660     const Return<void> del = control->removeDownstream(iface, prefix, ASSERT_TRUE_CALLBACK);
661     EXPECT_TRUE(del.isOk());
662 }
663 
664 // Test removeDownstream() fails given all empty parameters.
TEST_F(OffloadControlHidlTest,RemoveDownstreamEmptyFails)665 TEST_F(OffloadControlHidlTest, RemoveDownstreamEmptyFails) {
666     const hidl_string iface("");
667     const hidl_string prefix("");
668     const Return<void> ret = control->removeDownstream(iface, prefix, ASSERT_FALSE_CALLBACK);
669     EXPECT_TRUE(ret.isOk());
670 }
671 
672 // Test removeDownstream() fails given empty or non-existent interface names.
TEST_F(OffloadControlHidlTest,RemoveDownstreamBogusIfaceFails)673 TEST_F(OffloadControlHidlTest, RemoveDownstreamBogusIfaceFails) {
674     const hidl_string prefix("192.0.2.0/24");
675     for (const auto& bogus : {"", "invalid"}) {
676         SCOPED_TRACE(StringPrintf("iface='%s'", bogus));
677         const hidl_string iface(bogus);
678         const Return<void> ret = control->removeDownstream(iface, prefix, ASSERT_FALSE_CALLBACK);
679         EXPECT_TRUE(ret.isOk());
680     }
681 }
682 
683 // Test removeDownstream() fails given unparseable prefix arguments.
TEST_F(OffloadControlHidlTest,RemoveDownstreamBogusPrefixFails)684 TEST_F(OffloadControlHidlTest, RemoveDownstreamBogusPrefixFails) {
685     const hidl_string iface("dummy0");
686     for (const auto& bogus : {"", "192.0.2/24", "2001:db8/64"}) {
687         SCOPED_TRACE(StringPrintf("prefix='%s'", bogus));
688         const hidl_string prefix(bogus);
689         const Return<void> ret = control->removeDownstream(iface, prefix, ASSERT_FALSE_CALLBACK);
690         EXPECT_TRUE(ret.isOk());
691     }
692 }
693 
main(int argc,char ** argv)694 int main(int argc, char** argv) {
695     ::testing::AddGlobalTestEnvironment(OffloadControlHidlEnvironment::Instance());
696     ::testing::InitGoogleTest(&argc, argv);
697     OffloadControlHidlEnvironment::Instance()->init(&argc, argv);
698     int status = RUN_ALL_TESTS();
699     ALOGE("Test result with status=%d", status);
700     return status;
701 }
702