blob: c431f9d3b84c2a52ca8b3488aacfff6a75f73d0a [file] [log] [blame]
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "**** HAL log ****"
#include <aidl/Gtest.h>
#include <aidl/Vintf.h>
#include <android-base/logging.h>
#include <android/hardware/automotive/occupant_awareness/BnOccupantAwarenessClientCallback.h>
#include <android/hardware/automotive/occupant_awareness/IOccupantAwareness.h>
#include <binder/IServiceManager.h>
#include <binder/ProcessState.h>
#include <gtest/gtest.h>
#include <chrono>
#include <future>
#include <vector>
using namespace android::hardware::automotive::occupant_awareness;
using android::hardware::automotive::occupant_awareness::IOccupantAwareness;
using android::ProcessState;
using android::sp;
using android::String16;
using android::binder::Status;
constexpr auto kTimeout = std::chrono::seconds(3);
#define EXPECT_OK(ret) ASSERT_TRUE((ret).isOk())
class OccupantAwarenessCallback : public BnOccupantAwarenessClientCallback {
public:
OccupantAwarenessCallback(const std::function<void(int, OccupantAwarenessStatus)>& callback)
: mCallback(callback) {}
Status onSystemStatusChanged(int detectionFlags, OccupantAwarenessStatus status) override {
mCallback(detectionFlags, status);
return Status::ok();
}
Status onDetectionEvent(const OccupantDetections& detections) override {
(void)detections;
return Status::ok();
}
private:
std::function<void(int, OccupantAwarenessStatus)> mCallback;
};
class OccupantAwarenessAidl : public testing::TestWithParam<std::string> {
public:
virtual void SetUp() override {
mOccupantAwarenessService =
android::waitForDeclaredService<IOccupantAwareness>(String16(GetParam().c_str()));
ASSERT_NE(mOccupantAwarenessService, nullptr);
}
sp<IOccupantAwareness> mOccupantAwarenessService;
};
// Test that startDetection() returns within the timeout.
TEST_P(OccupantAwarenessAidl, StartDetectionTest) {
auto start = std::chrono::system_clock::now();
OccupantAwarenessStatus occupantAwarenessStatus;
Status status = mOccupantAwarenessService->startDetection(&occupantAwarenessStatus);
auto elapsed = std::chrono::system_clock::now() - start;
EXPECT_OK(status);
ASSERT_LE(elapsed, kTimeout);
EXPECT_OK(mOccupantAwarenessService->stopDetection(&occupantAwarenessStatus));
}
// Test that getCapabilityForRole() returns supported capabilities for the role. The test only
// verifies that the IPC call returns successfully and does not verify the supported capabilities.
TEST_P(OccupantAwarenessAidl, GetCapabilityTest) {
std::vector<Role> rolesToTest = {Role::FRONT_PASSENGER, Role::DRIVER,
Role::ROW_2_PASSENGER_LEFT, Role::ROW_2_PASSENGER_CENTER,
Role::ROW_2_PASSENGER_RIGHT, Role::ROW_3_PASSENGER_LEFT,
Role::ROW_3_PASSENGER_CENTER, Role::ROW_3_PASSENGER_RIGHT,
Role::FRONT_OCCUPANTS, Role::ROW_2_OCCUPANTS,
Role::ROW_3_OCCUPANTS, Role::ALL_OCCUPANTS};
for (auto role : rolesToTest) {
int32_t capabilities;
EXPECT_OK(mOccupantAwarenessService->getCapabilityForRole(role, &capabilities));
}
}
// Test that getCapabilityForRole() returns failure when arguments are invalid.
TEST_P(OccupantAwarenessAidl, GetCapabilityFailureTest) {
int32_t capabilities;
EXPECT_FALSE(
mOccupantAwarenessService->getCapabilityForRole(Role::INVALID, &capabilities).isOk());
Role invalidRole = static_cast<Role>(static_cast<int>(Role::ALL_OCCUPANTS) + 1);
EXPECT_FALSE(
mOccupantAwarenessService->getCapabilityForRole(invalidRole, &capabilities).isOk());
}
// Test that getState() returns within the timeout. The test do not attempt to verify the state, but
// only checks that the IPC call returns successfully.
TEST_P(OccupantAwarenessAidl, GetStateTest) {
std::vector<Role> rolesToTest = {Role::FRONT_PASSENGER, Role::DRIVER,
Role::ROW_2_PASSENGER_LEFT, Role::ROW_2_PASSENGER_CENTER,
Role::ROW_2_PASSENGER_RIGHT, Role::ROW_3_PASSENGER_LEFT,
Role::ROW_3_PASSENGER_CENTER, Role::ROW_3_PASSENGER_RIGHT,
Role::FRONT_OCCUPANTS, Role::ROW_2_OCCUPANTS,
Role::ROW_3_OCCUPANTS, Role::ALL_OCCUPANTS};
std::vector<int> detectionCapabilities = {IOccupantAwareness::CAP_PRESENCE_DETECTION,
IOccupantAwareness::CAP_GAZE_DETECTION,
IOccupantAwareness::CAP_DRIVER_MONITORING_DETECTION};
for (auto role : rolesToTest) {
for (auto detectionCapability : detectionCapabilities) {
OccupantAwarenessStatus oasStatus;
EXPECT_OK(mOccupantAwarenessService->getState(role, detectionCapability, &oasStatus));
}
}
}
// Test that getState() returns failure with invalid args.
TEST_P(OccupantAwarenessAidl, GetStateFailureTest) {
// Verify that getState() returns error when role is invalid (0).
OccupantAwarenessStatus oasStatus;
EXPECT_FALSE(mOccupantAwarenessService
->getState(Role::INVALID, IOccupantAwareness::CAP_PRESENCE_DETECTION,
&oasStatus)
.isOk());
// Verify that getState() returns error when role is invalid (invalid flag).
int invalidRole = static_cast<int>(Role::ALL_OCCUPANTS) + 1;
EXPECT_FALSE(mOccupantAwarenessService
->getState(static_cast<Role>(invalidRole),
IOccupantAwareness::CAP_PRESENCE_DETECTION, &oasStatus)
.isOk());
// Verify that getState() returns error when capability is invalid (none).
EXPECT_FALSE(mOccupantAwarenessService
->getState(Role::FRONT_PASSENGER, IOccupantAwareness::CAP_NONE, &oasStatus)
.isOk());
// Verify that getState() returns error when capability is invalid (invalid flag).
int invalidDetectionFlags = 0x10;
EXPECT_FALSE(mOccupantAwarenessService
->getState(Role::FRONT_PASSENGER, invalidDetectionFlags, &oasStatus)
.isOk());
}
// Test that setCallback() returns within the timeout.
TEST_P(OccupantAwarenessAidl, SetCallbackTest) {
sp<OccupantAwarenessCallback> callback =
new OccupantAwarenessCallback([](int detectionFlags, OccupantAwarenessStatus status) {
(void)detectionFlags;
(void)status;
});
auto start = std::chrono::system_clock::now();
Status status = mOccupantAwarenessService->setCallback(callback);
auto elapsed = std::chrono::system_clock::now() - start;
EXPECT_OK(status);
ASSERT_LE(elapsed, kTimeout);
}
// Test that setCallback() returns failure with invalid args.
TEST_P(OccupantAwarenessAidl, SetCallbackFailureTest) {
sp<OccupantAwarenessCallback> callback = nullptr;
Status status = mOccupantAwarenessService->setCallback(callback);
EXPECT_FALSE(status.isOk());
}
// Test that getLatestDetection() returns within the timeout.
TEST_P(OccupantAwarenessAidl, GetLatestDetectionTest) {
auto start = std::chrono::system_clock::now();
OccupantDetections detections;
// Do not check status here, since error status is returned when no detection is present.
(void)mOccupantAwarenessService->getLatestDetection(&detections);
auto elapsed = std::chrono::system_clock::now() - start;
ASSERT_LE(elapsed, kTimeout);
}
INSTANTIATE_TEST_SUITE_P(
InstantiationName, OccupantAwarenessAidl,
testing::ValuesIn(android::getAidlHalInstanceNames(IOccupantAwareness::descriptor)),
android::PrintInstanceNameToString);
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
ProcessState::self()->setThreadPoolMaxThreadCount(1);
ProcessState::self()->startThreadPool();
return RUN_ALL_TESTS();
}