Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d5cf73b authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Refactor and expand tetheroffload Control and Config VTS" into oc-dr1-dev

parents a11e731b 434b8d38
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
// 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",
+76 −91
Original line number Diff line number Diff line
@@ -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,39 +37,46 @@ using android::hardware::tetheroffload::config::V1_0::IOffloadConfig;
using android::hardware::Void;
using android::sp;

#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:
    virtual void SetUp() override {
@@ -77,104 +89,77 @@ public:
    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);

    auto cb = [&](bool success, const hidl_string& errMsg) {
        ASSERT_FALSE(success) << errMsg.c_str();
    };
    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);

    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));

    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);
    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);

    auto cb = [&](bool success, const hidl_string& errMsg) {
        ASSERT_FALSE(success) << errMsg.c_str();
    };
    native_handle_t* const nativeHandle2 = native_handle_create(0, 0);
    const hidl_handle h2 = hidl_handle(nativeHandle2);

    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* 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);
    native_handle_t* const nativeHandle1 = native_handle_create(0, 0);
    const hidl_handle h1 = hidl_handle(nativeHandle1);

    auto cb = [&](bool success, const hidl_string& errMsg) {
        ASSERT_FALSE(success) << errMsg.c_str();
    };
    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);

    Return<void> ret = config->setHandles(h1, h2, cb);
    const Return<void> ret = config->setHandles(h1, h2, ASSERT_FALSE_CALLBACK);
    ASSERT_TRUE(ret.isOk());
}

+15 −0
Original line number Diff line number Diff line
// 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: "VtsHalTetheroffloadControlV1_0TargetTest",
    defaults: ["hidl_defaults"],
@@ -5,6 +19,7 @@ cc_test {
    shared_libs: [
        "android.hardware.tetheroffload.config@1.0",
        "android.hardware.tetheroffload.control@1.0",
        "libbase",
        "libcutils",
        "libhidlbase",
        "libhidltransport",
+402 −655

File changed.

Preview size limit exceeded, changes collapsed.