From dd05603f0f63aae62fdf7e2b978512f5b4c54580 Mon Sep 17 00:00:00 2001 From: Ningyuan Wang Date: Tue, 11 Apr 2017 11:11:46 -0700 Subject: [PATCH] Copy wifi_hidl_call_util.h for supplicant VTS test This copies wifi_hidl_call_util.h to supplicant cts directory so supplicant vts tests can use this to simplify code. Bug: 33457575 Test: compile, manual test Change-Id: I696475062d04d54fafae5c3323818ce1d1ff7d9d --- .../functional/supplicant_hidl_call_util.h | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 wifi/supplicant/1.0/vts/functional/supplicant_hidl_call_util.h diff --git a/wifi/supplicant/1.0/vts/functional/supplicant_hidl_call_util.h b/wifi/supplicant/1.0/vts/functional/supplicant_hidl_call_util.h new file mode 100644 index 0000000000..1c0fcec224 --- /dev/null +++ b/wifi/supplicant/1.0/vts/functional/supplicant_hidl_call_util.h @@ -0,0 +1,127 @@ +/* + * 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. + */ + +// This file is copied from +// hardware/interfaces/wifi/1.0/vts/functional/wifi_hidl_call_util.h +// Please make sure these two file are consistent. + +#pragma once + +#include +#include +#include +#include + +#include + +namespace { +namespace detail { +template +struct functionArgSaver; + +// Provides a std::function that takes one argument, and a buffer +// wherein the function will store its argument. The buffer has +// the same type as the argument, but with const and reference +// modifiers removed. +template +struct functionArgSaver> final { + using StorageT = typename std::remove_const< + typename std::remove_reference::type>::type; + + std::function saveArgs = [this](ArgT arg) { + this->saved_values = arg; + }; + + StorageT saved_values; +}; + +// Provides a std::function that takes two arguments, and a buffer +// wherein the function will store its arguments. The buffer is a +// std::pair, whose elements have the same types as the arguments +// (but with const and reference modifiers removed). +template +struct functionArgSaver> final { + using StorageT = + std::pair::type>::type, + typename std::remove_const< + typename std::remove_reference::type>::type>; + + std::function saveArgs = [this](Arg1T arg1, + Arg2T arg2) { + this->saved_values = {arg1, arg2}; + }; + + StorageT saved_values; +}; + +// Provides a std::function that takes three or more arguments, and a +// buffer wherein the function will store its arguments. The buffer is a +// std::tuple whose elements have the same types as the arguments (but +// with const and reference modifiers removed). +template +struct functionArgSaver> final { + using StorageT = std::tuple::type>::type...>; + + std::function saveArgs = [this](ArgT... arg) { + this->saved_values = {arg...}; + }; + + StorageT saved_values; +}; + +// Invokes |method| on |object|, providing |method| a CallbackT as the +// final argument. Returns a copy of the parameters that |method| provided +// to CallbackT. (The parameters are returned by value.) +template +typename functionArgSaver::StorageT invokeMethod( + MethodT method, ObjectT object, ArgT&&... methodArg) { + functionArgSaver result_buffer; + const auto& res = ((*object).*method)(std::forward(methodArg)..., + result_buffer.saveArgs); + EXPECT_TRUE(res.isOk()); + return result_buffer.saved_values; +} +} // namespace detail +} // namespace + +// Invokes |method| on |strong_pointer|, passing provided arguments through to +// |method|. +// +// Returns either: +// - A copy of the result callback parameter (for callbacks with a single +// parameter), OR +// - A pair containing a copy of the result callback parameters (for callbacks +// with two parameters), OR +// - A tuple containing a copy of the result callback paramters (for callbacks +// with three or more parameters). +// +// Example usage: +// EXPECT_EQ(WifiStatusCode::SUCCESS, +// HIDL_INVOKE(strong_pointer, methodReturningWifiStatus).code); +// EXPECT_EQ(WifiStatusCode::SUCCESS, +// HIDL_INVOKE(strong_pointer, methodReturningWifiStatusAndOneMore) +// .first.code); +// EXPECT_EQ(WifiStatusCode::SUCCESS, std::get<0>( +// HIDL_INVOKE(strong_pointer, methodReturningWifiStatusAndTwoMore)) +// .code); +#define HIDL_INVOKE(strong_pointer, method, ...) \ + (detail::invokeMethod< \ + std::remove_reference::type::method##_cb>( \ + &std::remove_reference::type::method, \ + strong_pointer, ##__VA_ARGS__))