723 lines
28 KiB
C++
723 lines
28 KiB
C++
/*
|
|
* Copyright (C) 2020 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.
|
|
*/
|
|
|
|
#include "UserHalHelper.h"
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
#include <cstdint>
|
|
|
|
#include "gmock/gmock.h"
|
|
|
|
namespace android {
|
|
namespace hardware {
|
|
namespace automotive {
|
|
namespace vehicle {
|
|
namespace V2_0 {
|
|
|
|
namespace user_hal_helper {
|
|
|
|
namespace {
|
|
|
|
using testing::Eq;
|
|
using testing::Gt;
|
|
using testing::IsNull;
|
|
using testing::NotNull;
|
|
using testing::Pointee;
|
|
|
|
constexpr int32_t INITIAL_USER_INFO = static_cast<int32_t>(VehicleProperty::INITIAL_USER_INFO);
|
|
constexpr int32_t SWITCH_USER = static_cast<int32_t>(VehicleProperty::SWITCH_USER);
|
|
constexpr int32_t CREATE_USER = static_cast<int32_t>(VehicleProperty::CREATE_USER);
|
|
constexpr int32_t REMOVE_USER = static_cast<int32_t>(VehicleProperty::REMOVE_USER);
|
|
constexpr int32_t USER_IDENTIFICATION_ASSOCIATION =
|
|
static_cast<int32_t>(VehicleProperty::USER_IDENTIFICATION_ASSOCIATION);
|
|
|
|
constexpr int32_t FIRST_BOOT_AFTER_OTA =
|
|
static_cast<int32_t>(InitialUserInfoRequestType::FIRST_BOOT_AFTER_OTA);
|
|
constexpr int32_t LEGACY_ANDROID_SWITCH =
|
|
static_cast<int32_t>(SwitchUserMessageType::LEGACY_ANDROID_SWITCH);
|
|
constexpr int32_t VEHICLE_REQUEST = static_cast<int32_t>(SwitchUserMessageType::VEHICLE_REQUEST);
|
|
|
|
constexpr int32_t GUEST_USER = static_cast<int32_t>(UserFlags::GUEST);
|
|
constexpr int32_t NONE_USER = static_cast<int32_t>(UserFlags::NONE);
|
|
constexpr int32_t SYSTEM_USER = static_cast<int32_t>(UserFlags::SYSTEM);
|
|
constexpr int32_t ADMIN_USER = static_cast<int32_t>(UserFlags::ADMIN);
|
|
constexpr int32_t SYSTEM_ADMIN_USER = static_cast<int32_t>(UserFlags::SYSTEM | UserFlags::ADMIN);
|
|
// 0x1111 is not a valid UserFlags combination.
|
|
constexpr int32_t INVALID_USER_FLAG = 0x1111;
|
|
|
|
constexpr int32_t USER_ID_ASSOC_KEY_FOB =
|
|
static_cast<int32_t>(UserIdentificationAssociationType::KEY_FOB);
|
|
constexpr int32_t USER_ID_ASSOC_CUSTOM_1 =
|
|
static_cast<int32_t>(UserIdentificationAssociationType::CUSTOM_1);
|
|
|
|
constexpr int32_t USER_ID_ASSOC_SET_CURRENT_USER =
|
|
static_cast<int32_t>(UserIdentificationAssociationSetValue::ASSOCIATE_CURRENT_USER);
|
|
constexpr int32_t USER_ID_ASSOC_UNSET_CURRENT_USER =
|
|
static_cast<int32_t>(UserIdentificationAssociationSetValue::DISASSOCIATE_CURRENT_USER);
|
|
|
|
constexpr int32_t USER_ID_ASSOC_CURRENT_USER =
|
|
static_cast<int32_t>(UserIdentificationAssociationValue::ASSOCIATED_CURRENT_USER);
|
|
constexpr int32_t USER_ID_ASSOC_NO_USER =
|
|
static_cast<int32_t>(UserIdentificationAssociationValue::NOT_ASSOCIATED_ANY_USER);
|
|
|
|
} // namespace
|
|
|
|
TEST(UserHalHelperTest, TestToInitialUserInfoRequestSystemUser) {
|
|
VehiclePropValue propValue{
|
|
.prop = INITIAL_USER_INFO,
|
|
.value = {.int32Values = {23, FIRST_BOOT_AFTER_OTA, 10, NONE_USER, 2, 0, SYSTEM_USER,
|
|
10, NONE_USER}},
|
|
};
|
|
InitialUserInfoRequest expected{
|
|
.requestId = 23,
|
|
.requestType = InitialUserInfoRequestType::FIRST_BOOT_AFTER_OTA,
|
|
.usersInfo = {{10, UserFlags::NONE},
|
|
2,
|
|
{{0, UserFlags::SYSTEM}, {10, UserFlags::NONE}}},
|
|
};
|
|
|
|
auto actual = toInitialUserInfoRequest(propValue);
|
|
|
|
ASSERT_TRUE(actual.ok()) << actual.error().message();
|
|
EXPECT_THAT(actual.value(), Eq(expected));
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestToInitialUserInfoRequestAdminUser) {
|
|
VehiclePropValue propValue{
|
|
.prop = INITIAL_USER_INFO,
|
|
.value = {.int32Values = {23, FIRST_BOOT_AFTER_OTA, 10, NONE_USER, 2, 0, ADMIN_USER, 10,
|
|
NONE_USER}},
|
|
};
|
|
InitialUserInfoRequest expected{
|
|
.requestId = 23,
|
|
.requestType = InitialUserInfoRequestType::FIRST_BOOT_AFTER_OTA,
|
|
.usersInfo = {{10, UserFlags::NONE}, 2, {{0, UserFlags::ADMIN}, {10, UserFlags::NONE}}},
|
|
};
|
|
|
|
auto actual = toInitialUserInfoRequest(propValue);
|
|
|
|
ASSERT_TRUE(actual.ok()) << actual.error().message();
|
|
EXPECT_THAT(actual.value(), Eq(expected));
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestToInitialUserInfoRequestUserFlagsBitCombination) {
|
|
// SYSTEM_ADMIN_USER is two UserFlags combined and is itself not a defined UserFlags enum.
|
|
VehiclePropValue propValue{
|
|
.prop = INITIAL_USER_INFO,
|
|
.value = {.int32Values = {23, FIRST_BOOT_AFTER_OTA, 10, NONE_USER, 2, 0,
|
|
SYSTEM_ADMIN_USER, 10, NONE_USER}},
|
|
};
|
|
InitialUserInfoRequest expected{
|
|
.requestId = 23,
|
|
.requestType = InitialUserInfoRequestType::FIRST_BOOT_AFTER_OTA,
|
|
.usersInfo = {{10, UserFlags::NONE},
|
|
2,
|
|
{{0, static_cast<UserFlags>(SYSTEM_ADMIN_USER)}, {10, UserFlags::NONE}}},
|
|
};
|
|
|
|
auto actual = toInitialUserInfoRequest(propValue);
|
|
|
|
ASSERT_TRUE(actual.ok()) << actual.error().message();
|
|
EXPECT_THAT(actual.value(), Eq(expected));
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestToInitialUserInfoRequestUserInvalidUserFlag) {
|
|
// 0x1111 is not a valid UserFlags flag combination.
|
|
VehiclePropValue propValue{
|
|
.prop = INITIAL_USER_INFO,
|
|
.value = {.int32Values = {23, FIRST_BOOT_AFTER_OTA, 10, NONE_USER, 2, 0,
|
|
INVALID_USER_FLAG, 10, NONE_USER}},
|
|
};
|
|
|
|
auto actual = toInitialUserInfoRequest(propValue);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on invalid user flags";
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsToInitialUserInfoRequestWithMismatchingPropType) {
|
|
VehiclePropValue propValue{
|
|
.prop = INT32_MAX,
|
|
.value = {.int32Values = {23, FIRST_BOOT_AFTER_OTA, 10, NONE_USER, 2, 0, SYSTEM_USER,
|
|
10, NONE_USER}},
|
|
};
|
|
|
|
auto actual = toInitialUserInfoRequest(propValue);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on mismatching property type";
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsToInitialUserInfoRequestWithInvalidRequestType) {
|
|
VehiclePropValue propValue{
|
|
.prop = INITIAL_USER_INFO,
|
|
.value = {.int32Values = {23, INT32_MAX, 10, NONE_USER, 2, 0, SYSTEM_USER, 10,
|
|
NONE_USER}},
|
|
};
|
|
|
|
auto actual = toInitialUserInfoRequest(propValue);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on invalid request type";
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsToInitialUserInfoRequestWithInvalidUserFlag) {
|
|
VehiclePropValue propValue{
|
|
.prop = INITIAL_USER_INFO,
|
|
.value = {.int32Values = {23, FIRST_BOOT_AFTER_OTA, 10, NONE_USER, 2, 0, SYSTEM_USER,
|
|
10, INT32_MAX}},
|
|
};
|
|
|
|
auto actual = toInitialUserInfoRequest(propValue);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on invalid user flags";
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsToInitialUserInfoRequestWithIncompleteUsersInfo) {
|
|
VehiclePropValue propValueMissingSecondUserInfo{
|
|
.prop = INITIAL_USER_INFO,
|
|
.value = {.int32Values = {23, FIRST_BOOT_AFTER_OTA, 10, NONE_USER, 2, 0,
|
|
SYSTEM_USER /*Missing 2nd UserInfo*/}},
|
|
};
|
|
|
|
auto actual = toInitialUserInfoRequest(propValueMissingSecondUserInfo);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on missing second user info";
|
|
|
|
VehiclePropValue propValueMissingUsersInfo{
|
|
.prop = INITIAL_USER_INFO,
|
|
.value = {.int32Values = {23, FIRST_BOOT_AFTER_OTA, /*Missing UsersInfo*/}},
|
|
};
|
|
|
|
actual = toInitialUserInfoRequest(propValueMissingUsersInfo);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on missing users info";
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestToSwitchUserRequest) {
|
|
VehiclePropValue propValue{
|
|
.prop = SWITCH_USER,
|
|
.value = {.int32Values = {23, LEGACY_ANDROID_SWITCH, 0, SYSTEM_USER, 10, NONE_USER, 2,
|
|
0, SYSTEM_USER, 10, NONE_USER}},
|
|
};
|
|
SwitchUserRequest expected{
|
|
.requestId = 23,
|
|
.messageType = SwitchUserMessageType::LEGACY_ANDROID_SWITCH,
|
|
.targetUser = {0, UserFlags::SYSTEM},
|
|
.usersInfo = {{10, UserFlags::NONE},
|
|
2,
|
|
{{0, UserFlags::SYSTEM}, {10, UserFlags::NONE}}},
|
|
};
|
|
|
|
auto actual = toSwitchUserRequest(propValue);
|
|
|
|
ASSERT_TRUE(actual.ok()) << actual.error().message();
|
|
EXPECT_THAT(actual.value(), Eq(expected));
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsToSwitchUserRequestWithMismatchingPropType) {
|
|
VehiclePropValue propValue{
|
|
.prop = INITIAL_USER_INFO,
|
|
.value = {.int32Values = {23, LEGACY_ANDROID_SWITCH, 0, SYSTEM_USER, 10, NONE_USER, 2,
|
|
0, SYSTEM_USER, 10, NONE_USER}},
|
|
};
|
|
|
|
auto actual = toSwitchUserRequest(propValue);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on mismatching property type";
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsToSwitchUserRequestWithInvalidMessageType) {
|
|
VehiclePropValue propValueIncompatibleMessageType{
|
|
.prop = SWITCH_USER,
|
|
.value = {.int32Values = {23, VEHICLE_REQUEST, 0, SYSTEM_USER, 10, NONE_USER, 2, 0,
|
|
SYSTEM_USER, 10, NONE_USER}},
|
|
};
|
|
|
|
auto actual = toSwitchUserRequest(propValueIncompatibleMessageType);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on incompatible message type";
|
|
|
|
VehiclePropValue propValueInvalidMessageType{
|
|
.prop = SWITCH_USER,
|
|
.value = {.int32Values = {23, INT32_MAX, 0, SYSTEM_USER, 10, NONE_USER, 2, 0,
|
|
SYSTEM_USER, 10, NONE_USER}},
|
|
};
|
|
|
|
actual = toSwitchUserRequest(propValueInvalidMessageType);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on invalid message type";
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsToSwitchUserRequestWithIncompleteUsersInfo) {
|
|
VehiclePropValue propValueMissingSecondUserInfo{
|
|
.prop = SWITCH_USER,
|
|
.value = {.int32Values = {23, LEGACY_ANDROID_SWITCH, 0, SYSTEM_USER, 10, NONE_USER, 2,
|
|
0, SYSTEM_USER,
|
|
/*Missing 2nd UserInfo*/}},
|
|
};
|
|
|
|
auto actual = toSwitchUserRequest(propValueMissingSecondUserInfo);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on missing second user info";
|
|
|
|
VehiclePropValue propValueMissingUsersInfo{
|
|
.prop = SWITCH_USER,
|
|
.value = {.int32Values = {23, LEGACY_ANDROID_SWITCH, 0, SYSTEM_USER,
|
|
/*Missing UsersInfo*/}},
|
|
};
|
|
|
|
actual = toSwitchUserRequest(propValueMissingUsersInfo);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on missing users info";
|
|
|
|
VehiclePropValue propValueMissingTargetUser{
|
|
.prop = SWITCH_USER,
|
|
.value = {.int32Values = {23, LEGACY_ANDROID_SWITCH, /*Missing target UserInfo*/}},
|
|
};
|
|
|
|
actual = toSwitchUserRequest(propValueMissingTargetUser);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on missing target user info";
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestToCreateUserRequest) {
|
|
VehiclePropValue propValue{
|
|
.prop = CREATE_USER,
|
|
.value = {.int32Values = {23, 11, GUEST_USER, 10, NONE_USER, 2, 0, SYSTEM_USER, 10,
|
|
NONE_USER},
|
|
.stringValue = "Guest11"},
|
|
};
|
|
CreateUserRequest expected{
|
|
.requestId = 23,
|
|
.newUserInfo = {11, UserFlags::GUEST},
|
|
.newUserName = "Guest11",
|
|
.usersInfo = {{10, UserFlags::NONE},
|
|
2,
|
|
{{0, UserFlags::SYSTEM}, {10, UserFlags::NONE}}},
|
|
};
|
|
|
|
auto actual = toCreateUserRequest(propValue);
|
|
|
|
ASSERT_TRUE(actual.ok()) << actual.error().message();
|
|
EXPECT_THAT(actual.value(), Eq(expected));
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsToCreateUserRequestWithMismatchingPropType) {
|
|
VehiclePropValue propValue{
|
|
.prop = INITIAL_USER_INFO,
|
|
.value = {.int32Values = {23, 11, GUEST_USER, 10, NONE_USER, 2, 0, SYSTEM_USER, 10,
|
|
NONE_USER},
|
|
.stringValue = "Guest11"},
|
|
};
|
|
|
|
auto actual = toCreateUserRequest(propValue);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on mismatching property type";
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsToCreateUserRequestWithIncompleteUsersInfo) {
|
|
VehiclePropValue propValueMissingSecondUserInfo{
|
|
.prop = CREATE_USER,
|
|
.value = {.int32Values = {23, 11, GUEST_USER, 10, NONE_USER, 2, 0,
|
|
SYSTEM_USER /*Missing 2nd UserInfo*/},
|
|
.stringValue = "Guest11"},
|
|
};
|
|
|
|
auto actual = toCreateUserRequest(propValueMissingSecondUserInfo);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on missing second user info";
|
|
|
|
VehiclePropValue propValueMissingUsersInfo{
|
|
.prop = CREATE_USER,
|
|
.value = {.int32Values = {23, 11, GUEST_USER, /*Missing UsersInfo*/},
|
|
.stringValue = "Guest11"},
|
|
};
|
|
|
|
actual = toCreateUserRequest(propValueMissingUsersInfo);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on missing users info";
|
|
|
|
VehiclePropValue propValueMissingCreateUserInfo{
|
|
.prop = CREATE_USER,
|
|
.value = {.int32Values = {23, /*Missing create UserInfo*/}, .stringValue = "Guest11"},
|
|
};
|
|
|
|
actual = toCreateUserRequest(propValueMissingCreateUserInfo);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on missing create user info";
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestToRemoveUserRequest) {
|
|
VehiclePropValue propValue{
|
|
.prop = REMOVE_USER,
|
|
.value = {.int32Values = {23, 10, NONE_USER, 10, NONE_USER, 2, 0, SYSTEM_USER, 10,
|
|
NONE_USER}},
|
|
};
|
|
RemoveUserRequest expected{
|
|
.requestId = 23,
|
|
.removedUserInfo = {10, UserFlags::NONE},
|
|
.usersInfo = {{10, UserFlags::NONE},
|
|
2,
|
|
{{0, UserFlags::SYSTEM}, {10, UserFlags::NONE}}},
|
|
};
|
|
|
|
auto actual = toRemoveUserRequest(propValue);
|
|
|
|
ASSERT_TRUE(actual.ok()) << actual.error().message();
|
|
EXPECT_THAT(actual.value(), Eq(expected));
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsToRemoveUserRequestWithMismatchingPropType) {
|
|
VehiclePropValue propValue{
|
|
.prop = INITIAL_USER_INFO,
|
|
.value = {.int32Values = {23, 10, NONE_USER, 10, NONE_USER, 2, 0, SYSTEM_USER, 10,
|
|
NONE_USER}},
|
|
};
|
|
|
|
auto actual = toRemoveUserRequest(propValue);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on mismatching property type";
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsToRemoveUserRequestWithIncompleteUsersInfo) {
|
|
VehiclePropValue propValueMissingSecondUserInfo{
|
|
.prop = REMOVE_USER,
|
|
.value = {.int32Values = {23, 10, NONE_USER, 10, NONE_USER, 2, 0,
|
|
SYSTEM_USER /*Missing 2nd UserInfo*/}},
|
|
};
|
|
|
|
auto actual = toRemoveUserRequest(propValueMissingSecondUserInfo);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on missing second user info";
|
|
|
|
VehiclePropValue propValueMissingUsersInfo{
|
|
.prop = REMOVE_USER,
|
|
.value = {.int32Values = {23, 10, NONE_USER, /*Missing UsersInfo*/}},
|
|
};
|
|
|
|
actual = toRemoveUserRequest(propValueMissingUsersInfo);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on missing users info";
|
|
|
|
VehiclePropValue propValueMissingRemoveUserInfo{
|
|
.prop = REMOVE_USER,
|
|
.value = {.int32Values = {23, /*Missing remove UserInfo*/}},
|
|
};
|
|
|
|
actual = toRemoveUserRequest(propValueMissingRemoveUserInfo);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on missing remove user info";
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsToUserIdentificationGetRequest) {
|
|
VehiclePropValue propValue{
|
|
.prop = USER_IDENTIFICATION_ASSOCIATION,
|
|
.value = {.int32Values = {23, 10, NONE_USER, 2, USER_ID_ASSOC_KEY_FOB,
|
|
USER_ID_ASSOC_CUSTOM_1}},
|
|
};
|
|
UserIdentificationGetRequest expected{
|
|
.requestId = 23,
|
|
.userInfo = {10, UserFlags::NONE},
|
|
.numberAssociationTypes = 2,
|
|
.associationTypes = {UserIdentificationAssociationType::KEY_FOB,
|
|
UserIdentificationAssociationType::CUSTOM_1},
|
|
};
|
|
|
|
auto actual = toUserIdentificationGetRequest(propValue);
|
|
|
|
ASSERT_TRUE(actual.ok()) << actual.error().message();
|
|
EXPECT_THAT(actual.value(), Eq(expected));
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsToUserIdentificationGetRequestWithMismatchingPropType) {
|
|
VehiclePropValue propValue{
|
|
.prop = INITIAL_USER_INFO,
|
|
.value = {.int32Values = {23, 10, NONE_USER, 2, USER_ID_ASSOC_KEY_FOB,
|
|
USER_ID_ASSOC_CUSTOM_1}},
|
|
};
|
|
|
|
auto actual = toUserIdentificationGetRequest(propValue);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on mismatching property type";
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsToUserIdentificationGetRequestWithInvalidAssociationTypes) {
|
|
VehiclePropValue propValue{
|
|
.prop = USER_IDENTIFICATION_ASSOCIATION,
|
|
.value = {.int32Values = {23, 10, NONE_USER, 1, INT32_MAX}},
|
|
};
|
|
|
|
auto actual = toUserIdentificationGetRequest(propValue);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on invalid association type";
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsToUserIdentificationGetRequestWithIncompleteAssociationTypes) {
|
|
VehiclePropValue propValueMissingSecondAssociationType{
|
|
.prop = USER_IDENTIFICATION_ASSOCIATION,
|
|
.value = {.int32Values = {23, 10, NONE_USER, 2,
|
|
USER_ID_ASSOC_KEY_FOB /*Missing 2nd association type*/}},
|
|
};
|
|
|
|
auto actual = toUserIdentificationGetRequest(propValueMissingSecondAssociationType);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on missing second association type";
|
|
|
|
VehiclePropValue propValueMissingNumberAssociationTypes{
|
|
.prop = USER_IDENTIFICATION_ASSOCIATION,
|
|
.value = {.int32Values = {23, 10, NONE_USER, /*Missing number association types*/}},
|
|
};
|
|
|
|
actual = toUserIdentificationGetRequest(propValueMissingNumberAssociationTypes);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on missing number association types";
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsToUserIdentificationGetRequestWithMissingUserInfo) {
|
|
VehiclePropValue propValue{
|
|
.prop = USER_IDENTIFICATION_ASSOCIATION,
|
|
.value = {.int32Values = {23, /*Missing user info*/}},
|
|
};
|
|
|
|
auto actual = toUserIdentificationGetRequest(propValue);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on missing UserInfo";
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestToUserIdentificationSetRequest) {
|
|
VehiclePropValue propValue{
|
|
.prop = USER_IDENTIFICATION_ASSOCIATION,
|
|
.value = {.int32Values = {23, 10, NONE_USER, 2, USER_ID_ASSOC_KEY_FOB,
|
|
USER_ID_ASSOC_SET_CURRENT_USER, USER_ID_ASSOC_CUSTOM_1,
|
|
USER_ID_ASSOC_UNSET_CURRENT_USER}},
|
|
};
|
|
UserIdentificationSetRequest expected{
|
|
.requestId = 23,
|
|
.userInfo = {10, UserFlags::NONE},
|
|
.numberAssociations = 2,
|
|
.associations = {{UserIdentificationAssociationType::KEY_FOB,
|
|
UserIdentificationAssociationSetValue::ASSOCIATE_CURRENT_USER},
|
|
{UserIdentificationAssociationType::CUSTOM_1,
|
|
UserIdentificationAssociationSetValue::DISASSOCIATE_CURRENT_USER}},
|
|
};
|
|
|
|
auto actual = toUserIdentificationSetRequest(propValue);
|
|
|
|
ASSERT_TRUE(actual.ok()) << actual.error().message();
|
|
EXPECT_THAT(actual.value(), Eq(expected));
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsToUserIdentificationSetRequestWithMismatchingPropType) {
|
|
VehiclePropValue propValue{
|
|
.prop = INITIAL_USER_INFO,
|
|
.value = {.int32Values = {23, 10, NONE_USER, 2, USER_ID_ASSOC_KEY_FOB,
|
|
USER_ID_ASSOC_SET_CURRENT_USER, USER_ID_ASSOC_CUSTOM_1,
|
|
USER_ID_ASSOC_UNSET_CURRENT_USER}},
|
|
};
|
|
|
|
auto actual = toUserIdentificationSetRequest(propValue);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on mismatching property type";
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsToUserIdentificationSetRequestWithInvalidAssociations) {
|
|
VehiclePropValue propValueInvalidAssociationType{
|
|
.prop = USER_IDENTIFICATION_ASSOCIATION,
|
|
.value = {.int32Values = {23, 10, NONE_USER, 1, INT32_MAX,
|
|
USER_ID_ASSOC_SET_CURRENT_USER}},
|
|
};
|
|
|
|
auto actual = toUserIdentificationSetRequest(propValueInvalidAssociationType);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on invalid association type";
|
|
|
|
VehiclePropValue propValueInvalidAssociationValue{
|
|
.prop = USER_IDENTIFICATION_ASSOCIATION,
|
|
.value = {.int32Values = {23, 10, NONE_USER, USER_ID_ASSOC_KEY_FOB, INT32_MAX}},
|
|
};
|
|
|
|
actual = toUserIdentificationSetRequest(propValueInvalidAssociationValue);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on missing number association types";
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsToUserIdentificationSetRequestWithIncompleteAssociations) {
|
|
VehiclePropValue propValueMissingSecondAssociationType{
|
|
.prop = USER_IDENTIFICATION_ASSOCIATION,
|
|
.value = {.int32Values = {23, 10, NONE_USER, 2, USER_ID_ASSOC_KEY_FOB,
|
|
USER_ID_ASSOC_SET_CURRENT_USER,
|
|
/*Missing 2nd association*/}},
|
|
};
|
|
|
|
auto actual = toUserIdentificationSetRequest(propValueMissingSecondAssociationType);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on missing second association type";
|
|
|
|
VehiclePropValue propValueMissingNumberAssociationTypes{
|
|
.prop = USER_IDENTIFICATION_ASSOCIATION,
|
|
.value = {.int32Values = {23, 10, NONE_USER, /*Missing number associations*/}},
|
|
};
|
|
|
|
actual = toUserIdentificationSetRequest(propValueMissingNumberAssociationTypes);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on missing number association types";
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsToUserIdentificationSetRequestWithMissingUserInfo) {
|
|
VehiclePropValue propValue{
|
|
.prop = USER_IDENTIFICATION_ASSOCIATION,
|
|
.value = {.int32Values = {23, /*Missing user info*/}},
|
|
};
|
|
|
|
auto actual = toUserIdentificationSetRequest(propValue);
|
|
|
|
EXPECT_FALSE(actual.ok()) << "No error returned on missing UserInfo";
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestSwitchUserRequestToVehiclePropValue) {
|
|
SwitchUserRequest request{
|
|
.requestId = 23,
|
|
.messageType = SwitchUserMessageType::VEHICLE_REQUEST,
|
|
.targetUser = {11, UserFlags::GUEST},
|
|
};
|
|
VehiclePropValue expected{
|
|
.prop = SWITCH_USER,
|
|
.value = {.int32Values = {23,
|
|
static_cast<int32_t>(SwitchUserMessageType::VEHICLE_REQUEST),
|
|
11}},
|
|
};
|
|
|
|
auto actual = toVehiclePropValue(request);
|
|
|
|
ASSERT_THAT(actual, NotNull());
|
|
EXPECT_THAT(actual->timestamp, Gt(0));
|
|
// Don't rely on real timestamp in tests as the expected and actual objects won't have the same
|
|
// timestamps. Thus remove the timestamps before comparing them.
|
|
actual->timestamp = 0;
|
|
EXPECT_THAT(actual, Pointee(Eq(expected)));
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestFailsSwitchUserRequestToVehiclePropValueWithIncompatibleMessageType) {
|
|
SwitchUserRequest request{
|
|
.requestId = 23,
|
|
.messageType = SwitchUserMessageType::VEHICLE_RESPONSE,
|
|
.targetUser = {11, UserFlags::GUEST},
|
|
};
|
|
|
|
auto actual = toVehiclePropValue(request);
|
|
|
|
EXPECT_THAT(actual, IsNull());
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestInitialUserInfoResponseToVehiclePropValue) {
|
|
InitialUserInfoResponse response{
|
|
.requestId = 23,
|
|
.action = InitialUserInfoResponseAction::CREATE,
|
|
.userToSwitchOrCreate = {11, UserFlags::GUEST},
|
|
.userLocales = "en-US,pt-BR",
|
|
.userNameToCreate = "Owner",
|
|
};
|
|
VehiclePropValue expected{
|
|
.prop = INITIAL_USER_INFO,
|
|
.value = {.int32Values = {23,
|
|
static_cast<int32_t>(InitialUserInfoResponseAction::CREATE),
|
|
11, GUEST_USER},
|
|
.stringValue = "en-US,pt-BR||Owner"},
|
|
};
|
|
|
|
auto actual = toVehiclePropValue(response);
|
|
|
|
ASSERT_THAT(actual, NotNull());
|
|
EXPECT_THAT(actual->timestamp, Gt(0));
|
|
actual->timestamp = 0;
|
|
EXPECT_THAT(actual, Pointee(Eq(expected)));
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestSwitchUserResponseToVehiclePropValue) {
|
|
SwitchUserResponse response{
|
|
.requestId = 23,
|
|
.messageType = SwitchUserMessageType::VEHICLE_RESPONSE,
|
|
.status = SwitchUserStatus::FAILURE,
|
|
.errorMessage = "random error",
|
|
};
|
|
VehiclePropValue expected{
|
|
.prop = SWITCH_USER,
|
|
.value = {.int32Values = {23,
|
|
static_cast<int32_t>(SwitchUserMessageType::VEHICLE_RESPONSE),
|
|
static_cast<int32_t>(SwitchUserStatus::FAILURE)},
|
|
.stringValue = "random error"},
|
|
};
|
|
|
|
auto actual = toVehiclePropValue(response);
|
|
|
|
ASSERT_THAT(actual, NotNull());
|
|
EXPECT_THAT(actual->timestamp, Gt(0));
|
|
actual->timestamp = 0;
|
|
EXPECT_THAT(actual, Pointee(Eq(expected)));
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestCreateUserResponseToVehiclePropValue) {
|
|
CreateUserResponse response{
|
|
.requestId = 23,
|
|
.status = CreateUserStatus::FAILURE,
|
|
.errorMessage = "random error",
|
|
};
|
|
VehiclePropValue expected{
|
|
.prop = CREATE_USER,
|
|
.value = {.int32Values = {23, static_cast<int32_t>(CreateUserStatus::FAILURE)},
|
|
.stringValue = "random error"},
|
|
};
|
|
|
|
auto actual = toVehiclePropValue(response);
|
|
|
|
ASSERT_THAT(actual, NotNull());
|
|
EXPECT_THAT(actual->timestamp, Gt(0));
|
|
actual->timestamp = 0;
|
|
EXPECT_THAT(actual, Pointee(Eq(expected)));
|
|
}
|
|
|
|
TEST(UserHalHelperTest, TestUserIdentificationResponseToVehiclePropValue) {
|
|
UserIdentificationResponse response{
|
|
.requestId = 23,
|
|
.numberAssociation = 2,
|
|
.associations = {{UserIdentificationAssociationType::KEY_FOB,
|
|
UserIdentificationAssociationValue::ASSOCIATED_CURRENT_USER},
|
|
{UserIdentificationAssociationType::CUSTOM_1,
|
|
UserIdentificationAssociationValue::NOT_ASSOCIATED_ANY_USER}},
|
|
.errorMessage = "random error",
|
|
};
|
|
VehiclePropValue expected{
|
|
.prop = USER_IDENTIFICATION_ASSOCIATION,
|
|
.value = {.int32Values = {23, 2, USER_ID_ASSOC_KEY_FOB, USER_ID_ASSOC_CURRENT_USER,
|
|
USER_ID_ASSOC_CUSTOM_1, USER_ID_ASSOC_NO_USER},
|
|
.stringValue = "random error"},
|
|
};
|
|
|
|
auto actual = toVehiclePropValue(response);
|
|
|
|
ASSERT_THAT(actual, NotNull());
|
|
EXPECT_THAT(actual->timestamp, Gt(0));
|
|
actual->timestamp = 0;
|
|
EXPECT_THAT(actual, Pointee(Eq(expected)));
|
|
}
|
|
|
|
} // namespace user_hal_helper
|
|
|
|
} // namespace V2_0
|
|
} // namespace vehicle
|
|
} // namespace automotive
|
|
} // namespace hardware
|
|
} // namespace android
|