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/send_event_test.h>
184d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
194d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro#include <cstddef>
204d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
214d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro#include <shared/abort.h>
224d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro#include <shared/array_length.h>
234d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro#include <shared/send_message.h>
244d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
254d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro#include <chre.h>
264d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
274d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurousing nanoapp_testing::sendFatalFailureToHost;
284d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurousing nanoapp_testing::sendSuccessToHost;
294d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
304d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro/*
314d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * In a properly running test, we'll invoke chreSendEvent() a total of 12 times.
324d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * We initially send eight events upon startup.  And then for each of our four
334d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * events which has a non-nullptr completeCallback, we call chreSendEvent()
344d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * from that callback.
354d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro *
364d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * For our first eight events, they will either be kEventType0 or kEventType1.
374d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * They will either use completeCallback0 or completeCallback1.  They have
384d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * various data.  This table describes them all:
394d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro *
404d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * num | eventType | data       | Callback
414d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * ----|-----------|------------|---------
424d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * 0   | 0         | ptr to num | 0
434d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * 1   | 0         | ptr to num | 1
444d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * 2   | 1         | ptr to num | 0
454d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * 3   | 1         | ptr to num | 1
464d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * 4   | 0         | ptr to num | nullptr
474d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * 5   | 1         | ptr to num | nullptr
484d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * 6   | 0         | nullptr    | nullptr
494d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * 7   | 1         | kOddData   | nullptr
504d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro *
514d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * The other four events are all kEventTypeCallback with nullptr data and
524d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * nullptr callback.
534d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro */
544d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
554d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguroconstexpr uint16_t kEventType0 = CHRE_EVENT_FIRST_USER_VALUE + 0;
564d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguroconstexpr uint16_t kEventType1 = CHRE_EVENT_FIRST_USER_VALUE + 1;
574d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguroconstexpr uint16_t kEventTypeCallback = CHRE_EVENT_FIRST_USER_VALUE + 2;
584d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
594d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro// NOTE: This is not allowed to be constexpr, even if some version of g++/clang
604d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro//     allow it.
614d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurostatic void *kOddData = reinterpret_cast<void*>(-1);
624d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
634d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguronamespace general_test {
644d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
654d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurobool SendEventTest::sInMethod = false;
664d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurouint8_t SendEventTest::sCallbacksInvoked = 0;
674d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
684d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurotemplate<uint8_t kCallbackIndex>
694d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid SendEventTest::completeCallback(uint16_t eventType, void *data) {
704d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (sInMethod) {
714d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("completeCallback called while another nanoapp "
724d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                           "method is running.");
734d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
744d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  sInMethod = true;
754d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if ((data == nullptr) || (data == kOddData)) {
764d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost(
774d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro        "completeCallback called with nullptr or odd data.");
784d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
794d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  uint32_t num = *(reinterpret_cast<uint32_t*>(data));
804d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  uint16_t expectedEventType = 0xFFFF;
814d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  uint8_t expectedCallbackIndex = 0xFF;
824d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  switch (num) {
834d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    case 0:
844d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      expectedEventType = kEventType0;
854d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      expectedCallbackIndex = 0;
864d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      break;
874d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    case 1:
884d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      expectedEventType = kEventType0;
894d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      expectedCallbackIndex = 1;
904d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      break;
914d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    case 2:
924d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      expectedEventType = kEventType1;
934d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      expectedCallbackIndex = 0;
944d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      break;
954d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    case 3:
964d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      expectedEventType = kEventType1;
974d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      expectedCallbackIndex = 1;
984d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      break;
994d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    default:
1004d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      sendFatalFailureToHost("completeCallback given bad data.", &num);
1014d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1024d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (expectedEventType != eventType) {
1034d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("completeCallback bad/eventType mismatch.");
1044d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1054d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (expectedCallbackIndex != kCallbackIndex) {
1064d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("Incorrect callback function called.");
1074d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1084d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  uint8_t mask = 1 << num;
1094d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if ((sCallbacksInvoked & mask) != 0) {
1104d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("Complete callback invoked multiple times for ",
1114d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                           &num);
1124d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1134d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  sCallbacksInvoked |= mask;
1144d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1154d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (!chreSendEvent(kEventTypeCallback, nullptr, nullptr,
1164d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                     chreGetInstanceId())) {
1174d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("Failed chreSendEvent in callback.");
1184d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1194d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  sInMethod = false;
1204d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro}
1214d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1224d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid SendEventTest::completeCallback0(uint16_t eventType, void *data) {
1234d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  completeCallback<0>(eventType, data);
1244d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro}
1254d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1264d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid SendEventTest::completeCallback1(uint16_t eventType, void *data) {
1274d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  completeCallback<1>(eventType, data);
1284d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro}
1294d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1304d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur IshiguroSendEventTest::SendEventTest()
1314d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  : Test(CHRE_API_VERSION_1_0) , mNextNum(0) {
1324d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro}
1334d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1344d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid SendEventTest::setUp(uint32_t messageSize, const void * /* message */) {
1354d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  sInMethod = true;
1364d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (messageSize != 0) {
1374d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost(
1384d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro        "SendEvent message expects 0 additional bytes, got ",
1394d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro        &messageSize);
1404d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1414d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1424d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  const uint32_t id = chreGetInstanceId();
1434d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  for (uint32_t i = 0; i < arrayLength(mData); i++) {
1444d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    mData[i] = i;
1454d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1464d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1474d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // num: 0
1484d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (!chreSendEvent(kEventType0, &mData[0], completeCallback0, id)) {
1494d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("Failed chreSendEvent num 0");
1504d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1514d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1524d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // num: 1
1534d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (!chreSendEvent(kEventType0, &mData[1], completeCallback1, id)) {
1544d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("Failed chreSendEvent num 1");
1554d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1564d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1574d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // num: 2
1584d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (!chreSendEvent(kEventType1, &mData[2], completeCallback0, id)) {
1594d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("Failed chreSendEvent num 2");
1604d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1614d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1624d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // num: 3
1634d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (!chreSendEvent(kEventType1, &mData[3], completeCallback1, id)) {
1644d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("Failed chreSendEvent num 3");
1654d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1664d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1674d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // num: 4
1684d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (!chreSendEvent(kEventType0, &mData[4], nullptr, id)) {
1694d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("Failed chreSendEvent num 4");
1704d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1714d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1724d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // num: 5
1734d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (!chreSendEvent(kEventType1, &mData[5], nullptr, id)) {
1744d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("Failed chreSendEvent num 5");
1754d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1764d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1774d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // num: 6
1784d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (!chreSendEvent(kEventType0, nullptr, nullptr, id)) {
1794d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("Failed chreSendEvent num 6");
1804d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1814d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1824d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  // num: 7
1834d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (!chreSendEvent(kEventType1, kOddData, nullptr, id)) {
1844d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("Failed chreSendEvent num 7");
1854d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1864d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1874d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  sInMethod = false;
1884d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro}
1894d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
1904d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid SendEventTest::handleEvent(uint32_t senderInstanceId,
1914d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                                uint16_t eventType, const void* eventData) {
1924d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (sInMethod) {
1934d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("handleEvent invoked while another nanoapp "
1944d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                           "method is running");
1954d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
1964d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  sInMethod = true;
1974d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (senderInstanceId != chreGetInstanceId()) {
1984d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    sendFatalFailureToHost("handleEvent got event from unexpected sender:",
1994d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                           &senderInstanceId);
2004d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
2014d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
2024d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  if (mNextNum < 8) {
2034d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    void *expectedData;
2044d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    if (mNextNum < 6) {
2054d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      expectedData = &mData[mNextNum];
2064d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    } else if (mNextNum == 6) {
2074d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      expectedData = nullptr;
2084d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    } else {
2094d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      expectedData = kOddData;
2104d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    }
2114d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
2124d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    uint16_t expectedEventType = 0xFFFF;
2134d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    switch (mNextNum) {
2144d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      case 0:
2154d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      case 1:
2164d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      case 4:
2174d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      case 6:
2184d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro        expectedEventType = kEventType0;
2194d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro        break;
2204d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      case 2:
2214d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      case 3:
2224d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      case 5:
2234d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      case 7:
2244d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro        expectedEventType = kEventType1;
2254d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro        break;
2264d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    }
2274d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
2284d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    if (expectedEventType != eventType) {
2294d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      sendFatalFailureToHost("Incorrect event type sent for num ",
2304d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro                             &mNextNum);
2314d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    }
2324d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    if (expectedData != eventData) {
2334d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      sendFatalFailureToHost("Incorrect data sent for num ", &mNextNum);
2344d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    }
2354d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
2364d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  } else {
2374d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    if (eventType != kEventTypeCallback) {
2384d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      sendFatalFailureToHost("Unexpected event type for num ", &mNextNum);
2394d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    }
2404d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    if (mNextNum == 11) {
2414d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      // This was our last callback.  Everything is good.
2424d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro      sendSuccessToHost();
2434d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro    }
2444d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  }
2454d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
2464d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  mNextNum++;
2474d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro  sInMethod = false;
2484d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro}
2494d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro
2504d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro}  // namespace general_test
251