blob: 3c2a3607b100ce94a0a869c7e83f75418470c304 [file] [log] [blame]
Lais Andrade80b18612020-10-12 18:44:40 +00001/*
2 * Copyright (C) 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#include <aidl/Gtest.h>
17#include <aidl/Vintf.h>
Lais Andrade28c81f12024-06-24 14:32:22 +010018#include <aidl/android/hardware/vibrator/BnVibratorCallback.h>
19#include <aidl/android/hardware/vibrator/IVibrator.h>
20#include <aidl/android/hardware/vibrator/IVibratorManager.h>
Lais Andrade80b18612020-10-12 18:44:40 +000021
Lais Andrade28c81f12024-06-24 14:32:22 +010022#include <android/binder_manager.h>
23#include <android/binder_process.h>
Lais Andrade80b18612020-10-12 18:44:40 +000024
25#include <cmath>
26#include <future>
27
Lais Andrade28c81f12024-06-24 14:32:22 +010028#include "test_utils.h"
29
30using aidl::android::hardware::vibrator::BnVibratorCallback;
31using aidl::android::hardware::vibrator::CompositeEffect;
32using aidl::android::hardware::vibrator::CompositePrimitive;
33using aidl::android::hardware::vibrator::Effect;
34using aidl::android::hardware::vibrator::EffectStrength;
35using aidl::android::hardware::vibrator::IVibrator;
36using aidl::android::hardware::vibrator::IVibratorManager;
Lais Andrade80b18612020-10-12 18:44:40 +000037using std::chrono::high_resolution_clock;
38
Lais Andrade28c81f12024-06-24 14:32:22 +010039const std::vector<Effect> kEffects{ndk::enum_range<Effect>().begin(),
40 ndk::enum_range<Effect>().end()};
41const std::vector<EffectStrength> kEffectStrengths{ndk::enum_range<EffectStrength>().begin(),
42 ndk::enum_range<EffectStrength>().end()};
43const std::vector<CompositePrimitive> kPrimitives{ndk::enum_range<CompositePrimitive>().begin(),
44 ndk::enum_range<CompositePrimitive>().end()};
Lais Andrade80b18612020-10-12 18:44:40 +000045
46class CompletionCallback : public BnVibratorCallback {
47 public:
48 CompletionCallback(const std::function<void()>& callback) : mCallback(callback) {}
Lais Andrade28c81f12024-06-24 14:32:22 +010049 ndk::ScopedAStatus onComplete() override {
Lais Andrade80b18612020-10-12 18:44:40 +000050 mCallback();
Lais Andrade28c81f12024-06-24 14:32:22 +010051 return ndk::ScopedAStatus::ok();
Lais Andrade80b18612020-10-12 18:44:40 +000052 }
53
54 private:
55 std::function<void()> mCallback;
56};
57
58class VibratorAidl : public testing::TestWithParam<std::string> {
59 public:
60 virtual void SetUp() override {
Lais Andrade28c81f12024-06-24 14:32:22 +010061 auto serviceName = GetParam().c_str();
62 manager = IVibratorManager::fromBinder(
63 ndk::SpAIBinder(AServiceManager_waitForService(serviceName)));
Lais Andrade80b18612020-10-12 18:44:40 +000064 ASSERT_NE(manager, nullptr);
Lais Andrade28c81f12024-06-24 14:32:22 +010065 EXPECT_OK(manager->getCapabilities(&capabilities));
66 EXPECT_OK(manager->getVibratorIds(&vibratorIds));
Lais Andrade80b18612020-10-12 18:44:40 +000067 }
68
Lais Andrade28c81f12024-06-24 14:32:22 +010069 std::shared_ptr<IVibratorManager> manager;
Lais Andrade80b18612020-10-12 18:44:40 +000070 int32_t capabilities;
71 std::vector<int32_t> vibratorIds;
72};
73
74TEST_P(VibratorAidl, ValidateExistingVibrators) {
Lais Andrade28c81f12024-06-24 14:32:22 +010075 std::shared_ptr<IVibrator> vibrator;
76 for (int32_t id : vibratorIds) {
77 EXPECT_OK(manager->getVibrator(id, &vibrator));
Lais Andrade80b18612020-10-12 18:44:40 +000078 ASSERT_NE(vibrator, nullptr);
79 }
80}
81
82TEST_P(VibratorAidl, GetVibratorWithInvalidId) {
83 int32_t invalidId = *max_element(vibratorIds.begin(), vibratorIds.end()) + 1;
Lais Andrade28c81f12024-06-24 14:32:22 +010084 std::shared_ptr<IVibrator> vibrator;
85 EXPECT_ILLEGAL_ARGUMENT(manager->getVibrator(invalidId, &vibrator));
Lais Andrade80b18612020-10-12 18:44:40 +000086 ASSERT_EQ(vibrator, nullptr);
87}
88
89TEST_P(VibratorAidl, ValidatePrepareSyncedExistingVibrators) {
90 if (!(capabilities & IVibratorManager::CAP_SYNC)) return;
91 if (vibratorIds.empty()) return;
Lais Andrade28c81f12024-06-24 14:32:22 +010092 EXPECT_OK(manager->prepareSynced(vibratorIds));
93 EXPECT_OK(manager->cancelSynced());
Lais Andrade80b18612020-10-12 18:44:40 +000094}
95
96TEST_P(VibratorAidl, PrepareSyncedEmptySetIsInvalid) {
97 if (!(capabilities & IVibratorManager::CAP_SYNC)) return;
98 std::vector<int32_t> emptyIds;
Lais Andrade28c81f12024-06-24 14:32:22 +010099 EXPECT_ILLEGAL_ARGUMENT(manager->prepareSynced(emptyIds));
Lais Andrade80b18612020-10-12 18:44:40 +0000100}
101
102TEST_P(VibratorAidl, PrepareSyncedNotSupported) {
103 if (!(capabilities & IVibratorManager::CAP_SYNC)) {
Lais Andrade28c81f12024-06-24 14:32:22 +0100104 EXPECT_UNKNOWN_OR_UNSUPPORTED(manager->prepareSynced(vibratorIds));
Lais Andrade80b18612020-10-12 18:44:40 +0000105 }
106}
107
108TEST_P(VibratorAidl, PrepareOnNotSupported) {
109 if (vibratorIds.empty()) return;
110 if (!(capabilities & IVibratorManager::CAP_SYNC)) return;
111 if (!(capabilities & IVibratorManager::CAP_PREPARE_ON)) {
112 uint32_t durationMs = 250;
Lais Andrade28c81f12024-06-24 14:32:22 +0100113 EXPECT_OK(manager->prepareSynced(vibratorIds));
114 std::shared_ptr<IVibrator> vibrator;
115 for (int32_t id : vibratorIds) {
116 EXPECT_OK(manager->getVibrator(id, &vibrator));
Lais Andrade80b18612020-10-12 18:44:40 +0000117 ASSERT_NE(vibrator, nullptr);
Lais Andrade28c81f12024-06-24 14:32:22 +0100118 EXPECT_UNKNOWN_OR_UNSUPPORTED(vibrator->on(durationMs, nullptr));
Lais Andrade80b18612020-10-12 18:44:40 +0000119 }
Lais Andrade28c81f12024-06-24 14:32:22 +0100120 EXPECT_OK(manager->cancelSynced());
Lais Andrade80b18612020-10-12 18:44:40 +0000121 }
122}
123
124TEST_P(VibratorAidl, PreparePerformNotSupported) {
125 if (vibratorIds.empty()) return;
126 if (!(capabilities & IVibratorManager::CAP_SYNC)) return;
127 if (!(capabilities & IVibratorManager::CAP_PREPARE_ON)) {
Lais Andrade28c81f12024-06-24 14:32:22 +0100128 EXPECT_OK(manager->prepareSynced(vibratorIds));
129 std::shared_ptr<IVibrator> vibrator;
130 for (int32_t id : vibratorIds) {
131 EXPECT_OK(manager->getVibrator(id, &vibrator));
Lais Andrade80b18612020-10-12 18:44:40 +0000132 ASSERT_NE(vibrator, nullptr);
133 int32_t lengthMs = 0;
Lais Andrade28c81f12024-06-24 14:32:22 +0100134 EXPECT_UNKNOWN_OR_UNSUPPORTED(
135 vibrator->perform(kEffects[0], kEffectStrengths[0], nullptr, &lengthMs));
Lais Andrade80b18612020-10-12 18:44:40 +0000136 }
Lais Andrade28c81f12024-06-24 14:32:22 +0100137 EXPECT_OK(manager->cancelSynced());
Lais Andrade80b18612020-10-12 18:44:40 +0000138 }
139}
140
141TEST_P(VibratorAidl, PrepareComposeNotSupported) {
142 if (vibratorIds.empty()) return;
143 if (!(capabilities & IVibratorManager::CAP_SYNC)) return;
144 if (!(capabilities & IVibratorManager::CAP_PREPARE_ON)) {
145 std::vector<CompositeEffect> composite;
146 CompositeEffect effect;
147 effect.delayMs = 10;
148 effect.primitive = kPrimitives[0];
149 effect.scale = 1.0f;
150 composite.emplace_back(effect);
151
Lais Andrade28c81f12024-06-24 14:32:22 +0100152 EXPECT_OK(manager->prepareSynced(vibratorIds));
153 std::shared_ptr<IVibrator> vibrator;
154 for (int32_t id : vibratorIds) {
155 EXPECT_OK(manager->getVibrator(id, &vibrator));
Lais Andrade80b18612020-10-12 18:44:40 +0000156 ASSERT_NE(vibrator, nullptr);
Lais Andrade28c81f12024-06-24 14:32:22 +0100157 EXPECT_UNKNOWN_OR_UNSUPPORTED(vibrator->compose(composite, nullptr));
Lais Andrade80b18612020-10-12 18:44:40 +0000158 }
Lais Andrade28c81f12024-06-24 14:32:22 +0100159 EXPECT_OK(manager->cancelSynced());
Lais Andrade80b18612020-10-12 18:44:40 +0000160 }
161}
162
163TEST_P(VibratorAidl, TriggerWithCallback) {
164 if (!(capabilities & IVibratorManager::CAP_SYNC)) return;
165 if (!(capabilities & IVibratorManager::CAP_PREPARE_ON)) return;
166 if (!(capabilities & IVibratorManager::CAP_TRIGGER_CALLBACK)) return;
167 if (vibratorIds.empty()) return;
168
169 std::promise<void> completionPromise;
170 std::future<void> completionFuture{completionPromise.get_future()};
Lais Andrade28c81f12024-06-24 14:32:22 +0100171 auto callback = ndk::SharedRefBase::make<CompletionCallback>(
172 [&completionPromise] { completionPromise.set_value(); });
Lais Andrade80b18612020-10-12 18:44:40 +0000173 uint32_t durationMs = 250;
174 std::chrono::milliseconds timeout{durationMs * 2};
175
Lais Andrade28c81f12024-06-24 14:32:22 +0100176 EXPECT_OK(manager->prepareSynced(vibratorIds));
177 std::shared_ptr<IVibrator> vibrator;
178 for (int32_t id : vibratorIds) {
179 EXPECT_OK(manager->getVibrator(id, &vibrator));
Lais Andrade80b18612020-10-12 18:44:40 +0000180 ASSERT_NE(vibrator, nullptr);
Lais Andrade28c81f12024-06-24 14:32:22 +0100181 EXPECT_OK(vibrator->on(durationMs, nullptr));
Lais Andrade80b18612020-10-12 18:44:40 +0000182 }
183
Lais Andrade28c81f12024-06-24 14:32:22 +0100184 EXPECT_OK(manager->triggerSynced(callback));
Lais Andrade80b18612020-10-12 18:44:40 +0000185 EXPECT_EQ(completionFuture.wait_for(timeout), std::future_status::ready);
Lais Andrade28c81f12024-06-24 14:32:22 +0100186 EXPECT_OK(manager->cancelSynced());
Lais Andrade80b18612020-10-12 18:44:40 +0000187}
188
189TEST_P(VibratorAidl, TriggerSyncNotSupported) {
190 if (!(capabilities & IVibratorManager::CAP_SYNC)) {
Lais Andrade28c81f12024-06-24 14:32:22 +0100191 EXPECT_UNKNOWN_OR_UNSUPPORTED(manager->triggerSynced(nullptr));
Lais Andrade80b18612020-10-12 18:44:40 +0000192 }
193}
194
195TEST_P(VibratorAidl, TriggerCallbackNotSupported) {
196 if (!(capabilities & IVibratorManager::CAP_SYNC)) return;
197 if (!(capabilities & IVibratorManager::CAP_TRIGGER_CALLBACK)) {
Lais Andrade28c81f12024-06-24 14:32:22 +0100198 auto callback = ndk::SharedRefBase::make<CompletionCallback>([] {});
199 EXPECT_OK(manager->prepareSynced(vibratorIds));
200 EXPECT_UNKNOWN_OR_UNSUPPORTED(manager->triggerSynced(callback));
201 EXPECT_OK(manager->cancelSynced());
Lais Andrade80b18612020-10-12 18:44:40 +0000202 }
203}
204
Lais Andrade28c81f12024-06-24 14:32:22 +0100205std::vector<std::string> FindVibratorManagerNames() {
206 std::vector<std::string> names;
207 constexpr auto callback = [](const char* instance, void* context) {
208 std::string fullName = std::string(IVibratorManager::descriptor) + "/" + instance;
209 static_cast<std::vector<std::string>*>(context)->emplace_back(fullName);
210 };
211 AServiceManager_forEachDeclaredInstance(IVibratorManager::descriptor,
212 static_cast<void*>(&names), callback);
213 return names;
214}
215
Lais Andrade80b18612020-10-12 18:44:40 +0000216GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(VibratorAidl);
Lais Andrade28c81f12024-06-24 14:32:22 +0100217INSTANTIATE_TEST_SUITE_P(Vibrator, VibratorAidl, testing::ValuesIn(FindVibratorManagerNames()),
218 android::PrintInstanceNameToString);
Lais Andrade80b18612020-10-12 18:44:40 +0000219
220int main(int argc, char** argv) {
221 ::testing::InitGoogleTest(&argc, argv);
Lais Andrade28c81f12024-06-24 14:32:22 +0100222 ABinderProcess_setThreadPoolMaxThreadCount(1);
223 ABinderProcess_startThreadPool();
Lais Andrade80b18612020-10-12 18:44:40 +0000224 return RUN_ALL_TESTS();
225}