1 /* 2 * Copyright (C) 2016 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 #include <android-base/logging.h> 18 #include <cutils/properties.h> 19 20 #include <VtsHalHidlTargetTestBase.h> 21 22 #include <android/hardware/wifi/supplicant/1.0/types.h> 23 #include <android/hardware/wifi/supplicant/1.1/ISupplicant.h> 24 25 #include "supplicant_hidl_test_utils.h" 26 #include "supplicant_hidl_test_utils_1_1.h" 27 28 using ::android::hardware::hidl_vec; 29 using ::android::hardware::wifi::supplicant::V1_0::ISupplicantIface; 30 using ::android::hardware::wifi::supplicant::V1_0::SupplicantStatus; 31 using ::android::hardware::wifi::supplicant::V1_0::SupplicantStatusCode; 32 using ::android::hardware::wifi::supplicant::V1_0::IfaceType; 33 using ::android::hardware::wifi::supplicant::V1_1::ISupplicant; 34 using ::android::sp; 35 36 extern WifiSupplicantHidlEnvironment* gEnv; 37 38 class SupplicantHidlTest : public ::testing::VtsHalHidlTargetTestBase { 39 public: 40 virtual void SetUp() override { 41 startSupplicantAndWaitForHidlService(); 42 supplicant_ = getSupplicant_1_1(); 43 ASSERT_NE(supplicant_.get(), nullptr); 44 } 45 46 virtual void TearDown() override { stopSupplicant(); } 47 48 protected: 49 // ISupplicant object used for all tests in this fixture. 50 sp<ISupplicant> supplicant_; 51 52 std::string getWlan0IfaceName() { 53 std::array<char, PROPERTY_VALUE_MAX> buffer; 54 property_get("wifi.interface", buffer.data(), "wlan0"); 55 return buffer.data(); 56 } 57 58 std::string getP2pIfaceName() { 59 std::array<char, PROPERTY_VALUE_MAX> buffer; 60 property_get("wifi.direct.interface", buffer.data(), "p2p0"); 61 return buffer.data(); 62 } 63 }; 64 65 /* 66 * AddStaInterface 67 */ 68 TEST_F(SupplicantHidlTest, AddStaInterface) { 69 ISupplicant::IfaceInfo iface_info; 70 iface_info.name = getWlan0IfaceName(); 71 iface_info.type = IfaceType::STA; 72 supplicant_->addInterface( 73 iface_info, 74 [&](const SupplicantStatus& status, const sp<ISupplicantIface>& iface) { 75 EXPECT_TRUE( 76 (status.code == SupplicantStatusCode::SUCCESS) || 77 (status.code == SupplicantStatusCode::FAILURE_IFACE_EXISTS)); 78 EXPECT_NE(nullptr, iface.get()); 79 }); 80 } 81 82 /* 83 * AddP2pInterface 84 */ 85 TEST_F(SupplicantHidlTest, AddP2pInterface) { 86 if (!gEnv->isP2pOn) return; 87 ISupplicant::IfaceInfo iface_info; 88 iface_info.name = getP2pIfaceName(); 89 iface_info.type = IfaceType::P2P; 90 supplicant_->addInterface( 91 iface_info, 92 [&](const SupplicantStatus& status, const sp<ISupplicantIface>& iface) { 93 EXPECT_TRUE( 94 (status.code == SupplicantStatusCode::SUCCESS) || 95 (status.code == SupplicantStatusCode::FAILURE_IFACE_EXISTS)); 96 EXPECT_NE(nullptr, iface.get()); 97 }); 98 } 99 100 /* 101 * RemoveStaInterface 102 */ 103 TEST_F(SupplicantHidlTest, RemoveStaInterface) { 104 ISupplicant::IfaceInfo iface_info; 105 iface_info.name = getWlan0IfaceName(); 106 iface_info.type = IfaceType::STA; 107 108 supplicant_->addInterface( 109 iface_info, 110 [&](const SupplicantStatus& status, const sp<ISupplicantIface>& iface) { 111 EXPECT_TRUE( 112 (status.code == SupplicantStatusCode::SUCCESS) || 113 (status.code == SupplicantStatusCode::FAILURE_IFACE_EXISTS)); 114 EXPECT_NE(nullptr, iface.get()); 115 }); 116 supplicant_->removeInterface( 117 iface_info, [&](const SupplicantStatus& status) { 118 EXPECT_EQ(SupplicantStatusCode::SUCCESS, status.code); 119 }); 120 } 121 122 /* 123 * RemoveP2pInterface 124 */ 125 TEST_F(SupplicantHidlTest, RemoveP2pInterface) { 126 if (!gEnv->isP2pOn) return; 127 ISupplicant::IfaceInfo iface_info; 128 iface_info.name = getP2pIfaceName(); 129 iface_info.type = IfaceType::P2P; 130 131 supplicant_->addInterface( 132 iface_info, 133 [&](const SupplicantStatus& status, const sp<ISupplicantIface>& iface) { 134 EXPECT_TRUE( 135 (status.code == SupplicantStatusCode::SUCCESS) || 136 (status.code == SupplicantStatusCode::FAILURE_IFACE_EXISTS)); 137 EXPECT_NE(nullptr, iface.get()); 138 }); 139 supplicant_->removeInterface( 140 iface_info, [&](const SupplicantStatus& status) { 141 EXPECT_EQ(SupplicantStatusCode::SUCCESS, status.code); 142 }); 143 } 144 145 /* 146 * Terminate 147 * This terminates the service. 148 */ 149 TEST_F(SupplicantHidlTest, Terminate) { 150 supplicant_->terminate(); 151 } 152