Add VTS tests for findWithParams and
connectWithParams.

Bug: 322815584
Test: atest VtsHalWifiSupplicantP2pIfaceTargetTest
Change-Id: I58c59d045f2fbe5af4101d152a487954e8e16bd5
diff --git a/wifi/supplicant/aidl/vts/functional/supplicant_p2p_iface_aidl_test.cpp b/wifi/supplicant/aidl/vts/functional/supplicant_p2p_iface_aidl_test.cpp
index 2d6823f..2e22807 100644
--- a/wifi/supplicant/aidl/vts/functional/supplicant_p2p_iface_aidl_test.cpp
+++ b/wifi/supplicant/aidl/vts/functional/supplicant_p2p_iface_aidl_test.cpp
@@ -35,7 +35,9 @@
 using aidl::android::hardware::wifi::supplicant::ISupplicant;
 using aidl::android::hardware::wifi::supplicant::ISupplicantP2pIface;
 using aidl::android::hardware::wifi::supplicant::MiracastMode;
+using aidl::android::hardware::wifi::supplicant::P2pConnectInfo;
 using aidl::android::hardware::wifi::supplicant::P2pDeviceFoundEventParams;
+using aidl::android::hardware::wifi::supplicant::P2pDiscoveryInfo;
 using aidl::android::hardware::wifi::supplicant::P2pFrameTypeMask;
 using aidl::android::hardware::wifi::supplicant::P2pGoNegotiationReqEventParams;
 using aidl::android::hardware::wifi::supplicant::P2pGroupCapabilityMask;
@@ -45,6 +47,7 @@
 using aidl::android::hardware::wifi::supplicant::P2pPeerClientJoinedEventParams;
 using aidl::android::hardware::wifi::supplicant::P2pProvDiscStatusCode;
 using aidl::android::hardware::wifi::supplicant::P2pProvisionDiscoveryCompletedEventParams;
+using aidl::android::hardware::wifi::supplicant::P2pScanType;
 using aidl::android::hardware::wifi::supplicant::P2pStatusCode;
 using aidl::android::hardware::wifi::supplicant::SupplicantStatusCode;
 using aidl::android::hardware::wifi::supplicant::WpsConfigMethods;
@@ -69,6 +72,7 @@
 const uint32_t kTestGroupFreq = 0;
 const bool kTestGroupPersistent = false;
 const bool kTestGroupIsJoin = false;
+const auto& kTestVendorData = generateOuiKeyedDataList(5);
 
 }  // namespace
 
@@ -222,6 +226,7 @@
         initializeService();
         supplicant_ = getSupplicant(GetParam().c_str());
         ASSERT_NE(supplicant_, nullptr);
+        ASSERT_TRUE(supplicant_->getInterfaceVersion(&interface_version_).isOk());
         ASSERT_TRUE(supplicant_
                         ->setDebugParams(DebugLevel::EXCESSIVE,
                                          true,  // show timestamps
@@ -247,6 +252,7 @@
    protected:
     std::shared_ptr<ISupplicant> supplicant_;
     std::shared_ptr<ISupplicantP2pIface> p2p_iface_;
+    int interface_version_;
 };
 
 /*
@@ -550,6 +556,34 @@
 }
 
 /*
+ * FindWithParams
+ */
+TEST_P(SupplicantP2pIfaceAidlTest, FindWithParams) {
+    if (interface_version_ < 3) {
+        GTEST_SKIP() << "findWithParams is available as of Supplicant V3";
+    }
+
+    P2pDiscoveryInfo discoveryParams;
+    discoveryParams.timeoutInSec = kTestFindTimeout;
+    discoveryParams.vendorData = kTestVendorData;
+
+    discoveryParams.scanType = P2pScanType::FULL;
+    EXPECT_TRUE(p2p_iface_->findWithParams(discoveryParams).isOk());
+    EXPECT_TRUE(p2p_iface_->stopFind().isOk());
+    sleep(1);
+
+    discoveryParams.scanType = P2pScanType::SOCIAL;
+    EXPECT_TRUE(p2p_iface_->findWithParams(discoveryParams).isOk());
+    EXPECT_TRUE(p2p_iface_->stopFind().isOk());
+    sleep(1);
+
+    discoveryParams.scanType = P2pScanType::SPECIFIC_FREQ;
+    discoveryParams.frequencyMhz = 2412;
+    EXPECT_TRUE(p2p_iface_->findWithParams(discoveryParams).isOk());
+    EXPECT_TRUE(p2p_iface_->stopFind().isOk());
+}
+
+/*
  * StopFind
  */
 TEST_P(SupplicantP2pIfaceAidlTest, StopFind) {
@@ -576,6 +610,27 @@
 }
 
 /*
+ * ConnectWithParams
+ */
+TEST_P(SupplicantP2pIfaceAidlTest, ConnectWithParams) {
+    if (interface_version_ < 3) {
+        GTEST_SKIP() << "connectWithParams is available as of Supplicant V3";
+    }
+
+    P2pConnectInfo connectInfo;
+    connectInfo.peerAddress = vecToArrayMacAddr(kTestMacAddr);
+    connectInfo.provisionMethod = WpsProvisionMethod::PBC;
+    connectInfo.preSelectedPin = kTestConnectPin;
+    connectInfo.joinExistingGroup = true;
+    connectInfo.persistent = false;
+    connectInfo.goIntent = kTestConnectGoIntent;
+    connectInfo.vendorData = kTestVendorData;
+
+    std::string pin;
+    EXPECT_TRUE(p2p_iface_->connectWithParams(connectInfo, &pin).isOk());
+}
+
+/*
  * CancelConnect
  */
 TEST_P(SupplicantP2pIfaceAidlTest, CancelConnect) {
diff --git a/wifi/supplicant/aidl/vts/functional/supplicant_test_utils.h b/wifi/supplicant/aidl/vts/functional/supplicant_test_utils.h
index f2cb3f6..b38e669 100644
--- a/wifi/supplicant/aidl/vts/functional/supplicant_test_utils.h
+++ b/wifi/supplicant/aidl/vts/functional/supplicant_test_utils.h
@@ -16,14 +16,18 @@
 
 #pragma once
 
+#include <android/persistable_bundle_aidl.h>
+
 #include "supplicant_aidl_test_utils.h"
 #include "supplicant_legacy_test_utils.h"
 
+using aidl::android::hardware::wifi::common::OuiKeyedData;
 using aidl::android::hardware::wifi::supplicant::IfaceInfo;
 using aidl::android::hardware::wifi::supplicant::ISupplicant;
 using aidl::android::hardware::wifi::supplicant::ISupplicantP2pIface;
 using aidl::android::hardware::wifi::supplicant::ISupplicantStaIface;
 using aidl::android::hardware::wifi::supplicant::KeyMgmtMask;
+using aidl::android::os::PersistableBundle;
 
 std::string getStaIfaceName() {
     std::array<char, PROPERTY_VALUE_MAX> buffer;
@@ -91,3 +95,28 @@
     }
     return supplicant;
 }
+
+std::array<uint8_t, 6> vecToArrayMacAddr(std::vector<uint8_t> vectorAddr) {
+    std::array<uint8_t, 6> arrayAddr;
+    std::copy(vectorAddr.begin(), vectorAddr.begin() + 6, arrayAddr.begin());
+    return arrayAddr;
+}
+
+std::optional<OuiKeyedData> generateOuiKeyedData(int oui) {
+    PersistableBundle bundle;
+    bundle.putString("stringKey", "stringValue");
+    bundle.putInt("intKey", 12345);
+
+    OuiKeyedData data;
+    data.oui = oui;
+    data.vendorData = bundle;
+    return std::optional<OuiKeyedData>{data};
+}
+
+std::optional<std::vector<std::optional<OuiKeyedData>>> generateOuiKeyedDataList(int size) {
+    std::vector<std::optional<OuiKeyedData>> dataList;
+    for (int i = 0; i < size; i++) {
+        dataList.push_back(generateOuiKeyedData(i + 1));
+    }
+    return std::optional<std::vector<std::optional<OuiKeyedData>>>{dataList};
+}