Refactor and expand tetheroffload Control and Config VTS

Test: as follows
    - built
    - flashed
    - booted
    - adb sync && adb shell ...$test
Bug: 38220415
Change-Id: Iab715c45ad0457f3eea43ee408fa947ffc01c4aa
diff --git a/tetheroffload/config/1.0/vts/functional/Android.bp b/tetheroffload/config/1.0/vts/functional/Android.bp
index ba6d809..2e720c6 100644
--- a/tetheroffload/config/1.0/vts/functional/Android.bp
+++ b/tetheroffload/config/1.0/vts/functional/Android.bp
@@ -1,9 +1,24 @@
+// Copyright (C) 2017 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 cc_test {
     name: "VtsHalTetheroffloadConfigV1_0TargetTest",
     defaults: ["hidl_defaults"],
     srcs: ["VtsHalTetheroffloadConfigV1_0TargetTest.cpp"],
     shared_libs: [
         "android.hardware.tetheroffload.config@1.0",
+        "libbase",
         "libcutils",
         "libhidlbase",
         "libhidltransport",
diff --git a/tetheroffload/config/1.0/vts/functional/VtsHalTetheroffloadConfigV1_0TargetTest.cpp b/tetheroffload/config/1.0/vts/functional/VtsHalTetheroffloadConfigV1_0TargetTest.cpp
index b0ded4f..fc61e1c 100644
--- a/tetheroffload/config/1.0/vts/functional/VtsHalTetheroffloadConfigV1_0TargetTest.cpp
+++ b/tetheroffload/config/1.0/vts/functional/VtsHalTetheroffloadConfigV1_0TargetTest.cpp
@@ -13,18 +13,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 #define LOG_TAG "VtsOffloadConfigV1_0TargetTest"
 
+#include <VtsHalHidlTargetTestBase.h>
+#include <android-base/stringprintf.h>
 #include <android-base/unique_fd.h>
 #include <android/hardware/tetheroffload/config/1.0/IOffloadConfig.h>
 #include <linux/netfilter/nfnetlink.h>
 #include <linux/netlink.h>
+#include <linux/rtnetlink.h>
 #include <log/log.h>
-#include <set>
 #include <sys/socket.h>
 #include <unistd.h>
-#include <VtsHalHidlTargetTestBase.h>
+#include <set>
 
+using android::base::StringPrintf;
+using android::base::unique_fd;
 using android::hardware::hidl_handle;
 using android::hardware::hidl_string;
 using android::hardware::Return;
@@ -32,41 +37,48 @@
 using android::hardware::Void;
 using android::sp;
 
-inline const sockaddr * asSockaddr(const sockaddr_nl *nladdr) {
-    return reinterpret_cast<const sockaddr *>(nladdr);
+#define ASSERT_TRUE_CALLBACK \
+    [&](bool success, const hidl_string& errMsg) { ASSERT_TRUE(success) << errMsg.c_str(); }
+
+#define ASSERT_FALSE_CALLBACK \
+    [&](bool success, const hidl_string& errMsg) { ASSERT_FALSE(success) << errMsg.c_str(); }
+
+const unsigned kFd1Groups = NFNLGRP_CONNTRACK_NEW | NFNLGRP_CONNTRACK_DESTROY;
+const unsigned kFd2Groups = NFNLGRP_CONNTRACK_UPDATE | NFNLGRP_CONNTRACK_DESTROY;
+
+inline const sockaddr* asSockaddr(const sockaddr_nl* nladdr) {
+    return reinterpret_cast<const sockaddr*>(nladdr);
 }
 
-int conntrackSocket(unsigned groups) {
-    android::base::unique_fd s(socket(AF_NETLINK, SOCK_DGRAM, NETLINK_NETFILTER));
+int netlinkSocket(int protocol, unsigned groups) {
+    unique_fd s(socket(AF_NETLINK, SOCK_DGRAM, protocol));
     if (s.get() < 0) {
         return -errno;
     }
 
     const struct sockaddr_nl bind_addr = {
-        .nl_family = AF_NETLINK,
-        .nl_pad = 0,
-        .nl_pid = 0,
-        .nl_groups = groups,
+        .nl_family = AF_NETLINK, .nl_pad = 0, .nl_pid = 0, .nl_groups = groups,
     };
     if (::bind(s.get(), asSockaddr(&bind_addr), sizeof(bind_addr)) != 0) {
         return -errno;
     }
 
     const struct sockaddr_nl kernel_addr = {
-        .nl_family = AF_NETLINK,
-        .nl_pad = 0,
-        .nl_pid = 0,
-        .nl_groups = groups,
+        .nl_family = AF_NETLINK, .nl_pad = 0, .nl_pid = 0, .nl_groups = groups,
     };
-    if (connect(s.get(), asSockaddr(&kernel_addr), sizeof(kernel_addr)) != 0) {
+    if (::connect(s.get(), asSockaddr(&kernel_addr), sizeof(kernel_addr)) != 0) {
         return -errno;
     }
 
     return s.release();
 }
 
+int netlinkSocket(unsigned groups) {
+    return netlinkSocket(NETLINK_NETFILTER, groups);
+}
+
 class OffloadConfigHidlTest : public testing::VtsHalHidlTargetTestBase {
-public:
+   public:
     virtual void SetUp() override {
         config = testing::VtsHalHidlTargetTestBase::getService<IOffloadConfig>();
         ASSERT_NE(nullptr, config.get()) << "Could not get HIDL instance";
@@ -77,104 +89,77 @@
     sp<IOffloadConfig> config;
 };
 
-/**
- * Ensure handles can be set with correct socket options.
- */
+// Ensure handles can be set with correct socket options.
 TEST_F(OffloadConfigHidlTest, TestSetHandles) {
-    android::base::unique_fd
-        fd1(conntrackSocket(NFNLGRP_CONNTRACK_NEW | NFNLGRP_CONNTRACK_DESTROY)),
-        fd2(conntrackSocket(NFNLGRP_CONNTRACK_UPDATE | NFNLGRP_CONNTRACK_DESTROY));
-
-    if (fd1.get() < 0 || fd2.get() < 0) {
+    unique_fd fd1(netlinkSocket(kFd1Groups));
+    if (fd1.get() < 0) {
         ALOGE("Unable to create conntrack handles: %d/%s", errno, strerror(errno));
-        return;
+        FAIL();
     }
+    native_handle_t* const nativeHandle1 = native_handle_create(1, 0);
+    nativeHandle1->data[0] = fd1.release();
+    const hidl_handle h1 = hidl_handle(nativeHandle1);
 
-    native_handle_t* nativeHandle1 = native_handle_create(1, 0);
-    nativeHandle1->data[0] = fd1;
-    hidl_handle h1 = hidl_handle(nativeHandle1);
-
-    native_handle_t* nativeHandle2 = native_handle_create(1, 0);
-    nativeHandle2->data[0] = fd2;
-    hidl_handle h2 = hidl_handle(nativeHandle2);
-
-    if(h1->numFds == 1 && h2->numFds == 1) {
-        ALOGE("Num FDs for both is 1");
-    } else {
-        ALOGE("num FDs not 1: %d %d", h1->numFds, h2->numFds);
+    unique_fd fd2(netlinkSocket(kFd2Groups));
+    if (fd2.get() < 0) {
+        ALOGE("Unable to create conntrack handles: %d/%s", errno, strerror(errno));
+        FAIL();
     }
+    native_handle_t* const nativeHandle2 = native_handle_create(1, 0);
+    nativeHandle2->data[0] = fd2.release();
+    const hidl_handle h2 = hidl_handle(nativeHandle2);
 
-    auto cb = [&](bool success, const hidl_string& errMsg) {
-        ASSERT_TRUE(success) << errMsg.c_str();
-    };
-
-    Return<void> ret = config->setHandles(h1, h2, cb);
+    const Return<void> ret = config->setHandles(h1, h2, ASSERT_TRUE_CALLBACK);
     ASSERT_TRUE(ret.isOk());
 }
 
-/**
- * Negative testcase
- * Passing a handle without an associated FD should return an
- * error (Failed Input Checks). Check that this occurs when
- * neither handle has an associated FD.
-                                                                */
+// Passing a handle without an associated file descriptor should return an error
+// (e.g. "Failed Input Checks"). Check that this occurs when both FDs are empty.
 TEST_F(OffloadConfigHidlTest, TestSetHandleNone) {
-    native_handle_t* nativeHandle1 = native_handle_create(0, 0);
-    hidl_handle h1 = hidl_handle(nativeHandle1);
-    native_handle_t* nativeHandle2 = native_handle_create(0, 0);
-    hidl_handle h2 = hidl_handle(nativeHandle2);
+    native_handle_t* const nativeHandle1 = native_handle_create(0, 0);
+    const hidl_handle h1 = hidl_handle(nativeHandle1);
+    native_handle_t* const nativeHandle2 = native_handle_create(0, 0);
+    const hidl_handle h2 = hidl_handle(nativeHandle2);
 
-    auto cb = [&](bool success, const hidl_string& errMsg) {
-        ASSERT_FALSE(success) << errMsg.c_str();
-    };
-
-    Return<void> ret = config->setHandles(h1, h2, cb);
+    const Return<void> ret = config->setHandles(h1, h2, ASSERT_FALSE_CALLBACK);
     ASSERT_TRUE(ret.isOk());
 }
 
-/**
- * Negative testcase
- * Passing a handle without an associated FD should return an
- * error (Failed Input Checks). Check that this occurs with FD2.
- */
+// Passing a handle without an associated file descriptor should return an error
+// (e.g. "Failed Input Checks"). Check that this occurs when FD2 is empty.
 TEST_F(OffloadConfigHidlTest, TestSetHandle1Only) {
-    android::base::unique_fd
-        fd1(conntrackSocket(NFNLGRP_CONNTRACK_NEW | NFNLGRP_CONNTRACK_DESTROY));
+    unique_fd fd1(netlinkSocket(kFd1Groups));
+    if (fd1.get() < 0) {
+        ALOGE("Unable to create conntrack handles: %d/%s", errno, strerror(errno));
+        FAIL();
+    }
+    native_handle_t* const nativeHandle1 = native_handle_create(1, 0);
+    nativeHandle1->data[0] = fd1.release();
+    const hidl_handle h1 = hidl_handle(nativeHandle1);
 
-    native_handle_t* nativeHandle1 = native_handle_create(1, 0);
-    nativeHandle1->data[0] = fd1;
-    hidl_handle h1 = hidl_handle(nativeHandle1);
-    native_handle_t* nativeHandle2 = native_handle_create(0, 0);
-    hidl_handle h2 = hidl_handle(nativeHandle2);
+    native_handle_t* const nativeHandle2 = native_handle_create(0, 0);
+    const hidl_handle h2 = hidl_handle(nativeHandle2);
 
-    auto cb = [&](bool success, const hidl_string& errMsg) {
-        ASSERT_FALSE(success) << errMsg.c_str();
-    };
-
-    Return<void> ret = config->setHandles(h1, h2, cb);
+    const Return<void> ret = config->setHandles(h1, h2, ASSERT_FALSE_CALLBACK);
     ASSERT_TRUE(ret.isOk());
 }
 
-/**
- * Negative testcase
- * Passing a handle without an associated FD should return an
- * error (Failed Input Checks). Check that this occurs with FD1.
- */
+// Passing a handle without an associated file descriptor should return an error
+// (e.g. "Failed Input Checks"). Check that this occurs when FD1 is empty.
 TEST_F(OffloadConfigHidlTest, TestSetHandle2OnlyNotOk) {
-    android::base::unique_fd
-        fd2(conntrackSocket(NFNLGRP_CONNTRACK_UPDATE | NFNLGRP_CONNTRACK_DESTROY));
+    native_handle_t* const nativeHandle1 = native_handle_create(0, 0);
+    const hidl_handle h1 = hidl_handle(nativeHandle1);
 
-    native_handle_t* nativeHandle1 = native_handle_create(0, 0);
-    hidl_handle h1 = hidl_handle(nativeHandle1);
-    native_handle_t* nativeHandle2 = native_handle_create(1, 0);
-    nativeHandle2->data[0] = fd2;
-    hidl_handle h2 = hidl_handle(nativeHandle2);
+    unique_fd fd2(netlinkSocket(kFd2Groups));
+    if (fd2.get() < 0) {
+        ALOGE("Unable to create conntrack handles: %d/%s", errno, strerror(errno));
+        FAIL();
+    }
+    native_handle_t* const nativeHandle2 = native_handle_create(1, 0);
+    nativeHandle2->data[0] = fd2.release();
+    const hidl_handle h2 = hidl_handle(nativeHandle2);
 
-    auto cb = [&](bool success, const hidl_string& errMsg) {
-        ASSERT_FALSE(success) << errMsg.c_str();
-    };
-
-    Return<void> ret = config->setHandles(h1, h2, cb);
+    const Return<void> ret = config->setHandles(h1, h2, ASSERT_FALSE_CALLBACK);
     ASSERT_TRUE(ret.isOk());
 }