14d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro/*
24d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * Copyright (C) 2016 The Android Open Source Project
34d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro *
44d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * Licensed under the Apache License, Version 2.0 (the "License");
54d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * you may not use this file except in compliance with the License.
64d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * You may obtain a copy of the License at
74d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro *
84d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro *      http://www.apache.org/licenses/LICENSE-2.0
94d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro *
104d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * Unless required by applicable law or agreed to in writing, software
114d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * distributed under the License is distributed on an "AS IS" BASIS,
124d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * See the License for the specific language governing permissions and
144d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * limitations under the License.
154d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro */
164d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
174d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro#include <general_test/basic_sensor_test_base.h>
184d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
194d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro#include <cinttypes>
204d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro#include <cstddef>
214d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
224d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro#include <shared/send_message.h>
234d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
244d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro#include <chre.h>
254d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
264d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurousing nanoapp_testing::MessageType;
274d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurousing nanoapp_testing::sendFatalFailureToHost;
284d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurousing nanoapp_testing::sendInternalFailureToHost;
294d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurousing nanoapp_testing::sendStringToHost;
304d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurousing nanoapp_testing::sendSuccessToHost;
314d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
324d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro/*
334d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * Our general test flow is as follows:
344d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro *
354d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * Constructor: Send startEvent to self to start.
364d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * StartEvent: Get default sensor and perform various sanity checks.  Configure
374d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro *    the sensor.
384d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro *
394d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * At this point, it depends what kind of sensor we have for how we proceed
404d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * with the test.
414d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro *
424d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * One-shot: finishTest()
434d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * On-change: Wait for one data event from sensor.  Then finishTest().
444d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * Continuous: Wait for two data events from sensor.  Then finishTest().
454d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro *
464d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * We also look for and perform basic sanity checking on sampling status
474d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * change events, as well as bias data reports.
484d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro */
494d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
504d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
514d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguronamespace general_test {
524d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
534d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguronamespace {
544d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguroconstexpr uint16_t kStartEvent = CHRE_EVENT_FIRST_USER_VALUE;
554d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguroconstexpr uint16_t kPassiveCompleteEvent = CHRE_EVENT_FIRST_USER_VALUE + 1;
564d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguroconstexpr uint64_t kNanosecondsPerSecond = 1000000000;
574d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguroconstexpr uint64_t kEventLoopSlack = 100000000;  // 100 msec
584d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
594d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurouint64_t getEventDuration(const chreSensorThreeAxisData *event) {
604d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  uint64_t duration = 0;
614d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  for (size_t i = 0; i < event->header.readingCount; i++) {
624d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    duration += event->readings[i].timestampDelta;
634d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
644d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
654d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  return duration;
664d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro}
674d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro} // anonymous namespace
684d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
694d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur IshiguroBasicSensorTestBase::BasicSensorTestBase()
704d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  : Test(CHRE_API_VERSION_1_0),
714d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    mInMethod(true),
724d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    mExternalSamplingStatusChange(false),
734d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    mDoneWithPassiveConfigure(false),
744d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    mState(State::kPreStart),
754d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    mInstanceId(chreGetInstanceId())
764d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    /* All other members initialized later */ {
774d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro}
784d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
794d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid BasicSensorTestBase::setUp(uint32_t messageSize,
804d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                                const void * /* message */) {
814d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (messageSize != 0) {
824d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost(
834d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro        "Beginning message expects 0 additional bytes, got ",
844d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro        &messageSize);
854d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
864d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // Most tests start running in the constructor.  However, since this
874d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // is a base class, and we invoke abstract methods when running our
884d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // test, we don't start until after the class has been fully
894d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // constructed.
904d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (!chreSendEvent(kStartEvent, nullptr, nullptr, mInstanceId)) {
914d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("Failed chreSendEvent to begin test");
924d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
934d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  mInMethod = false;
944d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro}
954d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
964d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid BasicSensorTestBase::checkPassiveConfigure() {
974d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  chreSensorConfigureMode mode = isOneShotSensor() ?
984d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      CHRE_SENSOR_CONFIGURE_MODE_PASSIVE_ONE_SHOT :
994d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      CHRE_SENSOR_CONFIGURE_MODE_PASSIVE_CONTINUOUS;
1004d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1014d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (mApiVersion == CHRE_API_VERSION_1_0) {
1024d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // Any attempt to make a PASSIVE call with a non-default interval
1034d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // or latency should fail.
1044d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    if (chreSensorConfigure(mSensorHandle, mode,
1054d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                            CHRE_SENSOR_INTERVAL_DEFAULT, 999)) {
1064d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      sendFatalFailureToHost("chreSensorConfigure() allowed passive with "
1074d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                             "different latency");
1084d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    }
1094d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    if (chreSensorConfigure(mSensorHandle, mode,
1104d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                            999, CHRE_SENSOR_LATENCY_DEFAULT)) {
1114d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      sendFatalFailureToHost("chreSensorConfigure() allowed passive with "
1124d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                             "different interval");
1134d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    }
1144d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // TODO: In a more in-depth test, we should test passive mode
1154d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    //     receiving data.  This is somewhat complicated by the fact that
1164d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    //     pretty much by definition, we don't control whether a sensor
1174d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    //     we're passively listening to is enabled or not.  We could try
1184d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    //     to control this with an additional test nanoapp toggling sensor
1194d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    //     usage, but there's still the complication of other nanoapps in
1204d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    //     the system.
1214d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  } else {
1224d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    if (!chreSensorConfigure(mSensorHandle, mode,
1234d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                             CHRE_SENSOR_INTERVAL_DEFAULT,
1244d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                             kNanosecondsPerSecond)) {
1254d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      sendFatalFailureToHost("chreSensorConfigure() failed passive with "
1264d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                             "default interval and non-default latency");
1274d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    }
1284d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    if (!isOneShotSensor() && !chreSensorConfigure(
1294d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro        mSensorHandle, mode, kNanosecondsPerSecond,
1304d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro        CHRE_SENSOR_LATENCY_DEFAULT)) {
1314d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      sendFatalFailureToHost("chreSensorConfigure() failed passive with "
1324d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                             "non-default interval and default latency");
1334d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    }
1344d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    if (!isOneShotSensor() && !chreSensorConfigure(
1354d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro        mSensorHandle, mode, kNanosecondsPerSecond,
1364d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro        kNanosecondsPerSecond)) {
1374d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      sendFatalFailureToHost("chreSensorConfigure() failed passive with "
1384d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                             "non-default interval and latency");
1394d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    }
1404d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1414d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro}
1424d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1434d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid BasicSensorTestBase::startTest() {
1444d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  mState = State::kPreConfigure;
1454d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (!chreSensorFindDefault(getSensorType(), &mSensorHandle)) {
1464d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    if (isRequiredSensor()) {
1474d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      sendFatalFailureToHost("Sensor is required, but no default found.");
1484d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    }
1494d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendStringToHost(MessageType::kSkipped, "No default sensor found for "
1504d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                     "optional sensor.");
1514d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    return;
1524d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1534d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1544d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  chreSensorInfo info;
1554d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (!chreGetSensorInfo(mSensorHandle, &info)) {
1564d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("GetSensorInfo() call failed");
1574d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1584d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (info.sensorName == nullptr) {
1594d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("chreSensorInfo::sensorName is NULL");
1604d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1614d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (info.sensorType != getSensorType()) {
1624d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    uint32_t type = info.sensorType;
1634d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("chreSensorInfo::sensorType is not expected "
1644d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                           "value, is:", &type);
1654d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1664d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (info.isOnChange != isOnChangeSensor()) {
1674d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("chreSensorInfo::isOnChange is opposite of "
1684d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                           "what we expected");
1694d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1704d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (info.isOneShot != isOneShotSensor()) {
1714d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("chreSensorInfo::isOneShot is opposite of "
1724d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                           "what we expected");
1734d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1744d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1754d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (!chreGetSensorSamplingStatus(mSensorHandle, &mOriginalStatus)) {
1764d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("chreGetSensorSamplingStatus() failed");
1774d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1784d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1794d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // Nanoapp may start getting events with a passive request. Set the base
1804d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // timestamp to compare against before configuring the sensor.
1814d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  mPreTimestamp = chreGetTime();
1824d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1834d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  checkPassiveConfigure();
1844d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (!chreSendEvent(kPassiveCompleteEvent, nullptr, nullptr, mInstanceId)) {
1854d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("Failed chreSendEvent to complete passive test");
1864d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1874d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1884d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // Default interval/latency must be accepted by all sensors.
1894d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  mNewStatus = {
1904d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    CHRE_SENSOR_INTERVAL_DEFAULT, /* interval */
1914d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    CHRE_SENSOR_LATENCY_DEFAULT, /* latency */
1924d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    true /* enabled */
1934d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  };
1944d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  chreSensorConfigureMode mode = isOneShotSensor() ?
1954d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      CHRE_SENSOR_CONFIGURE_MODE_ONE_SHOT :
1964d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      CHRE_SENSOR_CONFIGURE_MODE_CONTINUOUS;
1974d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1984d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (!chreSensorConfigure(mSensorHandle, mode,
1994d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                           mNewStatus.interval, mNewStatus.latency)) {
2004d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("chreSensorConfigure() call failed with default"
2014d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                           " interval and latency");
2024d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
2034d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // handleEvent may start getting events, and our testing continues there.
2044d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // (Note: The CHRE is not allow to call handleEvent() while we're still
2054d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // in this method, so it's not a race to set this state here.)
2064d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
2074d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // Set a new request so the test can receive events before test timeout.
2084d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  mNewStatus = {
2094d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // This will be valid on all required sensors.
2104d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // TODO: A more in-depth test could try to change this interval
2114d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    //     from what it currently is for the sensor, and confirm it
2124d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    //     changes back when we're DONE.  But that's beyond the current
2134d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    //     scope of this 'basic' test.
2144d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    kNanosecondsPerSecond, /* interval */
2154d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // We want the test to run as quickly as possible.
2164d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // TODO: Similar to the interval, we could try to test changes in
2174d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    //     this value, but it's beyond our 'basic' scope for now.
2184d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    CHRE_SENSOR_LATENCY_ASAP, /* latency */
2194d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    true /* enabled */
2204d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  };
2214d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
2224d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // Skip one-shot sensors for non-default interval configurations.
2234d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (!isOneShotSensor() && !chreSensorConfigure(
2244d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      mSensorHandle, mode, mNewStatus.interval, mNewStatus.latency)) {
2254d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("chreSensorConfigure() call failed");
2264d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
2274d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
2284d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (isOnChangeSensor()) {
2294d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // We should receive the current state of this sensor after the
2304d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // configure call.  However, we're not assured additional events,
2314d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // since we don't know if this is going to change.  Thus, we jump
2324d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // our testing state to waiting for the last event.
2334d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    mState = State::kExpectingLastDataEvent;
2344d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  } else if (isOneShotSensor()) {
2354d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // There's no assurance we'll get any events from a one-shot
2364d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // sensor, so we'll just skip to the end of the test.
2374d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    finishTest();
2384d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  } else {
2394d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    mState = State::kExpectingInitialDataEvent;
2404d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
2414d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro}
2424d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
2434d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid BasicSensorTestBase::finishTest() {
2444d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (!chreSensorConfigureModeOnly(mSensorHandle,
2454d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                                   CHRE_SENSOR_CONFIGURE_MODE_DONE)) {
2464d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("Unable to configure sensor mode to DONE");
2474d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
2484d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  mDoneTimestamp = chreGetTime();
2494d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  chreSensorSamplingStatus status;
2504d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (!chreGetSensorSamplingStatus(mSensorHandle, &status)) {
2514d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("Could not get final sensor info");
2524d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
2534d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (!mExternalSamplingStatusChange) {
2544d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // No one else changed this, so it should be what we had before.
2554d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    if (status.enabled != mOriginalStatus.enabled) {
2564d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      sendFatalFailureToHost("SensorInfo.enabled not back to original");
2574d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    }
2584d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    if (status.interval != mOriginalStatus.interval) {
2594d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      sendFatalFailureToHost("SensorInfo.interval not back to original");
2604d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    }
2614d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    if (status.latency != mOriginalStatus.latency) {
2624d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      sendFatalFailureToHost("SensorInfo.latency not back to original");
2634d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    }
2644d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
2654d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  mState = State::kFinished;
2664d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  sendSuccessToHost();
2674d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro}
2684d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
2694d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid BasicSensorTestBase::sanityCheckHeader(const chreSensorDataHeader* header,
2704d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                                            bool modifyTimestamps,
2714d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                                            uint64_t eventDuration) {
2724d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (header->sensorHandle != mSensorHandle) {
2734d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("SensorDataHeader for wrong handle",
2744d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                           &header->sensorHandle);
2754d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
2764d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
2774d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (!isOnChangeSensor()) {
2784d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // An on-change sensor is supposed to send its current state, which
2794d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // could be timestamped in the past.  Everything else should be
2804d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // getting recent data.
2814d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    uint64_t *minTime = nullptr;
2824d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    uint64_t *timeToUpdate = nullptr;
2834d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
2844d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    if (mState == State::kExpectingInitialDataEvent) {
2854d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      minTime = &mPreTimestamp;
2864d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      timeToUpdate = &mFirstEventTimestamp;
2874d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    } else if (mState == State::kExpectingLastDataEvent) {
2884d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      minTime = &mFirstEventTimestamp;
2894d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      timeToUpdate = &mLastEventTimestamp;
2904d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    } else { // State::kFinished
2914d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      minTime = &mLastEventTimestamp;
2924d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      // Go ahead and update this timestamp again.
2934d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      timeToUpdate = &mLastEventTimestamp;
2944d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    }
2954d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
2964d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // If there's another CHRE client requesting batched sensor data,
2974d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // baseTimestamp can be before mPreTimestamp. Also allow
2984d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // kEventLoopSlack to handle this nanoapp before handling the sensor
2994d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // event.
3004d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    uint64_t minTimeWithSlack =
3014d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro        (*minTime > eventDuration + kEventLoopSlack) ?
3024d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro        (*minTime - eventDuration - kEventLoopSlack) : 0;
3034d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    if (header->baseTimestamp < minTimeWithSlack) {
3044d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      chreLog(CHRE_LOG_ERROR,
3054d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro              "baseTimestamp %" PRIu64 " < minTimeWithSlack %" PRIu64
3064d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro              ": minTime %" PRIu64 " eventDuration %" PRIu64
3074d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro              " kEventLoopSlack %" PRIu64,
3084d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro              header->baseTimestamp, minTimeWithSlack,
3094d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro              *minTime, eventDuration, kEventLoopSlack);
3104d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      sendFatalFailureToHost("SensorDataHeader is in the past");
3114d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    }
3124d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    if ((mState == State::kFinished) &&
3134d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro        (header->baseTimestamp > mDoneTimestamp)) {
3144d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      sendFatalFailureToHost("SensorDataHeader is from after DONE");
3154d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    }
3164d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    if (modifyTimestamps) {
3174d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      *timeToUpdate = header->baseTimestamp;
3184d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    }
3194d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
3204d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (header->readingCount == 0) {
3214d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("SensorDataHeader has readingCount of 0");
3224d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
3234d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if ((header->reserved[0] != 0) || (header->reserved[1] != 0)) {
3244d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("SensorDataHeader has non-zero reserved bytes");
3254d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
3264d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro}
3274d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
3284d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
3294d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid BasicSensorTestBase::handleBiasEvent(
3304d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    uint16_t eventType, const chreSensorThreeAxisData *eventData) {
3314d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  uint8_t expectedSensorType = 0;
3324d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  uint32_t eType = eventType;
3334d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (eventType == CHRE_EVENT_SENSOR_GYROSCOPE_BIAS_INFO) {
3344d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    expectedSensorType = CHRE_SENSOR_TYPE_GYROSCOPE;
3354d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  } else if (eventType == CHRE_EVENT_SENSOR_GEOMAGNETIC_FIELD_BIAS_INFO) {
3364d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    expectedSensorType = CHRE_SENSOR_TYPE_GEOMAGNETIC_FIELD;
3374d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  } else {
3384d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendInternalFailureToHost("Illegal eventType in handleBiasEvent",
3394d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                              &eType);
3404d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
3414d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
3424d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (expectedSensorType != getSensorType()) {
3434d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("Unexpected bias event:", &eType);
3444d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
3454d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  sanityCheckHeader(&eventData->header, false, getEventDuration(eventData));
3464d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
3474d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // TODO: Sanity check the eventData.  This check is out-of-scope for
3484d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  //     Android N testing.
3494d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro}
3504d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
3514d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid BasicSensorTestBase::handleSamplingChangeEvent(
3524d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    const chreSensorSamplingStatusEvent* eventData) {
3534d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (eventData->sensorHandle != mSensorHandle) {
3544d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("SamplingChangeEvent for wrong sensor handle:",
3554d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                           &eventData->sensorHandle);
3564d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
3574d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (mState == State::kFinished) {
3584d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // TODO: If we strictly define whether this event is or isn't
3594d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    //     generated upon being DONE with a sensor, then we can perform
3604d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    //     a strict check here.  For now, we just let this go.
3614d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    return;
3624d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
3634d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // Passive sensor requests do not guarantee sensors will always be enabled.
3644d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // Bypass 'enabled' check for passive configurations.
3654d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (mDoneWithPassiveConfigure && !eventData->status.enabled) {
3664d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("SamplingChangeEvent disabled the sensor.");
3674d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
3684d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
3694d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if ((mNewStatus.interval != eventData->status.interval) ||
3704d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      (mNewStatus.latency != eventData->status.latency)) {
3714d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // This is from someone other than us.  Let's note that so we know
3724d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    // our sanity checks are invalid.
3734d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    mExternalSamplingStatusChange = true;
3744d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
3754d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro}
3764d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
3774d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid BasicSensorTestBase::handleSensorDataEvent(const void* eventData) {
3784d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if ((mState == State::kPreStart) || (mState == State::kPreConfigure)) {
3794d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("SensorDataEvent sent too early.");
3804d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
3814d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // Note, if mState is kFinished, we could be getting batched data which
3824d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // hadn't been delivered yet at the time we were DONE.  We'll sanity
3834d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // check it, even though in theory we're done testing.
3844d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  uint64_t eventDuration = getEventDuration(
3854d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      static_cast<const chreSensorThreeAxisData *>(eventData));
3864d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  sanityCheckHeader(static_cast<const chreSensorDataHeader*>(eventData),
3874d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                    true, eventDuration);
3884d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
3894d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // Send to the sensor itself for any additional checks of actual data.
3904d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  confirmDataIsSane(eventData);
3914d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (mState == State::kExpectingInitialDataEvent) {
3924d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    mState = State::kExpectingLastDataEvent;
3934d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  } else if (mState == State::kExpectingLastDataEvent) {
3944d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    finishTest();
3954d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  } else if (mState != State::kFinished) {
3964d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    uint32_t value = static_cast<uint32_t>(mState);
3974d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendInternalFailureToHost("Illegal mState in handleSensorDataEvent:",
3984d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                              &value);
3994d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
4004d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro}
4014d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
4024d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid BasicSensorTestBase::handleEvent(
4034d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    uint32_t senderInstanceId, uint16_t eventType, const void* eventData) {
4044d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (mInMethod) {
4054d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("handleEvent() invoked while already in "
4064d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                           "method.");
4074d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
4084d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  mInMethod = true;
4094d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  const uint16_t dataEventType =
4104d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      CHRE_EVENT_SENSOR_DATA_EVENT_BASE + getSensorType();
4114d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
4124d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (senderInstanceId == mInstanceId) {
4134d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    if ((eventType == kStartEvent) && (mState == State::kPreStart)) {
4144d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      startTest();
4154d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    } else if (eventType == kPassiveCompleteEvent) {
4164d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      mDoneWithPassiveConfigure = true;
4174d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    }
4184d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
4194d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  } else if ((mState == State::kPreStart) ||
4204d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro             (mState == State::kPreConfigure)) {
4214d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    unexpectedEvent(eventType);
4224d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
4234d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  } else if (senderInstanceId != CHRE_INSTANCE_ID) {
4244d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("Unexpected senderInstanceId:",
4254d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                           &senderInstanceId);
4264d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
4274d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  } else if (eventData == nullptr) {
4284d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    uint32_t eType = eventType;
4294d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("Got NULL eventData for event:", &eType);
4304d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
4314d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  } else if (eventType == dataEventType) {
4324d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    handleSensorDataEvent(eventData);
4334d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
4344d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  } else if (eventType == CHRE_EVENT_SENSOR_SAMPLING_CHANGE) {
4354d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    handleSamplingChangeEvent(
4364d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro        static_cast<const chreSensorSamplingStatusEvent*>(eventData));
4374d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
4384d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  } else if ((eventType == CHRE_EVENT_SENSOR_GYROSCOPE_BIAS_INFO) ||
4394d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro             (eventType == CHRE_EVENT_SENSOR_GEOMAGNETIC_FIELD_BIAS_INFO)) {
4404d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    handleBiasEvent(eventType,
4414d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                    static_cast<const chreSensorThreeAxisData*>(eventData));
4424d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
4434d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  } else {
4444d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    unexpectedEvent(eventType);
4454d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
4464d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
4474d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  mInMethod = false;
4484d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro}
4494d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
4504d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro}  // namespace general_test
451