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 77 inline const sockaddr* asSockaddr(const sockaddr_nl* nladdr) { 78 return reinterpret_cast<const sockaddr*>(nladdr); 79 } 80 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 117 static OffloadControlHidlEnvironment* Instance() { 118 static OffloadControlHidlEnvironment* instance = new OffloadControlHidlEnvironment; 119 return instance; 120 } 121 122 virtual void registerTestServices() override { 123 registerTestService<IOffloadConfig>(); 124 registerTestService<IOffloadControl>(); 125 } 126 private: 127 OffloadControlHidlEnvironment() {} 128 }; 129 130 class OffloadControlHidlTestBase : public testing::VtsHalHidlTargetTestBase { 131 public: 132 virtual void SetUp() override { 133 setupConfigHal(); 134 prepareControlHal(); 135 } 136 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. 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 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 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 194 void setupControlHal() { 195 prepareControlHal(); 196 initOffload(true); 197 } 198 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 224 Return<void> onEvent(OffloadCallbackEvent event) override { 225 const TetheringOffloadCallbackArgs args{.last_event = event}; 226 NotifyFromCallback(kCallbackOnEvent, args); 227 return Void(); 228 }; 229 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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: 364 virtual void SetUp() override { 365 setupConfigHal(); 366 setupControlHal(); 367 } 368 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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 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