Add Error callback from Offload HAL

Error callback to report errors in Offload HAL service. Included VTS
tests to verify these callbacks are invoked.

Bug: 32842314
Test: Unit tests
Change-Id: I389b28b6ed5db7782ce6425beae67f5bdc2cf4aa
diff --git a/wifi/offload/1.0/IOffloadCallback.hal b/wifi/offload/1.0/IOffloadCallback.hal
index 4599370..4888125 100644
--- a/wifi/offload/1.0/IOffloadCallback.hal
+++ b/wifi/offload/1.0/IOffloadCallback.hal
@@ -22,4 +22,11 @@
      * @param scanResult a vector of scan result objects
      */
     oneway onScanResult(vec<ScanResult> scanResult);
+    /**
+     * Interface for the Offload HAL to inform the client of error conditions
+     * see OffloadStatus for the error conditions to be reported
+     *
+     * @param status OffloadStatus
+     */
+    oneway onError(OffloadStatus status);
 };
diff --git a/wifi/offload/1.0/types.hal b/wifi/offload/1.0/types.hal
index 870d2d3..38d5eda 100644
--- a/wifi/offload/1.0/types.hal
+++ b/wifi/offload/1.0/types.hal
@@ -199,6 +199,20 @@
     vec<LogRecord> logRecord;
 };
 
+/**
+ * Defines a list of return codes to indicate status of Offload HAL
+ */
+enum OffloadStatus : uint32_t {
+    /* No error */
+    OFFLOAD_STATUS_OK,
+    /* No Connection to underlying implementation */
+    OFFLOAD_STATUS_NO_CONNECTION,
+    /* Operation timeout */
+    OFFLOAD_STATUS_TIMEOUT,
+    /* Other errors */
+    OFFLOAD_STATUS_ERROR
+};
+
 
 
 
diff --git a/wifi/offload/1.0/vts/functional/VtsHalWifiOffloadV1_0TargetTest.cpp b/wifi/offload/1.0/vts/functional/VtsHalWifiOffloadV1_0TargetTest.cpp
index 630922a..3020542 100644
--- a/wifi/offload/1.0/vts/functional/VtsHalWifiOffloadV1_0TargetTest.cpp
+++ b/wifi/offload/1.0/vts/functional/VtsHalWifiOffloadV1_0TargetTest.cpp
@@ -21,6 +21,7 @@
 #include <android/hardware/wifi/offload/1.0/IOffloadCallback.h>
 #include <android/hardware/wifi/offload/1.0/types.h>
 
+#include <VtsHalHidlTargetCallbackBase.h>
 #include <VtsHalHidlTargetTestBase.h>
 
 #include <vector>
@@ -31,13 +32,31 @@
 using ::android::hardware::wifi::offload::V1_0::ScanParam;
 using ::android::hardware::wifi::offload::V1_0::ScanFilter;
 using ::android::hardware::wifi::offload::V1_0::ScanStats;
+using ::android::hardware::wifi::offload::V1_0::OffloadStatus;
 using ::android::hardware::Return;
 using ::android::hardware::Void;
 using ::android::hardware::hidl_vec;
 using ::android::sp;
 
-typedef std::function<void(const std::vector<ScanResult>& scanResult)>
-    OnOffloadScanResultsReadyHandler;
+constexpr char kOffloadCallbackSendScanResult[] = "onScanResult";
+constexpr char kOffloadCallbackSendError[] = "onError";
+
+namespace {
+const uint8_t kSsid[] = {'G', 'o', 'o', 'g', 'l', 'e'};
+const uint8_t kBssid[6] = {0x12, 0xef, 0xa1, 0x2c, 0x97, 0x8b};
+const int16_t kRssi = -60;
+const uint32_t kFrequency = 2412;
+const uint8_t kBssidSize = 6;
+const uint64_t kTsf = 0;
+const uint16_t kCapability = 0;
+const uint8_t kNetworkFlags = 0;
+}
+
+class OffloadCallbackArgs {
+   public:
+    hidl_vec<ScanResult> scan_results_;
+    OffloadStatus error_code_;
+};
 
 // The main test class for WifiOffload HIDL HAL.
 class WifiOffloadHidlTest : public ::testing::VtsHalHidlTargetTestBase {
@@ -47,43 +66,39 @@
             ::testing::VtsHalHidlTargetTestBase::getService<IOffload>();
         ASSERT_NE(wifi_offload_, nullptr);
 
-        wifi_offload_cb_ = new OffloadCallback(
-            [this](std::vector<ScanResult> scanResult) -> void {
-                this->reportScanResults(scanResult);
-            });
+        wifi_offload_cb_ = new OffloadCallback();
         ASSERT_NE(wifi_offload_cb_, nullptr);
-
-        defaultSize = 0;
     }
 
     virtual void TearDown() override {}
 
-    void reportScanResults(std::vector<ScanResult> scanResult) {
-        defaultSize = scanResult.size();
-    }
-
-    /* Callback class for scanResult. */
-    class OffloadCallback : public IOffloadCallback {
+    /* Callback class for Offload HAL. */
+    class OffloadCallback
+        : public ::testing::VtsHalHidlTargetCallbackBase<OffloadCallbackArgs>,
+          public IOffloadCallback {
        public:
-        OffloadCallback(OnOffloadScanResultsReadyHandler handler)
-            : handler_(handler){};
+        OffloadCallback(){};
 
         virtual ~OffloadCallback() = default;
 
         Return<void> onScanResult(
-            const hidl_vec<ScanResult>& scanResult) override {
-            const std::vector<ScanResult> scanResult_(scanResult);
-            handler_(scanResult_);
+            const hidl_vec<ScanResult>& scan_result) override {
+            OffloadCallbackArgs args;
+            args.scan_results_ = scan_result;
+            NotifyFromCallback(kOffloadCallbackSendScanResult, args);
             return Void();
         };
 
-       private:
-        OnOffloadScanResultsReadyHandler handler_;
+        Return<void> onError(OffloadStatus status) {
+            OffloadCallbackArgs args;
+            args.error_code_ = status;
+            NotifyFromCallback(kOffloadCallbackSendError, args);
+            return Void();
+        }
     };
 
     sp<IOffload> wifi_offload_;
-    sp<IOffloadCallback> wifi_offload_cb_;
-    int defaultSize = 0;
+    sp<OffloadCallback> wifi_offload_cb_;
 };
 
 /*
@@ -133,6 +148,38 @@
     ASSERT_EQ(returnObject.isOk(), true);
 }
 
+/*
+ * Verify that onScanResult callback is invoked
+ */
+TEST_F(WifiOffloadHidlTest, getScanResults) {
+    wifi_offload_->setEventCallback(wifi_offload_cb_);
+    std::vector<ScanResult> scan_results;
+    std::vector<uint8_t> ssid(kSsid, kSsid + sizeof(kSsid));
+    ScanResult scan_result;
+    scan_result.tsf = kTsf;
+    scan_result.rssi = kRssi;
+    scan_result.frequency = kFrequency;
+    scan_result.capability = kCapability;
+    memcpy(&scan_result.bssid[0], &kBssid[0], kBssidSize);
+    scan_result.networkInfo.ssid = ssid;
+    scan_result.networkInfo.flags = kNetworkFlags;
+    scan_results.push_back(scan_result);
+    wifi_offload_cb_->onScanResult(scan_results);
+    auto res =
+        wifi_offload_cb_->WaitForCallback(kOffloadCallbackSendScanResult);
+    ASSERT_EQ(res.no_timeout, true);
+}
+
+/*
+ * Verify that onError callback is invoked
+ */
+TEST_F(WifiOffloadHidlTest, getError) {
+    wifi_offload_->setEventCallback(wifi_offload_cb_);
+    wifi_offload_cb_->onError(OffloadStatus::OFFLOAD_STATUS_ERROR);
+    auto res = wifi_offload_cb_->WaitForCallback(kOffloadCallbackSendError);
+    ASSERT_EQ(res.no_timeout, true);
+}
+
 // A class for test environment setup
 class WifiOffloadHalHidlEnvironment : public ::testing::Environment {
    public: