diff --git a/contexthub/1.0/vts/functional/VtsHalContexthubV1_0TargetTest.cpp b/contexthub/1.0/vts/functional/VtsHalContexthubV1_0TargetTest.cpp index a1d173bc32..83e12aed3a 100644 --- a/contexthub/1.0/vts/functional/VtsHalContexthubV1_0TargetTest.cpp +++ b/contexthub/1.0/vts/functional/VtsHalContexthubV1_0TargetTest.cpp @@ -30,10 +30,11 @@ #include #include -using ::android::hardware::Return; -using ::android::hardware::Void; +using ::android::sp; using ::android::hardware::hidl_string; using ::android::hardware::hidl_vec; +using ::android::hardware::Return; +using ::android::hardware::Void; using ::android::hardware::contexthub::V1_0::AsyncEventType; using ::android::hardware::contexthub::V1_0::ContextHub; using ::android::hardware::contexthub::V1_0::ContextHubMsg; @@ -43,7 +44,6 @@ using ::android::hardware::contexthub::V1_0::IContexthubCallback; using ::android::hardware::contexthub::V1_0::NanoAppBinary; using ::android::hardware::contexthub::V1_0::Result; using ::android::hardware::contexthub::V1_0::TransactionResult; -using ::android::sp; #define ASSERT_OK(result) ASSERT_EQ(result, Result::OK) #define EXPECT_OK(result) EXPECT_EQ(result, Result::OK) @@ -56,24 +56,23 @@ constexpr uint64_t kNonExistentAppId = 0x476f6f6754555555; // Helper that does explicit conversion of an enum class to its underlying/base // type. Useful for stream output of enum values. -template -constexpr typename std::underlying_type::type asBaseType( - EnumType value) { - return static_cast::type>(value); +template +constexpr typename std::underlying_type::type asBaseType(EnumType value) { + return static_cast::type>(value); } // Synchronously queries IContexthub::getHubs() and returns the result hidl_vec getHubsSync(sp hubApi) { - hidl_vec hubList; - std::promise barrier; + hidl_vec hubList; + std::promise barrier; - hubApi->getHubs([&hubList, &barrier](const hidl_vec& hubs) { - hubList = hubs; - barrier.set_value(); - }); - barrier.get_future().wait_for(std::chrono::seconds(1)); + hubApi->getHubs([&hubList, &barrier](const hidl_vec& hubs) { + hubList = hubs; + barrier.set_value(); + }); + barrier.get_future().wait_for(std::chrono::seconds(1)); - return hubList; + return hubList; } // Gets a list of valid hub IDs in the system @@ -119,62 +118,58 @@ class ContexthubHidlTest : public ::testing::TestWithParam handleClientMsg(const ContextHubMsg& /*msg*/) override { - ALOGD("Got client message callback"); - return Void(); - } + public: + virtual Return handleClientMsg(const ContextHubMsg& /*msg*/) override { + ALOGD("Got client message callback"); + return Void(); + } - virtual Return handleTxnResult( - uint32_t txnId, TransactionResult result) override { - ALOGD("Got transaction result callback for txnId %" PRIu32 " with result %" - PRId32, txnId, result); - return Void(); - } + virtual Return handleTxnResult(uint32_t txnId, TransactionResult result) override { + ALOGD("Got transaction result callback for txnId %" PRIu32 " with result %" PRId32, txnId, + result); + return Void(); + } - virtual Return handleHubEvent(AsyncEventType evt) override { - ALOGD("Got hub event callback for event type %" PRIu32, evt); - return Void(); - } + virtual Return handleHubEvent(AsyncEventType evt) override { + ALOGD("Got hub event callback for event type %" PRIu32, evt); + return Void(); + } - virtual Return handleAppAbort(uint64_t appId, uint32_t abortCode) - override { - ALOGD("Got app abort notification for appId 0x%" PRIx64 " with abort code " - "0x%" PRIx32, appId, abortCode); - return Void(); - } + virtual Return handleAppAbort(uint64_t appId, uint32_t abortCode) override { + ALOGD("Got app abort notification for appId 0x%" PRIx64 + " with abort code " + "0x%" PRIx32, + appId, abortCode); + return Void(); + } - virtual Return handleAppsInfo(const hidl_vec& /*appInfo*/) - override { - ALOGD("Got app info callback"); - return Void(); - } + virtual Return handleAppsInfo(const hidl_vec& /*appInfo*/) override { + ALOGD("Got app info callback"); + return Void(); + } }; // Wait for a callback to occur (signaled by the given future) up to the // provided timeout. If the future is invalid or the callback does not come // within the given time, returns false. -template -bool waitForCallback( - std::future future, - ReturnType *result, - std::chrono::milliseconds timeout = std::chrono::seconds(5)) { - auto expiration = std::chrono::system_clock::now() + timeout; +template +bool waitForCallback(std::future future, ReturnType* result, + std::chrono::milliseconds timeout = std::chrono::seconds(5)) { + auto expiration = std::chrono::system_clock::now() + timeout; - EXPECT_NE(result, nullptr); - EXPECT_TRUE(future.valid()); - if (result != nullptr && future.valid()) { - std::future_status status = future.wait_until(expiration); - EXPECT_NE(status, std::future_status::timeout) - << "Timed out waiting for callback"; + EXPECT_NE(result, nullptr); + EXPECT_TRUE(future.valid()); + if (result != nullptr && future.valid()) { + std::future_status status = future.wait_until(expiration); + EXPECT_NE(status, std::future_status::timeout) << "Timed out waiting for callback"; - if (status == std::future_status::ready) { - *result = future.get(); - return true; + if (status == std::future_status::ready) { + *result = future.get(); + return true; + } } - } - return false; + return false; } // Ensures that the metadata reported in getHubs() is sane @@ -199,169 +194,156 @@ TEST_P(ContexthubHidlTest, TestGetHubs) { } TEST_P(ContexthubHidlTest, TestRegisterCallback) { - ALOGD("TestRegisterCallback called, hubId %" PRIu32, getHubId()); - ASSERT_OK(registerCallback(new ContexthubCallbackBase())); + ALOGD("TestRegisterCallback called, hubId %" PRIu32, getHubId()); + ASSERT_OK(registerCallback(new ContexthubCallbackBase())); } TEST_P(ContexthubHidlTest, TestRegisterNullCallback) { - ALOGD("TestRegisterNullCallback called, hubId %" PRIu32, getHubId()); - ASSERT_OK(registerCallback(nullptr)); + ALOGD("TestRegisterNullCallback called, hubId %" PRIu32, getHubId()); + ASSERT_OK(registerCallback(nullptr)); } // Helper callback that puts the async appInfo callback data into a promise class QueryAppsCallback : public ContexthubCallbackBase { - public: - virtual Return handleAppsInfo(const hidl_vec& appInfo) - override { - ALOGD("Got app info callback with %zu apps", appInfo.size()); - promise.set_value(appInfo); - return Void(); - } + public: + virtual Return handleAppsInfo(const hidl_vec& appInfo) override { + ALOGD("Got app info callback with %zu apps", appInfo.size()); + promise.set_value(appInfo); + return Void(); + } - std::promise> promise; + std::promise> promise; }; // Calls queryApps() and checks the returned metadata TEST_P(ContexthubHidlTest, TestQueryApps) { - ALOGD("TestQueryApps called, hubId %u", getHubId()); - sp cb = new QueryAppsCallback(); - ASSERT_OK(registerCallback(cb)); + ALOGD("TestQueryApps called, hubId %u", getHubId()); + sp cb = new QueryAppsCallback(); + ASSERT_OK(registerCallback(cb)); - Result result = hubApi->queryApps(getHubId()); - ASSERT_OK(result); + Result result = hubApi->queryApps(getHubId()); + ASSERT_OK(result); - ALOGD("Waiting for app info callback"); - hidl_vec appList; - ASSERT_TRUE(waitForCallback(cb->promise.get_future(), &appList)); - for (const HubAppInfo &appInfo : appList) { - EXPECT_NE(appInfo.appId, UINT64_C(0)); - EXPECT_NE(appInfo.appId, kNonExistentAppId); - } + ALOGD("Waiting for app info callback"); + hidl_vec appList; + ASSERT_TRUE(waitForCallback(cb->promise.get_future(), &appList)); + for (const HubAppInfo& appInfo : appList) { + EXPECT_NE(appInfo.appId, UINT64_C(0)); + EXPECT_NE(appInfo.appId, kNonExistentAppId); + } } // Helper callback that puts the TransactionResult for the expectedTxnId into a // promise class TxnResultCallback : public ContexthubCallbackBase { - public: - virtual Return handleTxnResult( - uint32_t txnId, TransactionResult result) override { - ALOGD("Got transaction result callback for txnId %" PRIu32 " (expecting %" - PRIu32 ") with result %" PRId32, txnId, expectedTxnId, result); - if (txnId == expectedTxnId) { - promise.set_value(result); + public: + virtual Return handleTxnResult(uint32_t txnId, TransactionResult result) override { + ALOGD("Got transaction result callback for txnId %" PRIu32 " (expecting %" PRIu32 + ") with result %" PRId32, + txnId, expectedTxnId, result); + if (txnId == expectedTxnId) { + promise.set_value(result); + } + return Void(); } - return Void(); - } - uint32_t expectedTxnId = 0; - std::promise promise; + uint32_t expectedTxnId = 0; + std::promise promise; }; // Parameterized fixture that sets the callback to TxnResultCallback class ContexthubTxnTest : public ContexthubHidlTest { - public: - virtual void SetUp() override { - ContexthubHidlTest::SetUp(); - ASSERT_OK(registerCallback(cb)); - } + public: + virtual void SetUp() override { + ContexthubHidlTest::SetUp(); + ASSERT_OK(registerCallback(cb)); + } - sp cb = new TxnResultCallback(); + sp cb = new TxnResultCallback(); }; - // Checks cases where the hub implementation is expected to return an error, but // that error can be returned either synchronously or in the asynchronous // transaction callback. Returns an AssertionResult that can be used in // ASSERT/EXPECT_TRUE. Allows checking the sync result against 1 additional // allowed error code apart from OK and TRANSACTION_FAILED, which are always // allowed. -::testing::AssertionResult checkFailureSyncOrAsync( - Result result, Result allowedSyncResult, - std::future&& future) { - if (result == Result::OK) { - // No error reported synchronously - this is OK, but then we should get an - // async callback with a failure status - TransactionResult asyncResult; - if (!waitForCallback(std::forward>(future), - &asyncResult)) { - return ::testing::AssertionFailure() - << "Got successful sync result, then failed to receive async cb"; - } else if (asyncResult == TransactionResult::SUCCESS) { - return ::testing::AssertionFailure() - << "Got successful sync result, then unexpected successful async " - "result"; +::testing::AssertionResult checkFailureSyncOrAsync(Result result, Result allowedSyncResult, + std::future&& future) { + if (result == Result::OK) { + // No error reported synchronously - this is OK, but then we should get an + // async callback with a failure status + TransactionResult asyncResult; + if (!waitForCallback(std::forward>(future), &asyncResult)) { + return ::testing::AssertionFailure() + << "Got successful sync result, then failed to receive async cb"; + } else if (asyncResult == TransactionResult::SUCCESS) { + return ::testing::AssertionFailure() + << "Got successful sync result, then unexpected successful async " + "result"; + } + } else if (result != allowedSyncResult && result != Result::TRANSACTION_FAILED) { + return ::testing::AssertionFailure() + << "Got sync result " << asBaseType(result) << ", expected TRANSACTION_FAILED or " + << asBaseType(allowedSyncResult); } - } else if (result != allowedSyncResult && - result != Result::TRANSACTION_FAILED) { - return ::testing::AssertionFailure() << "Got sync result " - << asBaseType(result) << ", expected TRANSACTION_FAILED or " - << asBaseType(allowedSyncResult); - } - return ::testing::AssertionSuccess(); + return ::testing::AssertionSuccess(); } TEST_P(ContexthubTxnTest, TestSendMessageToNonExistentNanoApp) { - ContextHubMsg msg; - msg.appName = kNonExistentAppId; - msg.msgType = 1; - msg.msg.resize(4); - std::fill(msg.msg.begin(), msg.msg.end(), 0); + ContextHubMsg msg; + msg.appName = kNonExistentAppId; + msg.msgType = 1; + msg.msg.resize(4); + std::fill(msg.msg.begin(), msg.msg.end(), 0); - ALOGD("Sending message to non-existent nanoapp"); - Result result = hubApi->sendMessageToHub(getHubId(), msg); - if (result != Result::OK && - result != Result::BAD_PARAMS && - result != Result::TRANSACTION_FAILED) { - FAIL() << "Got result " << asBaseType(result) << ", expected OK, BAD_PARAMS" - << ", or TRANSACTION_FAILED"; - } + ALOGD("Sending message to non-existent nanoapp"); + Result result = hubApi->sendMessageToHub(getHubId(), msg); + if (result != Result::OK && result != Result::BAD_PARAMS && + result != Result::TRANSACTION_FAILED) { + FAIL() << "Got result " << asBaseType(result) << ", expected OK, BAD_PARAMS" + << ", or TRANSACTION_FAILED"; + } } TEST_P(ContexthubTxnTest, TestLoadEmptyNanoApp) { - cb->expectedTxnId = 0123; - NanoAppBinary emptyApp; + cb->expectedTxnId = 0123; + NanoAppBinary emptyApp; - emptyApp.appId = kNonExistentAppId; - emptyApp.appVersion = 1; - emptyApp.flags = 0; - emptyApp.targetChreApiMajorVersion = 1; - emptyApp.targetChreApiMinorVersion = 0; + emptyApp.appId = kNonExistentAppId; + emptyApp.appVersion = 1; + emptyApp.flags = 0; + emptyApp.targetChreApiMajorVersion = 1; + emptyApp.targetChreApiMinorVersion = 0; - ALOGD("Loading empty nanoapp"); - Result result = hubApi->loadNanoApp(getHubId(), emptyApp, cb->expectedTxnId); - EXPECT_TRUE(checkFailureSyncOrAsync(result, Result::BAD_PARAMS, - cb->promise.get_future())); + ALOGD("Loading empty nanoapp"); + Result result = hubApi->loadNanoApp(getHubId(), emptyApp, cb->expectedTxnId); + EXPECT_TRUE(checkFailureSyncOrAsync(result, Result::BAD_PARAMS, cb->promise.get_future())); } TEST_P(ContexthubTxnTest, TestUnloadNonexistentNanoApp) { - cb->expectedTxnId = 1234; + cb->expectedTxnId = 1234; - ALOGD("Unloading nonexistent nanoapp"); - Result result = hubApi->unloadNanoApp(getHubId(), kNonExistentAppId, - cb->expectedTxnId); - EXPECT_TRUE(checkFailureSyncOrAsync(result, Result::BAD_PARAMS, - cb->promise.get_future())); + ALOGD("Unloading nonexistent nanoapp"); + Result result = hubApi->unloadNanoApp(getHubId(), kNonExistentAppId, cb->expectedTxnId); + EXPECT_TRUE(checkFailureSyncOrAsync(result, Result::BAD_PARAMS, cb->promise.get_future())); } TEST_P(ContexthubTxnTest, TestEnableNonexistentNanoApp) { - cb->expectedTxnId = 2345; + cb->expectedTxnId = 2345; - ALOGD("Enabling nonexistent nanoapp"); - Result result = hubApi->enableNanoApp(getHubId(), kNonExistentAppId, - cb->expectedTxnId); - EXPECT_TRUE(checkFailureSyncOrAsync(result, Result::BAD_PARAMS, - cb->promise.get_future())); + ALOGD("Enabling nonexistent nanoapp"); + Result result = hubApi->enableNanoApp(getHubId(), kNonExistentAppId, cb->expectedTxnId); + EXPECT_TRUE(checkFailureSyncOrAsync(result, Result::BAD_PARAMS, cb->promise.get_future())); } TEST_P(ContexthubTxnTest, TestDisableNonexistentNanoApp) { - cb->expectedTxnId = 3456; + cb->expectedTxnId = 3456; - ALOGD("Disabling nonexistent nanoapp"); - Result result = hubApi->disableNanoApp(getHubId(), kNonExistentAppId, - cb->expectedTxnId); - EXPECT_TRUE(checkFailureSyncOrAsync(result, Result::BAD_PARAMS, - cb->promise.get_future())); + ALOGD("Disabling nonexistent nanoapp"); + Result result = hubApi->disableNanoApp(getHubId(), kNonExistentAppId, cb->expectedTxnId); + EXPECT_TRUE(checkFailureSyncOrAsync(result, Result::BAD_PARAMS, cb->promise.get_future())); } // Return the test parameters of a vecter of tuples for all IContexthub services and each of its hub