1 /*
2 * Copyright (C) 2019 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>
18 #include <android/hardware/vibrator/BnVibratorCallback.h>
19 #include <android/hardware/vibrator/IVibrator.h>
20 #include <android/hardware/vibrator/IVibratorManager.h>
21 #include <binder/IServiceManager.h>
22 #include <binder/ProcessState.h>
23
24 #include <cmath>
25 #include <future>
26
27 using android::ProcessState;
28 using android::sp;
29 using android::String16;
30 using android::binder::Status;
31 using android::hardware::vibrator::ActivePwle;
32 using android::hardware::vibrator::BnVibratorCallback;
33 using android::hardware::vibrator::Braking;
34 using android::hardware::vibrator::BrakingPwle;
35 using android::hardware::vibrator::CompositeEffect;
36 using android::hardware::vibrator::CompositePrimitive;
37 using android::hardware::vibrator::Effect;
38 using android::hardware::vibrator::EffectStrength;
39 using android::hardware::vibrator::IVibrator;
40 using android::hardware::vibrator::IVibratorManager;
41 using android::hardware::vibrator::PrimitivePwle;
42 using std::chrono::high_resolution_clock;
43
44 const std::vector<Effect> kEffects{android::enum_range<Effect>().begin(),
45 android::enum_range<Effect>().end()};
46 const std::vector<EffectStrength> kEffectStrengths{android::enum_range<EffectStrength>().begin(),
47 android::enum_range<EffectStrength>().end()};
48
49 const std::vector<Effect> kInvalidEffects = {
50 static_cast<Effect>(static_cast<int32_t>(kEffects.front()) - 1),
51 static_cast<Effect>(static_cast<int32_t>(kEffects.back()) + 1),
52 };
53
54 const std::vector<EffectStrength> kInvalidEffectStrengths = {
55 static_cast<EffectStrength>(static_cast<int8_t>(kEffectStrengths.front()) - 1),
56 static_cast<EffectStrength>(static_cast<int8_t>(kEffectStrengths.back()) + 1),
57 };
58
59 const std::vector<CompositePrimitive> kCompositePrimitives{
60 android::enum_range<CompositePrimitive>().begin(),
61 android::enum_range<CompositePrimitive>().end()};
62
63 const std::vector<CompositePrimitive> kRequiredPrimitives = {
64 CompositePrimitive::CLICK, CompositePrimitive::LIGHT_TICK,
65 CompositePrimitive::QUICK_RISE, CompositePrimitive::SLOW_RISE,
66 CompositePrimitive::QUICK_FALL,
67 };
68
69 const std::vector<CompositePrimitive> kInvalidPrimitives = {
70 static_cast<CompositePrimitive>(static_cast<int32_t>(kCompositePrimitives.front()) - 1),
71 static_cast<CompositePrimitive>(static_cast<int32_t>(kCompositePrimitives.back()) + 1),
72 };
73
74 class CompletionCallback : public BnVibratorCallback {
75 public:
CompletionCallback(const std::function<void ()> & callback)76 CompletionCallback(const std::function<void()> &callback) : mCallback(callback) {}
onComplete()77 Status onComplete() override {
78 mCallback();
79 return Status::ok();
80 }
81
82 private:
83 std::function<void()> mCallback;
84 };
85
86 class VibratorAidl : public testing::TestWithParam<std::tuple<int32_t, int32_t>> {
87 public:
SetUp()88 virtual void SetUp() override {
89 int32_t managerIdx = std::get<0>(GetParam());
90 int32_t vibratorId = std::get<1>(GetParam());
91 auto managerAidlNames = android::getAidlHalInstanceNames(IVibratorManager::descriptor);
92
93 if (managerIdx < 0) {
94 // Testing a unmanaged vibrator, using vibratorId as index from registered HALs
95 auto vibratorAidlNames = android::getAidlHalInstanceNames(IVibrator::descriptor);
96 ASSERT_LT(vibratorId, vibratorAidlNames.size());
97 auto vibratorName = String16(vibratorAidlNames[vibratorId].c_str());
98 vibrator = android::waitForDeclaredService<IVibrator>(vibratorName);
99 } else {
100 // Testing a managed vibrator, using vibratorId to retrieve it from the manager
101 ASSERT_LT(managerIdx, managerAidlNames.size());
102 auto managerName = String16(managerAidlNames[managerIdx].c_str());
103 auto vibratorManager = android::waitForDeclaredService<IVibratorManager>(managerName);
104 auto vibratorResult = vibratorManager->getVibrator(vibratorId, &vibrator);
105 ASSERT_TRUE(vibratorResult.isOk());
106 }
107
108 ASSERT_NE(vibrator, nullptr);
109 ASSERT_TRUE(vibrator->getCapabilities(&capabilities).isOk());
110 }
111
112 sp<IVibrator> vibrator;
113 int32_t capabilities;
114 };
115
isUnknownOrUnsupported(Status status)116 inline bool isUnknownOrUnsupported(Status status) {
117 return status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
118 status.transactionError() == android::UNKNOWN_TRANSACTION;
119 }
120
getResonantFrequencyHz(sp<IVibrator> vibrator,int32_t capabilities)121 static float getResonantFrequencyHz(sp<IVibrator> vibrator, int32_t capabilities) {
122 float resonantFrequencyHz;
123 Status status = vibrator->getResonantFrequency(&resonantFrequencyHz);
124 if (capabilities & IVibrator::CAP_GET_RESONANT_FREQUENCY) {
125 EXPECT_GT(resonantFrequencyHz, 0);
126 EXPECT_EQ(status.exceptionCode(), Status::EX_NONE);
127 } else {
128 EXPECT_TRUE(isUnknownOrUnsupported(status)) << status;
129 }
130 return resonantFrequencyHz;
131 }
132
getFrequencyResolutionHz(sp<IVibrator> vibrator,int32_t capabilities)133 static float getFrequencyResolutionHz(sp<IVibrator> vibrator, int32_t capabilities) {
134 float freqResolutionHz;
135 Status status = vibrator->getFrequencyResolution(&freqResolutionHz);
136 if (capabilities & IVibrator::CAP_FREQUENCY_CONTROL) {
137 EXPECT_GT(freqResolutionHz, 0);
138 EXPECT_EQ(status.exceptionCode(), Status::EX_NONE);
139 } else {
140 EXPECT_TRUE(isUnknownOrUnsupported(status)) << status;
141 }
142 return freqResolutionHz;
143 }
144
getFrequencyMinimumHz(sp<IVibrator> vibrator,int32_t capabilities)145 static float getFrequencyMinimumHz(sp<IVibrator> vibrator, int32_t capabilities) {
146 float freqMinimumHz;
147 Status status = vibrator->getFrequencyMinimum(&freqMinimumHz);
148 if (capabilities & IVibrator::CAP_FREQUENCY_CONTROL) {
149 EXPECT_EQ(status.exceptionCode(), Status::EX_NONE);
150
151 float resonantFrequencyHz = getResonantFrequencyHz(vibrator, capabilities);
152
153 EXPECT_GT(freqMinimumHz, 0);
154 EXPECT_LE(freqMinimumHz, resonantFrequencyHz);
155 } else {
156 EXPECT_TRUE(isUnknownOrUnsupported(status)) << status;
157 }
158 return freqMinimumHz;
159 }
160
getFrequencyMaximumHz(sp<IVibrator> vibrator,int32_t capabilities)161 static float getFrequencyMaximumHz(sp<IVibrator> vibrator, int32_t capabilities) {
162 std::vector<float> bandwidthAmplitudeMap;
163 Status status = vibrator->getBandwidthAmplitudeMap(&bandwidthAmplitudeMap);
164 if (capabilities & IVibrator::CAP_FREQUENCY_CONTROL) {
165 EXPECT_EQ(status.exceptionCode(), Status::EX_NONE);
166 } else {
167 EXPECT_TRUE(isUnknownOrUnsupported(status)) << status;
168 }
169
170 float freqMaximumHz = ((bandwidthAmplitudeMap.size() - 1) *
171 getFrequencyResolutionHz(vibrator, capabilities)) +
172 getFrequencyMinimumHz(vibrator, capabilities);
173 return freqMaximumHz;
174 }
175
getAmplitudeMin()176 static float getAmplitudeMin() {
177 return 0.0;
178 }
179
getAmplitudeMax()180 static float getAmplitudeMax() {
181 return 1.0;
182 }
183
composeValidActivePwle(sp<IVibrator> vibrator,int32_t capabilities)184 static ActivePwle composeValidActivePwle(sp<IVibrator> vibrator, int32_t capabilities) {
185 float frequencyHz;
186 if (capabilities & IVibrator::CAP_GET_RESONANT_FREQUENCY) {
187 frequencyHz = getResonantFrequencyHz(vibrator, capabilities);
188 } else if (capabilities & IVibrator::CAP_FREQUENCY_CONTROL) {
189 frequencyHz = getFrequencyMinimumHz(vibrator, capabilities);
190 } else {
191 frequencyHz = 150.0; // default value commonly used
192 }
193
194 ActivePwle active;
195 active.startAmplitude = (getAmplitudeMin() + getAmplitudeMax()) / 2;
196 active.startFrequency = frequencyHz;
197 active.endAmplitude = (getAmplitudeMin() + getAmplitudeMax()) / 2;
198 active.endFrequency = frequencyHz;
199 vibrator->getPwlePrimitiveDurationMax(&(active.duration));
200
201 return active;
202 }
203
TEST_P(VibratorAidl,OnThenOffBeforeTimeout)204 TEST_P(VibratorAidl, OnThenOffBeforeTimeout) {
205 EXPECT_TRUE(vibrator->on(2000, nullptr /*callback*/).isOk());
206 sleep(1);
207 EXPECT_TRUE(vibrator->off().isOk());
208 }
209
TEST_P(VibratorAidl,OnWithCallback)210 TEST_P(VibratorAidl, OnWithCallback) {
211 if (!(capabilities & IVibrator::CAP_ON_CALLBACK))
212 return;
213
214 std::promise<void> completionPromise;
215 std::future<void> completionFuture{completionPromise.get_future()};
216 sp<CompletionCallback> callback =
217 new CompletionCallback([&completionPromise] { completionPromise.set_value(); });
218 uint32_t durationMs = 250;
219 std::chrono::milliseconds timeout{durationMs * 2};
220 EXPECT_TRUE(vibrator->on(durationMs, callback).isOk());
221 EXPECT_EQ(completionFuture.wait_for(timeout), std::future_status::ready);
222 EXPECT_TRUE(vibrator->off().isOk());
223 }
224
TEST_P(VibratorAidl,OnCallbackNotSupported)225 TEST_P(VibratorAidl, OnCallbackNotSupported) {
226 if (!(capabilities & IVibrator::CAP_ON_CALLBACK)) {
227 sp<CompletionCallback> callback = new CompletionCallback([] {});
228 Status status = vibrator->on(250, callback);
229 EXPECT_TRUE(isUnknownOrUnsupported(status)) << status;
230 }
231 }
232
TEST_P(VibratorAidl,ValidateEffect)233 TEST_P(VibratorAidl, ValidateEffect) {
234 std::vector<Effect> supported;
235 ASSERT_TRUE(vibrator->getSupportedEffects(&supported).isOk());
236
237 for (Effect effect : kEffects) {
238 bool isEffectSupported =
239 std::find(supported.begin(), supported.end(), effect) != supported.end();
240
241 for (EffectStrength strength : kEffectStrengths) {
242 int32_t lengthMs = 0;
243 Status status = vibrator->perform(effect, strength, nullptr /*callback*/, &lengthMs);
244
245 if (isEffectSupported) {
246 EXPECT_TRUE(status.isOk()) << toString(effect) << " " << toString(strength);
247 EXPECT_GT(lengthMs, 0);
248 usleep(lengthMs * 1000);
249 } else {
250 EXPECT_TRUE(isUnknownOrUnsupported(status))
251 << status << " " << toString(effect) << " " << toString(strength);
252 }
253 }
254 }
255 }
256
TEST_P(VibratorAidl,ValidateEffectWithCallback)257 TEST_P(VibratorAidl, ValidateEffectWithCallback) {
258 if (!(capabilities & IVibrator::CAP_PERFORM_CALLBACK))
259 return;
260
261 std::vector<Effect> supported;
262 ASSERT_TRUE(vibrator->getSupportedEffects(&supported).isOk());
263
264 for (Effect effect : kEffects) {
265 bool isEffectSupported =
266 std::find(supported.begin(), supported.end(), effect) != supported.end();
267
268 for (EffectStrength strength : kEffectStrengths) {
269 std::promise<void> completionPromise;
270 std::future<void> completionFuture{completionPromise.get_future()};
271 sp<CompletionCallback> callback =
272 new CompletionCallback([&completionPromise] { completionPromise.set_value(); });
273 int lengthMs = 0;
274 Status status = vibrator->perform(effect, strength, callback, &lengthMs);
275
276 if (isEffectSupported) {
277 EXPECT_TRUE(status.isOk());
278 EXPECT_GT(lengthMs, 0);
279 } else {
280 EXPECT_TRUE(isUnknownOrUnsupported(status)) << status;
281 }
282
283 if (!status.isOk())
284 continue;
285
286 //TODO(b/187207798): revert back to conservative timeout values once
287 //latencies have been fixed
288 std::chrono::milliseconds timeout{lengthMs * 8};
289 EXPECT_EQ(completionFuture.wait_for(timeout), std::future_status::ready);
290 }
291 }
292 }
293
TEST_P(VibratorAidl,ValidateEffectWithCallbackNotSupported)294 TEST_P(VibratorAidl, ValidateEffectWithCallbackNotSupported) {
295 if (capabilities & IVibrator::CAP_PERFORM_CALLBACK)
296 return;
297
298 for (Effect effect : kEffects) {
299 for (EffectStrength strength : kEffectStrengths) {
300 sp<CompletionCallback> callback = new CompletionCallback([] {});
301 int lengthMs;
302 Status status = vibrator->perform(effect, strength, callback, &lengthMs);
303 EXPECT_TRUE(isUnknownOrUnsupported(status)) << status;
304 }
305 }
306 }
307
TEST_P(VibratorAidl,InvalidEffectsUnsupported)308 TEST_P(VibratorAidl, InvalidEffectsUnsupported) {
309 for (Effect effect : kInvalidEffects) {
310 for (EffectStrength strength : kEffectStrengths) {
311 int32_t lengthMs;
312 Status status = vibrator->perform(effect, strength, nullptr /*callback*/, &lengthMs);
313 EXPECT_TRUE(isUnknownOrUnsupported(status))
314 << status << toString(effect) << " " << toString(strength);
315 }
316 }
317 for (Effect effect : kEffects) {
318 for (EffectStrength strength : kInvalidEffectStrengths) {
319 int32_t lengthMs;
320 Status status = vibrator->perform(effect, strength, nullptr /*callback*/, &lengthMs);
321 EXPECT_TRUE(isUnknownOrUnsupported(status))
322 << status << " " << toString(effect) << " " << toString(strength);
323 }
324 }
325 }
326
TEST_P(VibratorAidl,ChangeVibrationAmplitude)327 TEST_P(VibratorAidl, ChangeVibrationAmplitude) {
328 if (capabilities & IVibrator::CAP_AMPLITUDE_CONTROL) {
329 EXPECT_EQ(Status::EX_NONE, vibrator->setAmplitude(0.1f).exceptionCode());
330 EXPECT_TRUE(vibrator->on(2000, nullptr /*callback*/).isOk());
331 EXPECT_EQ(Status::EX_NONE, vibrator->setAmplitude(0.5f).exceptionCode());
332 sleep(1);
333 EXPECT_EQ(Status::EX_NONE, vibrator->setAmplitude(1.0f).exceptionCode());
334 sleep(1);
335 EXPECT_TRUE(vibrator->off().isOk());
336 }
337 }
338
TEST_P(VibratorAidl,AmplitudeOutsideRangeFails)339 TEST_P(VibratorAidl, AmplitudeOutsideRangeFails) {
340 if (capabilities & IVibrator::CAP_AMPLITUDE_CONTROL) {
341 EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT, vibrator->setAmplitude(-1).exceptionCode());
342 EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT, vibrator->setAmplitude(0).exceptionCode());
343 EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT, vibrator->setAmplitude(1.1).exceptionCode());
344 }
345 }
346
TEST_P(VibratorAidl,AmplitudeReturnsUnsupportedMatchingCapabilities)347 TEST_P(VibratorAidl, AmplitudeReturnsUnsupportedMatchingCapabilities) {
348 if ((capabilities & IVibrator::CAP_AMPLITUDE_CONTROL) == 0) {
349 Status status = vibrator->setAmplitude(1);
350 EXPECT_TRUE(isUnknownOrUnsupported(status)) << status;
351 }
352 }
353
TEST_P(VibratorAidl,ChangeVibrationExternalControl)354 TEST_P(VibratorAidl, ChangeVibrationExternalControl) {
355 if (capabilities & IVibrator::CAP_EXTERNAL_CONTROL) {
356 EXPECT_TRUE(vibrator->setExternalControl(true).isOk());
357 sleep(1);
358 EXPECT_TRUE(vibrator->setExternalControl(false).isOk());
359 sleep(1);
360 }
361 }
362
TEST_P(VibratorAidl,ExternalAmplitudeControl)363 TEST_P(VibratorAidl, ExternalAmplitudeControl) {
364 const bool supportsExternalAmplitudeControl =
365 (capabilities & IVibrator::CAP_EXTERNAL_AMPLITUDE_CONTROL) > 0;
366
367 if (capabilities & IVibrator::CAP_EXTERNAL_CONTROL) {
368 EXPECT_TRUE(vibrator->setExternalControl(true).isOk());
369
370 Status amplitudeStatus = vibrator->setAmplitude(0.5);
371 if (supportsExternalAmplitudeControl) {
372 EXPECT_TRUE(amplitudeStatus.isOk());
373 } else {
374 EXPECT_TRUE(isUnknownOrUnsupported(amplitudeStatus)) << amplitudeStatus;
375 }
376 EXPECT_TRUE(vibrator->setExternalControl(false).isOk());
377 } else {
378 EXPECT_FALSE(supportsExternalAmplitudeControl);
379 }
380 }
381
TEST_P(VibratorAidl,ExternalControlUnsupportedMatchingCapabilities)382 TEST_P(VibratorAidl, ExternalControlUnsupportedMatchingCapabilities) {
383 if ((capabilities & IVibrator::CAP_EXTERNAL_CONTROL) == 0) {
384 Status status = vibrator->setExternalControl(true);
385 EXPECT_TRUE(isUnknownOrUnsupported(status)) << status;
386 }
387 }
388
TEST_P(VibratorAidl,GetSupportedPrimitives)389 TEST_P(VibratorAidl, GetSupportedPrimitives) {
390 if (capabilities & IVibrator::CAP_COMPOSE_EFFECTS) {
391 std::vector<CompositePrimitive> supported;
392
393 EXPECT_EQ(Status::EX_NONE, vibrator->getSupportedPrimitives(&supported).exceptionCode());
394
395 for (auto primitive : kCompositePrimitives) {
396 bool isPrimitiveSupported =
397 std::find(supported.begin(), supported.end(), primitive) != supported.end();
398 bool isPrimitiveRequired =
399 std::find(kRequiredPrimitives.begin(), kRequiredPrimitives.end(), primitive) !=
400 kRequiredPrimitives.end();
401
402 EXPECT_TRUE(isPrimitiveSupported || !isPrimitiveRequired) << toString(primitive);
403 }
404 }
405 }
406
TEST_P(VibratorAidl,GetPrimitiveDuration)407 TEST_P(VibratorAidl, GetPrimitiveDuration) {
408 if (capabilities & IVibrator::CAP_COMPOSE_EFFECTS) {
409 std::vector<CompositePrimitive> supported;
410 ASSERT_TRUE(vibrator->getSupportedPrimitives(&supported).isOk());
411
412 for (auto primitive : kCompositePrimitives) {
413 bool isPrimitiveSupported =
414 std::find(supported.begin(), supported.end(), primitive) != supported.end();
415 int32_t duration;
416
417 Status status = vibrator->getPrimitiveDuration(primitive, &duration);
418
419 if (isPrimitiveSupported) {
420 EXPECT_EQ(Status::EX_NONE, status.exceptionCode());
421 if (primitive != CompositePrimitive::NOOP) {
422 ASSERT_GT(duration, 0) << toString(primitive) << " " << duration;
423 }
424 } else {
425 EXPECT_TRUE(isUnknownOrUnsupported(status)) << status;
426 }
427 }
428 }
429 }
430
TEST_P(VibratorAidl,ComposeValidPrimitives)431 TEST_P(VibratorAidl, ComposeValidPrimitives) {
432 if (capabilities & IVibrator::CAP_COMPOSE_EFFECTS) {
433 std::vector<CompositePrimitive> supported;
434 int32_t maxDelay, maxSize;
435
436 ASSERT_TRUE(vibrator->getSupportedPrimitives(&supported).isOk());
437 EXPECT_EQ(Status::EX_NONE, vibrator->getCompositionDelayMax(&maxDelay).exceptionCode());
438 EXPECT_EQ(Status::EX_NONE, vibrator->getCompositionSizeMax(&maxSize).exceptionCode());
439
440 std::vector<CompositeEffect> composite;
441
442 for (auto primitive : supported) {
443 CompositeEffect effect;
444
445 effect.delayMs = std::rand() % (maxDelay + 1);
446 effect.primitive = primitive;
447 effect.scale = static_cast<float>(std::rand()) / static_cast<float>(RAND_MAX);
448 composite.emplace_back(effect);
449
450 if (composite.size() == maxSize) {
451 EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, nullptr).exceptionCode());
452 composite.clear();
453 vibrator->off();
454 }
455 }
456
457 if (composite.size() != 0) {
458 EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, nullptr).exceptionCode());
459 vibrator->off();
460 }
461 }
462 }
463
TEST_P(VibratorAidl,ComposeUnsupportedPrimitives)464 TEST_P(VibratorAidl, ComposeUnsupportedPrimitives) {
465 if (capabilities & IVibrator::CAP_COMPOSE_EFFECTS) {
466 auto unsupported = kInvalidPrimitives;
467 std::vector<CompositePrimitive> supported;
468
469 ASSERT_TRUE(vibrator->getSupportedPrimitives(&supported).isOk());
470
471 for (auto primitive : kCompositePrimitives) {
472 bool isPrimitiveSupported =
473 std::find(supported.begin(), supported.end(), primitive) != supported.end();
474
475 if (!isPrimitiveSupported) {
476 unsupported.push_back(primitive);
477 }
478 }
479
480 for (auto primitive : unsupported) {
481 std::vector<CompositeEffect> composite(1);
482
483 for (auto &effect : composite) {
484 effect.delayMs = 0;
485 effect.primitive = primitive;
486 effect.scale = 1.0f;
487 }
488 Status status = vibrator->compose(composite, nullptr);
489 EXPECT_TRUE(isUnknownOrUnsupported(status)) << status;
490 vibrator->off();
491 }
492 }
493 }
494
TEST_P(VibratorAidl,ComposeScaleBoundary)495 TEST_P(VibratorAidl, ComposeScaleBoundary) {
496 if (capabilities & IVibrator::CAP_COMPOSE_EFFECTS) {
497 std::vector<CompositeEffect> composite(1);
498 CompositeEffect &effect = composite[0];
499
500 effect.delayMs = 0;
501 effect.primitive = CompositePrimitive::CLICK;
502
503 effect.scale = std::nextafter(0.0f, -1.0f);
504 EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT,
505 vibrator->compose(composite, nullptr).exceptionCode());
506
507 effect.scale = 0.0f;
508 EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, nullptr).exceptionCode());
509
510 effect.scale = 1.0f;
511 EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, nullptr).exceptionCode());
512
513 effect.scale = std::nextafter(1.0f, 2.0f);
514 EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT,
515 vibrator->compose(composite, nullptr).exceptionCode());
516
517 vibrator->off();
518 }
519 }
520
TEST_P(VibratorAidl,ComposeDelayBoundary)521 TEST_P(VibratorAidl, ComposeDelayBoundary) {
522 if (capabilities & IVibrator::CAP_COMPOSE_EFFECTS) {
523 int32_t maxDelay;
524
525 EXPECT_EQ(Status::EX_NONE, vibrator->getCompositionDelayMax(&maxDelay).exceptionCode());
526
527 std::vector<CompositeEffect> composite(1);
528 CompositeEffect effect;
529
530 effect.delayMs = 1;
531 effect.primitive = CompositePrimitive::CLICK;
532 effect.scale = 1.0f;
533
534 std::fill(composite.begin(), composite.end(), effect);
535 EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, nullptr).exceptionCode());
536
537 effect.delayMs = maxDelay + 1;
538
539 std::fill(composite.begin(), composite.end(), effect);
540 EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT,
541 vibrator->compose(composite, nullptr).exceptionCode());
542 vibrator->off();
543 }
544 }
545
TEST_P(VibratorAidl,ComposeSizeBoundary)546 TEST_P(VibratorAidl, ComposeSizeBoundary) {
547 if (capabilities & IVibrator::CAP_COMPOSE_EFFECTS) {
548 int32_t maxSize;
549
550 EXPECT_EQ(Status::EX_NONE, vibrator->getCompositionSizeMax(&maxSize).exceptionCode());
551
552 std::vector<CompositeEffect> composite(maxSize);
553 CompositeEffect effect;
554
555 effect.delayMs = 1;
556 effect.primitive = CompositePrimitive::CLICK;
557 effect.scale = 1.0f;
558
559 std::fill(composite.begin(), composite.end(), effect);
560 EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, nullptr).exceptionCode());
561
562 composite.emplace_back(effect);
563 EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT,
564 vibrator->compose(composite, nullptr).exceptionCode());
565 vibrator->off();
566 }
567 }
568
TEST_P(VibratorAidl,ComposeCallback)569 TEST_P(VibratorAidl, ComposeCallback) {
570 if (capabilities & IVibrator::CAP_COMPOSE_EFFECTS) {
571 std::vector<CompositePrimitive> supported;
572
573 ASSERT_TRUE(vibrator->getSupportedPrimitives(&supported).isOk());
574
575 for (auto primitive : supported) {
576 if (primitive == CompositePrimitive::NOOP) {
577 continue;
578 }
579
580 std::promise<void> completionPromise;
581 std::future<void> completionFuture{completionPromise.get_future()};
582 sp<CompletionCallback> callback =
583 new CompletionCallback([&completionPromise] { completionPromise.set_value(); });
584 CompositeEffect effect;
585 std::vector<CompositeEffect> composite;
586 int32_t durationMs;
587 std::chrono::milliseconds duration;
588 std::chrono::time_point<high_resolution_clock> start, end;
589 std::chrono::milliseconds elapsed;
590
591 effect.delayMs = 0;
592 effect.primitive = primitive;
593 effect.scale = 1.0f;
594 composite.emplace_back(effect);
595
596 EXPECT_EQ(Status::EX_NONE,
597 vibrator->getPrimitiveDuration(primitive, &durationMs).exceptionCode())
598 << toString(primitive);
599 duration = std::chrono::milliseconds(durationMs);
600
601 start = high_resolution_clock::now();
602 EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, callback).exceptionCode())
603 << toString(primitive);
604
605 // TODO(b/261130361): Investigate why latency from driver and hardware will cause test
606 // to fail when wait duration is ~40ms or less.
607 EXPECT_EQ(completionFuture.wait_for(duration + std::chrono::milliseconds(50)),
608 std::future_status::ready)
609 << toString(primitive);
610 end = high_resolution_clock::now();
611
612 elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
613 EXPECT_GE(elapsed.count(), duration.count()) << toString(primitive);
614 }
615 }
616 }
617
TEST_P(VibratorAidl,AlwaysOn)618 TEST_P(VibratorAidl, AlwaysOn) {
619 if (capabilities & IVibrator::CAP_ALWAYS_ON_CONTROL) {
620 std::vector<Effect> supported;
621 ASSERT_TRUE(vibrator->getSupportedAlwaysOnEffects(&supported).isOk());
622
623 for (Effect effect : kEffects) {
624 bool isEffectSupported =
625 std::find(supported.begin(), supported.end(), effect) != supported.end();
626
627 for (EffectStrength strength : kEffectStrengths) {
628 Status status = vibrator->alwaysOnEnable(0, effect, strength);
629
630 if (isEffectSupported) {
631 EXPECT_EQ(Status::EX_NONE, status.exceptionCode())
632 << toString(effect) << " " << toString(strength);
633 } else {
634 EXPECT_TRUE(isUnknownOrUnsupported(status))
635 << status << " " << toString(effect) << " " << toString(strength);
636 }
637 }
638 }
639
640 EXPECT_EQ(Status::EX_NONE, vibrator->alwaysOnDisable(0).exceptionCode());
641 }
642 }
643
TEST_P(VibratorAidl,GetResonantFrequency)644 TEST_P(VibratorAidl, GetResonantFrequency) {
645 getResonantFrequencyHz(vibrator, capabilities);
646 }
647
TEST_P(VibratorAidl,GetQFactor)648 TEST_P(VibratorAidl, GetQFactor) {
649 float qFactor;
650 Status status = vibrator->getQFactor(&qFactor);
651 if (capabilities & IVibrator::CAP_GET_Q_FACTOR) {
652 ASSERT_GT(qFactor, 0);
653 EXPECT_EQ(status.exceptionCode(), Status::EX_NONE);
654 } else {
655 EXPECT_TRUE(isUnknownOrUnsupported(status)) << status;
656 }
657 }
658
TEST_P(VibratorAidl,GetFrequencyResolution)659 TEST_P(VibratorAidl, GetFrequencyResolution) {
660 getFrequencyResolutionHz(vibrator, capabilities);
661 }
662
TEST_P(VibratorAidl,GetFrequencyMinimum)663 TEST_P(VibratorAidl, GetFrequencyMinimum) {
664 getFrequencyMinimumHz(vibrator, capabilities);
665 }
666
TEST_P(VibratorAidl,GetBandwidthAmplitudeMap)667 TEST_P(VibratorAidl, GetBandwidthAmplitudeMap) {
668 std::vector<float> bandwidthAmplitudeMap;
669 Status status = vibrator->getBandwidthAmplitudeMap(&bandwidthAmplitudeMap);
670 if (capabilities & IVibrator::CAP_FREQUENCY_CONTROL) {
671 EXPECT_EQ(status.exceptionCode(), Status::EX_NONE);
672 ASSERT_FALSE(bandwidthAmplitudeMap.empty());
673
674 int minMapSize = (getResonantFrequencyHz(vibrator, capabilities) -
675 getFrequencyMinimumHz(vibrator, capabilities)) /
676 getFrequencyResolutionHz(vibrator, capabilities);
677 ASSERT_GT(bandwidthAmplitudeMap.size(), minMapSize);
678
679 for (float e : bandwidthAmplitudeMap) {
680 ASSERT_GE(e, 0.0);
681 ASSERT_LE(e, 1.0);
682 }
683 } else {
684 EXPECT_TRUE(isUnknownOrUnsupported(status)) << status;
685 }
686 }
687
TEST_P(VibratorAidl,GetPwlePrimitiveDurationMax)688 TEST_P(VibratorAidl, GetPwlePrimitiveDurationMax) {
689 int32_t durationMs;
690 Status status = vibrator->getPwlePrimitiveDurationMax(&durationMs);
691 if (capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS) {
692 ASSERT_NE(durationMs, 0);
693 EXPECT_EQ(status.exceptionCode(), Status::EX_NONE);
694 } else {
695 EXPECT_TRUE(isUnknownOrUnsupported(status)) << status;
696 }
697 }
698
TEST_P(VibratorAidl,GetPwleCompositionSizeMax)699 TEST_P(VibratorAidl, GetPwleCompositionSizeMax) {
700 int32_t maxSize;
701 Status status = vibrator->getPwleCompositionSizeMax(&maxSize);
702 if (capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS) {
703 ASSERT_NE(maxSize, 0);
704 EXPECT_EQ(status.exceptionCode(), Status::EX_NONE);
705 } else {
706 EXPECT_TRUE(isUnknownOrUnsupported(status)) << status;
707 }
708 }
709
TEST_P(VibratorAidl,GetSupportedBraking)710 TEST_P(VibratorAidl, GetSupportedBraking) {
711 std::vector<Braking> supported;
712 Status status = vibrator->getSupportedBraking(&supported);
713 if (capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS) {
714 bool isDefaultNoneSupported =
715 std::find(supported.begin(), supported.end(), Braking::NONE) != supported.end();
716 ASSERT_TRUE(isDefaultNoneSupported);
717 EXPECT_EQ(status.exceptionCode(), Status::EX_NONE);
718 } else {
719 EXPECT_TRUE(isUnknownOrUnsupported(status)) << status;
720 }
721 }
722
TEST_P(VibratorAidl,ComposeValidPwle)723 TEST_P(VibratorAidl, ComposeValidPwle) {
724 if (capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS) {
725 ActivePwle firstActive = composeValidActivePwle(vibrator, capabilities);
726
727 std::vector<Braking> supported;
728 ASSERT_TRUE(vibrator->getSupportedBraking(&supported).isOk());
729 bool isClabSupported =
730 std::find(supported.begin(), supported.end(), Braking::CLAB) != supported.end();
731 BrakingPwle firstBraking;
732 firstBraking.braking = isClabSupported ? Braking::CLAB : Braking::NONE;
733 firstBraking.duration = 100;
734
735 ActivePwle secondActive = composeValidActivePwle(vibrator, capabilities);
736 if (capabilities & IVibrator::CAP_FREQUENCY_CONTROL) {
737 float minFrequencyHz = getFrequencyMinimumHz(vibrator, capabilities);
738 float maxFrequencyHz = getFrequencyMaximumHz(vibrator, capabilities);
739 float freqResolutionHz = getFrequencyResolutionHz(vibrator, capabilities);
740 secondActive.startFrequency = minFrequencyHz + (freqResolutionHz / 2.0f);
741 secondActive.endFrequency = maxFrequencyHz - (freqResolutionHz / 3.0f);
742 }
743 BrakingPwle secondBraking;
744 secondBraking.braking = Braking::NONE;
745 secondBraking.duration = 10;
746
747 auto pwleQueue =
748 std::vector<PrimitivePwle>{firstActive, firstBraking, secondActive, secondBraking};
749
750 EXPECT_EQ(Status::EX_NONE, vibrator->composePwle(pwleQueue, nullptr).exceptionCode());
751 EXPECT_TRUE(vibrator->off().isOk());
752 }
753 }
754
TEST_P(VibratorAidl,ComposeValidPwleWithCallback)755 TEST_P(VibratorAidl, ComposeValidPwleWithCallback) {
756 if (!((capabilities & IVibrator::CAP_ON_CALLBACK) &&
757 (capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS)))
758 return;
759
760 std::promise<void> completionPromise;
761 std::future<void> completionFuture{completionPromise.get_future()};
762 sp<CompletionCallback> callback =
763 new CompletionCallback([&completionPromise] { completionPromise.set_value(); });
764 int32_t segmentDurationMaxMs;
765 vibrator->getPwlePrimitiveDurationMax(&segmentDurationMaxMs);
766 uint32_t durationMs = segmentDurationMaxMs * 2 + 100; // Sum of 2 active and 1 braking below
767 //TODO(b/187207798): revert back to conservative timeout values once
768 //latencies have been fixed
769 std::chrono::milliseconds timeout{durationMs * 4};
770
771 ActivePwle active = composeValidActivePwle(vibrator, capabilities);
772
773 std::vector<Braking> supported;
774 ASSERT_TRUE(vibrator->getSupportedBraking(&supported).isOk());
775 bool isClabSupported =
776 std::find(supported.begin(), supported.end(), Braking::CLAB) != supported.end();
777 BrakingPwle braking;
778 braking.braking = isClabSupported ? Braking::CLAB : Braking::NONE;
779 braking.duration = 100;
780
781 auto pwleQueue = std::vector<PrimitivePwle>{active, braking, active};
782
783 EXPECT_TRUE(vibrator->composePwle(pwleQueue, callback).isOk());
784 EXPECT_EQ(completionFuture.wait_for(timeout), std::future_status::ready);
785 EXPECT_TRUE(vibrator->off().isOk());
786 }
787
TEST_P(VibratorAidl,ComposePwleSegmentBoundary)788 TEST_P(VibratorAidl, ComposePwleSegmentBoundary) {
789 if (capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS) {
790 std::vector<PrimitivePwle> pwleQueue;
791 // test empty queue
792 EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT,
793 vibrator->composePwle(pwleQueue, nullptr).exceptionCode());
794 EXPECT_TRUE(vibrator->off().isOk());
795
796 ActivePwle active = composeValidActivePwle(vibrator, capabilities);
797
798 PrimitivePwle pwle;
799 pwle = active;
800 int segmentCountMax;
801 vibrator->getPwleCompositionSizeMax(&segmentCountMax);
802
803 // Create PWLE queue with more segments than allowed
804 for (int i = 0; i < segmentCountMax + 10; i++) {
805 pwleQueue.emplace_back(std::move(pwle));
806 }
807
808 EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT,
809 vibrator->composePwle(pwleQueue, nullptr).exceptionCode());
810 EXPECT_TRUE(vibrator->off().isOk());
811 }
812 }
813
TEST_P(VibratorAidl,ComposePwleAmplitudeParameterBoundary)814 TEST_P(VibratorAidl, ComposePwleAmplitudeParameterBoundary) {
815 if (capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS) {
816 ActivePwle active = composeValidActivePwle(vibrator, capabilities);
817 active.startAmplitude = getAmplitudeMax() + 1.0; // Amplitude greater than allowed
818 active.endAmplitude = getAmplitudeMax() + 1.0; // Amplitude greater than allowed
819
820 auto pwleQueueGreater = std::vector<PrimitivePwle>{active};
821
822 EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT,
823 vibrator->composePwle(pwleQueueGreater, nullptr).exceptionCode());
824 EXPECT_TRUE(vibrator->off().isOk());
825
826 active.startAmplitude = getAmplitudeMin() - 1.0; // Amplitude less than allowed
827 active.endAmplitude = getAmplitudeMin() - 1.0; // Amplitude less than allowed
828
829 auto pwleQueueLess = std::vector<PrimitivePwle>{active};
830
831 EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT,
832 vibrator->composePwle(pwleQueueLess, nullptr).exceptionCode());
833 EXPECT_TRUE(vibrator->off().isOk());
834 }
835 }
836
TEST_P(VibratorAidl,ComposePwleFrequencyParameterBoundary)837 TEST_P(VibratorAidl, ComposePwleFrequencyParameterBoundary) {
838 if ((capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS) &&
839 (capabilities & IVibrator::CAP_FREQUENCY_CONTROL)) {
840 float freqMinimumHz = getFrequencyMinimumHz(vibrator, capabilities);
841 float freqMaximumHz = getFrequencyMaximumHz(vibrator, capabilities);
842 float freqResolutionHz = getFrequencyResolutionHz(vibrator, capabilities);
843
844 ActivePwle active = composeValidActivePwle(vibrator, capabilities);
845 active.startFrequency =
846 freqMaximumHz + freqResolutionHz; // Frequency greater than allowed
847 active.endFrequency = freqMaximumHz + freqResolutionHz; // Frequency greater than allowed
848
849 auto pwleQueueGreater = std::vector<PrimitivePwle>{active};
850
851 EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT,
852 vibrator->composePwle(pwleQueueGreater, nullptr).exceptionCode());
853 EXPECT_TRUE(vibrator->off().isOk());
854
855 active.startFrequency = freqMinimumHz - freqResolutionHz; // Frequency less than allowed
856 active.endFrequency = freqMinimumHz - freqResolutionHz; // Frequency less than allowed
857
858 auto pwleQueueLess = std::vector<PrimitivePwle>{active};
859
860 EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT,
861 vibrator->composePwle(pwleQueueLess, nullptr).exceptionCode());
862 EXPECT_TRUE(vibrator->off().isOk());
863 }
864 }
865
TEST_P(VibratorAidl,ComposePwleSegmentDurationBoundary)866 TEST_P(VibratorAidl, ComposePwleSegmentDurationBoundary) {
867 if (capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS) {
868 ActivePwle active = composeValidActivePwle(vibrator, capabilities);
869
870 int32_t segmentDurationMaxMs;
871 vibrator->getPwlePrimitiveDurationMax(&segmentDurationMaxMs);
872 active.duration = segmentDurationMaxMs + 10; // Segment duration greater than allowed
873
874 auto pwleQueue = std::vector<PrimitivePwle>{active};
875
876 EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT,
877 vibrator->composePwle(pwleQueue, nullptr).exceptionCode());
878 EXPECT_TRUE(vibrator->off().isOk());
879 }
880 }
881
GenerateVibratorMapping()882 std::vector<std::tuple<int32_t, int32_t>> GenerateVibratorMapping() {
883 std::vector<std::tuple<int32_t, int32_t>> tuples;
884 auto managerAidlNames = android::getAidlHalInstanceNames(IVibratorManager::descriptor);
885 std::vector<int32_t> vibratorIds;
886
887 for (int i = 0; i < managerAidlNames.size(); i++) {
888 auto managerName = String16(managerAidlNames[i].c_str());
889 auto vibratorManager = android::waitForDeclaredService<IVibratorManager>(managerName);
890 if (vibratorManager->getVibratorIds(&vibratorIds).isOk()) {
891 for (auto &vibratorId : vibratorIds) {
892 tuples.push_back(std::make_tuple(i, vibratorId));
893 }
894 }
895 }
896
897 auto vibratorAidlNames = android::getAidlHalInstanceNames(IVibrator::descriptor);
898 for (int i = 0; i < vibratorAidlNames.size(); i++) {
899 tuples.push_back(std::make_tuple(-1, i));
900 }
901
902 return tuples;
903 }
904
PrintGeneratedTest(const testing::TestParamInfo<VibratorAidl::ParamType> & info)905 std::string PrintGeneratedTest(const testing::TestParamInfo<VibratorAidl::ParamType> &info) {
906 const auto &[managerIdx, vibratorId] = info.param;
907 if (managerIdx < 0) {
908 return std::string("TOP_LEVEL_VIBRATOR_") + std::to_string(vibratorId);
909 }
910 return std::string("MANAGER_") + std::to_string(managerIdx) + "_VIBRATOR_ID_" +
911 std::to_string(vibratorId);
912 }
913
914 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(VibratorAidl);
915 INSTANTIATE_TEST_SUITE_P(Vibrator, VibratorAidl, testing::ValuesIn(GenerateVibratorMapping()),
916 PrintGeneratedTest);
917
main(int argc,char ** argv)918 int main(int argc, char **argv) {
919 ::testing::InitGoogleTest(&argc, argv);
920 ProcessState::self()->setThreadPoolMaxThreadCount(1);
921 ProcessState::self()->startThreadPool();
922 return RUN_ALL_TESTS();
923 }
924