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 17 #include <stdint.h> 18 19 #include <gtest/gtest.h> 20 #include <utils/Errors.h> 21 22 #include <android/sensor.h> 23 #include <hardware/sensors-base.h> 24 #include <sensor/SensorManager.h> 25 #include <sensor/SensorEventQueue.h> 26 27 namespace android { 28 29 class SensorEventQueueTest : public ::testing::Test { 30 protected: 31 typedef std::vector<int32_t> Events; 32 33 SensorEventQueueTest() {}; 34 35 virtual void SetUp() override { 36 SensorManager& manager = SensorManager::getInstanceForPackage(String16("SensorEventQueueTest")); 37 mQueue = manager.createEventQueue(); 38 } 39 40 void configureAdditionalInfo(bool enable) { 41 mQueue->requestAdditionalInfo = enable; 42 } 43 44 Events filterEvents(const Events &types) const { 45 // Convert the events into SensorEvent array 46 ASensorEvent* events = new ASensorEvent[types.size()]; 47 for (size_t i = 0; i < types.size(); i++) { 48 events[i].type = types[i]; 49 } 50 51 // Filter the events 52 ssize_t filteredCount = mQueue->filterEvents(events, types.size()); 53 54 // Copy the result into an output vector 55 Events result; 56 for (size_t i = 0; i < filteredCount; i++) { 57 result.push_back(events[i].type); 58 } 59 delete[] events; 60 61 return result; 62 } 63 64 Events getExpectedEvents(const Events &events) const { 65 Events output; 66 for (size_t i = 0; i != events.size(); i++) { 67 // Copy events if the event queue is configured to receive them 68 if (events[i] != SENSOR_TYPE_ADDITIONAL_INFO || mQueue->requestAdditionalInfo) { 69 output.push_back(events[i]); 70 } 71 } 72 return output; 73 } 74 75 void runFilterTest(const Events& events) { 76 Events filtered = filterEvents(events); 77 Events expected = getExpectedEvents(events); 78 EXPECT_EQ(expected.size(), filtered.size()); 79 EXPECT_EQ(expected, filtered); 80 } 81 82 private: 83 sp<SensorEventQueue> mQueue; 84 }; 85 86 TEST_F(SensorEventQueueTest, FilterZeroEvents) { 87 configureAdditionalInfo(false /* enable */); 88 runFilterTest({}); 89 } 90 91 TEST_F(SensorEventQueueTest, FilterEvents_ReceiveAdditionalInfo) { 92 configureAdditionalInfo(true /* enable */); 93 runFilterTest({SENSOR_TYPE_ADDITIONAL_INFO, 94 SENSOR_TYPE_ACCELEROMETER, 95 SENSOR_TYPE_GYROSCOPE, 96 SENSOR_TYPE_ADDITIONAL_INFO, 97 SENSOR_TYPE_ADDITIONAL_INFO, 98 SENSOR_TYPE_MAGNETIC_FIELD}); 99 } 100 101 TEST_F(SensorEventQueueTest, FilterEvents_RemoveAll) { 102 configureAdditionalInfo(false /* enable */); 103 runFilterTest({SENSOR_TYPE_ADDITIONAL_INFO, 104 SENSOR_TYPE_ADDITIONAL_INFO, 105 SENSOR_TYPE_ADDITIONAL_INFO}); 106 } 107 108 TEST_F(SensorEventQueueTest, FilterEvents_RemoveFirst) { 109 configureAdditionalInfo(false /* enable */); 110 runFilterTest({SENSOR_TYPE_ADDITIONAL_INFO, 111 SENSOR_TYPE_ACCELEROMETER, 112 SENSOR_TYPE_GYROSCOPE, 113 SENSOR_TYPE_MAGNETIC_FIELD}); 114 } 115 116 TEST_F(SensorEventQueueTest, FilterEvents_RemoveAllButOne) { 117 configureAdditionalInfo(false /* enable */); 118 runFilterTest({SENSOR_TYPE_ADDITIONAL_INFO, 119 SENSOR_TYPE_ADDITIONAL_INFO, 120 SENSOR_TYPE_ACCELEROMETER, 121 SENSOR_TYPE_ADDITIONAL_INFO}); 122 } 123 124 TEST_F(SensorEventQueueTest, FilterEvents_RemoveLast) { 125 configureAdditionalInfo(false /* enable */); 126 runFilterTest({SENSOR_TYPE_ACCELEROMETER, 127 SENSOR_TYPE_GYROSCOPE, 128 SENSOR_TYPE_MAGNETIC_FIELD, 129 SENSOR_TYPE_ADDITIONAL_INFO}); 130 } 131 132 TEST_F(SensorEventQueueTest, FilterEvents_RemoveConsecutive) { 133 configureAdditionalInfo(false /* enable */); 134 runFilterTest({SENSOR_TYPE_MAGNETIC_FIELD, 135 SENSOR_TYPE_ADDITIONAL_INFO, 136 SENSOR_TYPE_ADDITIONAL_INFO, 137 SENSOR_TYPE_ADDITIONAL_INFO, 138 SENSOR_TYPE_ADDITIONAL_INFO, 139 SENSOR_TYPE_ADDITIONAL_INFO, 140 SENSOR_TYPE_ACCELEROMETER}); 141 } 142 143 TEST_F(SensorEventQueueTest, FilterEvents_RemoveInterleaved) { 144 configureAdditionalInfo(false /* enable */); 145 runFilterTest({SENSOR_TYPE_ACCELEROMETER, 146 SENSOR_TYPE_GYROSCOPE, 147 SENSOR_TYPE_ADDITIONAL_INFO, 148 SENSOR_TYPE_ACCELEROMETER, 149 SENSOR_TYPE_GYROSCOPE, 150 SENSOR_TYPE_ADDITIONAL_INFO, 151 SENSOR_TYPE_MAGNETIC_FIELD}); 152 } 153 154 TEST_F(SensorEventQueueTest, FilterEvents_ReconfigureAdditionalInfo) { 155 configureAdditionalInfo(false /* enable */); 156 const Events events = {SENSOR_TYPE_ACCELEROMETER, 157 SENSOR_TYPE_GYROSCOPE, 158 SENSOR_TYPE_ADDITIONAL_INFO, 159 SENSOR_TYPE_MAGNETIC_FIELD, 160 SENSOR_TYPE_ADDITIONAL_INFO}; 161 runFilterTest(events); 162 163 // Update setting to request Additional Info 164 configureAdditionalInfo(true /* enable */); 165 runFilterTest(events); 166 167 // Update setting to stop requesting Additional Info 168 configureAdditionalInfo(true /* enable */); 169 runFilterTest(events); 170 } 171 172 } // namespace android 173