blob: 4ae9c8c1cb243c0d364ef0363cb503d9b3e853b6 [file] [log] [blame]
/*
* Copyright (C) 2021 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.
*/
#ifndef android_hardware_automotive_vehicle_aidl_impl_fake_impl_userhal_include_FakeUserHal_H_
#define android_hardware_automotive_vehicle_aidl_impl_fake_impl_userhal_include_FakeUserHal_H_
#include <android-base/format.h>
#include <android-base/result.h>
#include <android-base/thread_annotations.h>
#include <VehicleHalTypes.h>
#include <VehicleObjectPool.h>
#include <VehicleUtils.h>
#include <memory>
#include <mutex>
namespace android {
namespace hardware {
namespace automotive {
namespace vehicle {
namespace fake {
constexpr char kUserHalDumpOption[] = "--user-hal";
// Class used to emulate a real User HAL behavior through lshal debug requests.
class FakeUserHal final {
public:
using ValueResultType = VhalResult<VehiclePropValuePool::RecyclableType>;
explicit FakeUserHal(std::shared_ptr<VehiclePropValuePool> valuePool) : mValuePool(valuePool) {}
~FakeUserHal() = default;
// Checks if the emulator can handle the property.
static bool isSupported(int32_t prop);
// Lets the emulator set the property.
//
// @return updated property and StatusCode
ValueResultType onSetProperty(
const aidl::android::hardware::automotive::vehicle::VehiclePropValue& value);
// Gets the property value from the emulator.
//
// @return property value and StatusCode
ValueResultType onGetProperty(
const aidl::android::hardware::automotive::vehicle::VehiclePropValue& value) const;
// Shows the User HAL emulation help.
std::string showDumpHelp() const;
// Dump its contents.
std::string dump(std::string indent) const;
private:
const std::shared_ptr<VehiclePropValuePool> mValuePool;
mutable std::mutex mLock;
VehiclePropValuePool::RecyclableType mInitialUserResponseFromCmd GUARDED_BY(mLock);
VehiclePropValuePool::RecyclableType mSwitchUserResponseFromCmd GUARDED_BY(mLock);
VehiclePropValuePool::RecyclableType mCreateUserResponseFromCmd GUARDED_BY(mLock);
VehiclePropValuePool::RecyclableType mSetUserIdentificationAssociationResponseFromCmd
GUARDED_BY(mLock);
// INITIAL_USER_INFO is called by Android when it starts, and it's expecting a property change
// indicating what the initial user should be.
//
// During normal circumstances, the emulator will reply right away, passing a response if
// InitialUserInfoResponseAction::DEFAULT (so Android could use its own logic to decide which
// user to boot).
//
// But during development / testing, the behavior can be changed using lshal dump, which must
// use the areaId to indicate what should happen next.
//
// So, the behavior of set(INITIAL_USER_INFO) is:
//
// - if it has an areaId, store the property into mInitialUserResponseFromCmd (as it was called
// by lshal).
// - else if mInitialUserResponseFromCmd is not set, return a response with the same request id
// and InitialUserInfoResponseAction::DEFAULT
// - else the behavior is defined by the areaId on mInitialUserResponseFromCmd:
// - if it's 1, reply with mInitialUserResponseFromCmd and the right request id
// - if it's 2, reply with mInitialUserResponseFromCmd but a wrong request id (so Android can
// test this error scenario)
// - if it's 3, then don't send a property change (so Android can emulate a timeout)
ValueResultType onSetInitialUserInfoResponse(
const aidl::android::hardware::automotive::vehicle::VehiclePropValue& value);
// Used to emulate SWITCH_USER - see onSetInitialUserInfoResponse() for usage.
ValueResultType onSetSwitchUserResponse(
const aidl::android::hardware::automotive::vehicle::VehiclePropValue& value);
// Used to emulate CREATE_USER - see onSetInitialUserInfoResponse() for usage.
ValueResultType onSetCreateUserResponse(
const aidl::android::hardware::automotive::vehicle::VehiclePropValue& value);
// Used to emulate set USER_IDENTIFICATION_ASSOCIATION - see onSetInitialUserInfoResponse() for
// usage.
ValueResultType onSetUserIdentificationAssociation(
const aidl::android::hardware::automotive::vehicle::VehiclePropValue& value);
// Used to emulate get USER_IDENTIFICATION_ASSOCIATION - see onSetInitialUserInfoResponse() for
// usage.
ValueResultType onGetUserIdentificationAssociation(
const aidl::android::hardware::automotive::vehicle::VehiclePropValue& value) const;
// Creates a default USER_IDENTIFICATION_ASSOCIATION when it was not set by lshal.
static ValueResultType defaultUserIdentificationAssociation(
const aidl::android::hardware::automotive::vehicle::VehiclePropValue& request);
ValueResultType sendUserHalResponse(VehiclePropValuePool::RecyclableType response,
int32_t requestId);
};
} // namespace fake
} // namespace vehicle
} // namespace automotive
} // namespace hardware
} // namespace android
#endif // android_hardware_automotive_vehicle_aidl_impl_fake_impl_userhal_include_FakeUserHal_H_