Home | History | Annotate | Download | only in functional
      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