11ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius/*
21ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius * Copyright (C) 2016 The Android Open Source Project
31ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius *
41ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius * Licensed under the Nanache License, Version 2.0 (the "License");
51ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius * you may not use this file except in compliance with the License.
61ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius * You may obtain a copy of the License at
71ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius *
81ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius *      http://www.apache.org/licenses/LICENSE-2.0
91ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius *
101ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius * Unless required by applicable law or agreed to in writing, software
111ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius * distributed under the License is distributed on an "AS IS" BASIS,
121ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius * See the License for the specific language governing permissions and
141ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius * limitations under the License.
151ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius */
161ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius
171ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius#include <android-base/logging.h>
181ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius
191ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius#include <android/hardware/wifi/1.0/IWifiNanIface.h>
2080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen#include <android/hardware/wifi/1.0/IWifiNanIfaceEventCallback.h>
211ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius
226b8720110bf2d40ac1364c364a85c31b358889f1Yuexi Ma#include <VtsHalHidlTargetTestBase.h>
2380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen#include <chrono>
2480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen#include <condition_variable>
2580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen#include <mutex>
261ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius
2780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen#include "wifi_hidl_call_util.h"
281ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius#include "wifi_hidl_test_utils.h"
291ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius
3080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohenusing namespace ::android::hardware::wifi::V1_0;
3180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
3280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohenusing ::android::hardware::Return;
3380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohenusing ::android::hardware::Void;
341ae4cbbb82d778a8945c78a569331c1616842befRoshan Piususing ::android::sp;
351ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius
3680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen#define TIMEOUT_PERIOD 10
3780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
381ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius/**
391ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius * Fixture to use for all NAN Iface HIDL interface tests.
401ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius */
416b8720110bf2d40ac1364c364a85c31b358889f1Yuexi Maclass WifiNanIfaceHidlTest : public ::testing::VtsHalHidlTargetTestBase {
4280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  public:
4380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen    virtual void SetUp() override {
4480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      iwifiNanIface = getWifiNanIface();
4580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      ASSERT_NE(nullptr, iwifiNanIface.get());
4680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      ASSERT_EQ(WifiStatusCode::SUCCESS, HIDL_INVOKE(iwifiNanIface, registerEventCallback,
4780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            new WifiNanIfaceEventCallback(*this)).code);
4880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen    }
4980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
5080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen    virtual void TearDown() override {
5180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      stopWifi();
5280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen    }
5380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
5480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen    /* Used as a mechanism to inform the test about data/event callback */
5580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen    inline void notify() {
5680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      std::unique_lock<std::mutex> lock(mtx_);
5780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      count_++;
5880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      cv_.notify_one();
5980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen    }
6080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
6180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen    enum CallbackType {
6280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        INVALID = -2,
6380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        ANY_CALLBACK = -1,
6480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
6580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        NOTIFY_CAPABILITIES_RESPONSE = 0,
6680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        NOTIFY_ENABLE_RESPONSE,
6780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        NOTIFY_CONFIG_RESPONSE,
6880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        NOTIFY_DISABLE_RESPONSE,
6980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        NOTIFY_START_PUBLISH_RESPONSE,
7080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        NOTIFY_STOP_PUBLISH_RESPONSE,
7180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        NOTIFY_START_SUBSCRIBE_RESPONSE,
7280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        NOTIFY_STOP_SUBSCRIBE_RESPONSE,
7380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        NOTIFY_TRANSMIT_FOLLOWUP_RESPONSE,
7480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        NOTIFY_CREATE_DATA_INTERFACE_RESPONSE,
7580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        NOTIFY_DELETE_DATA_INTERFACE_RESPONSE,
7680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        NOTIFY_INITIATE_DATA_PATH_RESPONSE,
7780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        NOTIFY_RESPOND_TO_DATA_PATH_INDICATION_RESPONSE,
7880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        NOTIFY_TERMINATE_DATA_PATH_RESPONSE,
7980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
8080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        EVENT_CLUSTER_EVENT,
8180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        EVENT_DISABLED,
8280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        EVENT_PUBLISH_TERMINATED,
8380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        EVENT_SUBSCRIBE_TERMINATED,
8480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        EVENT_MATCH,
8580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        EVENT_MATCH_EXPIRED,
8680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        EVENT_FOLLOWUP_RECEIVED,
8780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        EVENT_TRANSMIT_FOLLOWUP,
8880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        EVENT_DATA_PATH_REQUEST,
8980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        EVENT_DATA_PATH_CONFIRM,
9080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        EVENT_DATA_PATH_TERMINATED
9180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen    };
9280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
9380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen    /* Test code calls this function to wait for data/event callback */
9480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen    inline std::cv_status wait(CallbackType waitForCallbackType) {
9580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      std::unique_lock<std::mutex> lock(mtx_);
9680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
9780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      EXPECT_NE(INVALID, waitForCallbackType); // can't ASSERT in a non-void-returning method
9880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
9980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      callbackType = INVALID;
10080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      std::cv_status status = std::cv_status::no_timeout;
10180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      auto now = std::chrono::system_clock::now();
10280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      while (count_ == 0) {
10380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        status = cv_.wait_until(lock, now + std::chrono::seconds(TIMEOUT_PERIOD));
10480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        if (status == std::cv_status::timeout) return status;
10580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        if (waitForCallbackType != ANY_CALLBACK && callbackType != INVALID
10680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            && callbackType != waitForCallbackType) {
10780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen          count_--;
10880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        }
10980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
11080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      count_--;
11180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      return status;
11280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen    }
11380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
11480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen    class WifiNanIfaceEventCallback: public IWifiNanIfaceEventCallback {
11580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      WifiNanIfaceHidlTest& parent_;
11680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
11780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen     public:
11880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      WifiNanIfaceEventCallback(WifiNanIfaceHidlTest& parent) : parent_(parent) {};
11980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
12080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      virtual ~WifiNanIfaceEventCallback() = default;
12180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
12280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> notifyCapabilitiesResponse(
12380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint16_t id,
12480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const WifiNanStatus& status,
12580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const NanCapabilities& capabilities) override {
12680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = NOTIFY_CAPABILITIES_RESPONSE;
12780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
12880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.id = id;
12980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.status = status;
13080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.capabilities = capabilities;
13180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
13280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
13380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
13480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
13580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
13680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> notifyEnableResponse(
13780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint16_t id,
13880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const WifiNanStatus& status) override {
13980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = NOTIFY_ENABLE_RESPONSE;
14080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
14180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.id = id;
14280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.status = status;
14380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
14480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
14580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
14680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
14780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
14880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> notifyConfigResponse(
14980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint16_t id,
15080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const WifiNanStatus& status) override {
15180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = NOTIFY_CONFIG_RESPONSE;
15280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
15380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.id = id;
15480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.status = status;
15580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
15680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
15780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
15880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
15980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
16080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> notifyDisableResponse(
16180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint16_t id,
16280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const WifiNanStatus& status) override {
16380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = NOTIFY_DISABLE_RESPONSE;
16480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
16580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.id = id;
16680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.status = status;
16780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
16880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
16980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
17080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
17180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
17280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> notifyStartPublishResponse(
17380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint16_t id,
17480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const WifiNanStatus& status,
17580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint8_t sessionId) override {
17680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = NOTIFY_START_PUBLISH_RESPONSE;
17780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
17880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.id = id;
17980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.status = status;
18080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.sessionId = sessionId;
18180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
18280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
18380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
18480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
18580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
18680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> notifyStopPublishResponse(
18780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint16_t id,
18880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const WifiNanStatus& status) override {
18980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = NOTIFY_STOP_PUBLISH_RESPONSE;
19080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
19180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.id = id;
19280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.status = status;
19380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
19480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
19580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
19680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
19780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
19880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> notifyStartSubscribeResponse(
19980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint16_t id,
20080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const WifiNanStatus& status,
20180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint8_t sessionId) override {
20280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = NOTIFY_START_SUBSCRIBE_RESPONSE;
20380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
20480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.id = id;
20580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.status = status;
20680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.sessionId = sessionId;
20780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
20880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
20980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
21080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
21180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
21280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> notifyStopSubscribeResponse(
21380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint16_t id,
21480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const WifiNanStatus& status) override {
21580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = NOTIFY_STOP_SUBSCRIBE_RESPONSE;
21680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
21780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.id = id;
21880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.status = status;
21980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
22080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
22180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
22280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
22380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
22480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> notifyTransmitFollowupResponse(
22580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint16_t id,
22680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const WifiNanStatus& status) override {
22780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = NOTIFY_TRANSMIT_FOLLOWUP_RESPONSE;
22880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
22980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.id = id;
23080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.status = status;
23180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
23280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
23380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
23480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
23580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
23680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> notifyCreateDataInterfaceResponse(
23780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint16_t id,
23880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const WifiNanStatus& status) override {
23980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = NOTIFY_CREATE_DATA_INTERFACE_RESPONSE;
24080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
24180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.id = id;
24280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.status = status;
24380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
24480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
24580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
24680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
24780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
24880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> notifyDeleteDataInterfaceResponse(
24980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint16_t id,
25080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const WifiNanStatus& status) override {
25180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = NOTIFY_DELETE_DATA_INTERFACE_RESPONSE;
25280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
25380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.id = id;
25480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.status = status;
25580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
25680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
25780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
25880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
25980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
26080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> notifyInitiateDataPathResponse(
26180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint16_t id,
26280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const WifiNanStatus& status,
26380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint32_t ndpInstanceId) override {
26480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = NOTIFY_INITIATE_DATA_PATH_RESPONSE;
26580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
26680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.id = id;
26780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.status = status;
26880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.ndpInstanceId = ndpInstanceId;
26980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
27080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
27180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
27280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
2731ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius
27480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> notifyRespondToDataPathIndicationResponse(
27580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint16_t id,
27680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const WifiNanStatus& status) override {
27780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = NOTIFY_RESPOND_TO_DATA_PATH_INDICATION_RESPONSE;
2781ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius
27980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.id = id;
28080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.status = status;
28180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
28280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
28380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
28480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
28580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
28680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> notifyTerminateDataPathResponse(
28780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint16_t id,
28880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const WifiNanStatus& status) override {
28980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = NOTIFY_TERMINATE_DATA_PATH_RESPONSE;
29080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
29180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.id = id;
29280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.status = status;
29380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
29480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
29580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
29680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
29780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
29880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> eventClusterEvent(
29980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const NanClusterEventInd& event) override {
30080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = EVENT_CLUSTER_EVENT;
30180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
30280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.nanClusterEventInd = event;
30380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
30480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
30580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
30680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
30780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
30880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> eventDisabled(
30980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const WifiNanStatus& status) override {
31080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = EVENT_DISABLED;
31180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
31280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.status = status;
31380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
31480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
31580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
31680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
31780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
31880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> eventPublishTerminated(
31980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint8_t sessionId,
32080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const WifiNanStatus& status) override {
32180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = EVENT_PUBLISH_TERMINATED;
32280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
32380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.sessionId = sessionId;
32480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.status = status;
32580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
32680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
32780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
32880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
32980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
33080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> eventSubscribeTerminated(
33180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint8_t sessionId,
33280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const WifiNanStatus& status) override {
33380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = EVENT_SUBSCRIBE_TERMINATED;
33480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
33580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.sessionId = sessionId;
33680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.status = status;
33780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
33880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
33980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
34080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
34180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
34280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> eventMatch(
34380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const NanMatchInd& event) override {
34480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = EVENT_MATCH;
34580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
34680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.nanMatchInd = event;
34780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
34880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
34980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
35080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
35180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
35280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> eventMatchExpired(
35380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint8_t discoverySessionId,
35480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint32_t peerId) override {
35580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = EVENT_MATCH_EXPIRED;
35680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
35780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.sessionId = discoverySessionId;
35880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.peerId = peerId;
35980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
36080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
36180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
36280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
36380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
36480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> eventFollowupReceived(
36580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const NanFollowupReceivedInd& event) override {
36680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = EVENT_FOLLOWUP_RECEIVED;
36780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
36880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.nanFollowupReceivedInd = event;
36980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
37080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
37180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
37280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
37380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
37480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> eventTransmitFollowup(
37580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint16_t id,
37680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const WifiNanStatus& status) override {
37780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = EVENT_TRANSMIT_FOLLOWUP;
37880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
37980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.id = id;
38080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.status = status;
38180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
38280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
38380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
38480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
38580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
38680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> eventDataPathRequest(
38780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const NanDataPathRequestInd& event) override {
38880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = EVENT_DATA_PATH_REQUEST;
38980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
39080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.nanDataPathRequestInd = event;
39180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
39280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
39380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
39480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
39580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
39680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> eventDataPathConfirm(
39780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            const NanDataPathConfirmInd& event) override {
39880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = EVENT_DATA_PATH_CONFIRM;
39980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
40080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.nanDataPathConfirmInd = event;
40180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
40280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
40380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
40480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
40580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
40680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      Return<void> eventDataPathTerminated(
40780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen            uint32_t ndpInstanceId) override {
40880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.callbackType = EVENT_DATA_PATH_TERMINATED;
40980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
41080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.ndpInstanceId = ndpInstanceId;
41180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
41280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        parent_.notify();
41380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        return Void();
41480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      }
41580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen    };
41680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
41780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen    private:
41880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      // synchronization objects
41980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      std::mutex mtx_;
42080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      std::condition_variable cv_;
42180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      int count_;
42280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
42380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen    protected:
42480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      android::sp<IWifiNanIface> iwifiNanIface;
42580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
42680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      // Data from IWifiNanIfaceEventCallback callbacks: this is the collection of all
42780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      // arguments to all callbacks. They are set by the callback (notifications or
42880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      // events) and can be retrieved by tests.
42980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      CallbackType callbackType;
43080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      uint16_t id;
43180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      WifiNanStatus status;
43280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      NanCapabilities capabilities;
43380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      uint8_t sessionId;
43480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      uint32_t ndpInstanceId;
43580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      NanClusterEventInd nanClusterEventInd;
43680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      NanMatchInd nanMatchInd;
43780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      uint32_t peerId;
43880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      NanFollowupReceivedInd nanFollowupReceivedInd;
43980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      NanDataPathRequestInd nanDataPathRequestInd;
44080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen      NanDataPathConfirmInd nanDataPathConfirmInd;
4411ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius};
4421ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius
4431ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius/*
4441ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius * Create:
4451ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius * Ensures that an instance of the IWifiNanIface proxy object is
4461ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius * successfully created.
4471ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius */
4481ae4cbbb82d778a8945c78a569331c1616842befRoshan PiusTEST(WifiNanIfaceHidlTestNoFixture, Create) {
44980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  ASSERT_NE(nullptr, getWifiNanIface().get());
45080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  stopWifi();
45180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen}
45280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
45380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen/*
45480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen * Fail: use past destruction
45580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen * Ensure that API calls fail with ERROR_WIFI_IFACE_INVALID when using an interface once wifi
45680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen * is disabled.
45780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen */
45880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan CohenTEST(WifiNanIfaceHidlTestNoFixture, FailOnIfaceInvalid) {
45980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  android::sp<IWifiNanIface> iwifiNanIface = getWifiNanIface();
46080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  ASSERT_NE(nullptr, iwifiNanIface.get());
46180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  stopWifi();
46280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  sleep(5); // make sure that all chips/interfaces are invalidated
46380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  ASSERT_EQ(WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
46480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen          HIDL_INVOKE(iwifiNanIface, getCapabilitiesRequest, 0).code);
46580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen}
46680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
46780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen/*
46880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen * getCapabilitiesRequest: validate that returns capabilities.
46980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen */
47080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan CohenTEST_F(WifiNanIfaceHidlTest, getCapabilitiesRequest) {
47180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  uint16_t inputCmdId = 10;
47280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  ASSERT_EQ(WifiStatusCode::SUCCESS,
47380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen        HIDL_INVOKE(iwifiNanIface, getCapabilitiesRequest, inputCmdId).code);
47480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  // wait for a callback
47580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  ASSERT_EQ(std::cv_status::no_timeout, wait(NOTIFY_CAPABILITIES_RESPONSE));
47680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  ASSERT_EQ(NOTIFY_CAPABILITIES_RESPONSE, callbackType);
47780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  ASSERT_EQ(id, inputCmdId);
47880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen
47980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  // check for reasonable capability values
48080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  EXPECT_GT(capabilities.maxConcurrentClusters, (unsigned int) 0);
48180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  EXPECT_GT(capabilities.maxPublishes, (unsigned int) 0);
48280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  EXPECT_GT(capabilities.maxSubscribes, (unsigned int) 0);
48380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  EXPECT_EQ(capabilities.maxServiceNameLen, (unsigned int) 255);
48480054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  EXPECT_EQ(capabilities.maxMatchFilterLen, (unsigned int) 255);
48580054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  EXPECT_GT(capabilities.maxTotalMatchFilterLen, (unsigned int) 255);
48680054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  EXPECT_EQ(capabilities.maxServiceSpecificInfoLen, (unsigned int) 255);
48780054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  EXPECT_GE(capabilities.maxExtendedServiceSpecificInfoLen, (unsigned int) 255);
48880054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  EXPECT_GT(capabilities.maxNdiInterfaces, (unsigned int) 0);
48980054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  EXPECT_GT(capabilities.maxNdpSessions, (unsigned int) 0);
49080054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  EXPECT_GT(capabilities.maxAppInfoLen, (unsigned int) 0);
49180054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  EXPECT_GT(capabilities.maxQueuedTransmitFollowupMsgs, (unsigned int) 0);
49280054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  EXPECT_GT(capabilities.maxSubscribeInterfaceAddresses, (unsigned int) 0);
49380054133dc500ab0c460d9b4e146cf70db7a6f0aEtan Cohen  EXPECT_NE(capabilities.supportedCipherSuites, (unsigned int) 0);
4941ae4cbbb82d778a8945c78a569331c1616842befRoshan Pius}
495