1171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju/*
2171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * Copyright (C) 2017 The Android Open Source Project
3171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju *
4171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * Licensed under the Apache License, Version 2.0 (the "License");
5171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * you may not use this file except in compliance with the License.
6171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * You may obtain a copy of the License at
7171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju *
8171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju *      http://www.apache.org/licenses/LICENSE-2.0
9171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju *
10171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * Unless required by applicable law or agreed to in writing, software
11171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * distributed under the License is distributed on an "AS IS" BASIS,
12171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * See the License for the specific language governing permissions and
14171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * limitations under the License.
15171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju */
16171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju
178a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju#include "TestMsgQ.h"
188a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju
198a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsarajunamespace android {
208a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsarajunamespace hardware {
218a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsarajunamespace tests {
228a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsarajunamespace msgq {
238a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsarajunamespace V1_0 {
248a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsarajunamespace implementation {
258a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju
268a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju// Methods from ::android::hardware::tests::msgq::V1_0::ITestMsgQ follow.
278a7086296c145494ca35f93cd9c4f45a1c646689Hridya ValsarajuReturn<void> TestMsgQ::configureFmqSyncReadWrite(configureFmqSyncReadWrite_cb _hidl_cb) {
288a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    static constexpr size_t kNumElementsInQueue = 1024;
298a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    mFmqSynchronized.reset(new (std::nothrow) MessageQueueSync(
308a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju            kNumElementsInQueue, true /* configureEventFlagWord */));
318a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    if ((mFmqSynchronized == nullptr) || (mFmqSynchronized->isValid() == false)) {
328a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju        _hidl_cb(false /* ret */, MessageQueueSync::Descriptor());
338a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    } else {
348a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju        /*
358a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju         * Initialize the EventFlag word with bit FMQ_NOT_FULL.
368a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju         */
378a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju        auto evFlagWordPtr = mFmqSynchronized->getEventFlagWord();
388a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju        if (evFlagWordPtr != nullptr) {
398a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju            std::atomic_init(evFlagWordPtr,
408a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju                             static_cast<uint32_t>(ITestMsgQ::EventFlagBits::FMQ_NOT_FULL));
418a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju        }
428a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju        _hidl_cb(true /* ret */, *mFmqSynchronized->getDesc());
438a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    }
448a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    return Void();
458a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju}
468a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju
478a7086296c145494ca35f93cd9c4f45a1c646689Hridya ValsarajuReturn<void> TestMsgQ::getFmqUnsyncWrite(bool configureFmq, getFmqUnsyncWrite_cb _hidl_cb) {
488a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    if (configureFmq) {
498a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju        static constexpr size_t kNumElementsInQueue = 1024;
508a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju        mFmqUnsynchronized.reset(new (std::nothrow) MessageQueueUnsync(kNumElementsInQueue));
518a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    }
528a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    if ((mFmqUnsynchronized == nullptr) ||
538a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju        (mFmqUnsynchronized->isValid() == false)) {
548a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju        _hidl_cb(false /* ret */, MessageQueueUnsync::Descriptor());
558a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    } else {
568a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju        _hidl_cb(true /* ret */, *mFmqUnsynchronized->getDesc());
578a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    }
588a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    return Void();
598a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju}
608a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju
618a7086296c145494ca35f93cd9c4f45a1c646689Hridya ValsarajuReturn<bool> TestMsgQ::requestWriteFmqSync(int32_t count) {
628a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    std::vector<uint16_t> data(count);
638a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    for (int i = 0; i < count; i++) {
648a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju        data[i] = i;
658a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    }
668a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    bool result = mFmqSynchronized->write(&data[0], count);
678a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    return result;
688a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju}
698a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju
708a7086296c145494ca35f93cd9c4f45a1c646689Hridya ValsarajuReturn<bool> TestMsgQ::requestReadFmqSync(int32_t count) {
718a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    std::vector<uint16_t> data(count);
728a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    bool result = mFmqSynchronized->read(&data[0], count)
738a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju            && verifyData(&data[0], count);
748a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    return result;
758a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju}
768a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju
778a7086296c145494ca35f93cd9c4f45a1c646689Hridya ValsarajuReturn<bool> TestMsgQ::requestWriteFmqUnsync(int32_t count) {
788a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    std::vector<uint16_t> data(count);
798a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    for (int i = 0; i < count; i++) {
808a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju        data[i] = i;
818a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    }
828a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    bool result = mFmqUnsynchronized->write(&data[0], count);
838a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    return result;
848a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju}
858a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju
868a7086296c145494ca35f93cd9c4f45a1c646689Hridya ValsarajuReturn<bool> TestMsgQ::requestReadFmqUnsync(int32_t count) {
878a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    std::vector<uint16_t> data(count);
888a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    bool result =
898a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju            mFmqUnsynchronized->read(&data[0], count) && verifyData(&data[0], count);
908a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    return result;
918a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju}
928a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju
938a7086296c145494ca35f93cd9c4f45a1c646689Hridya ValsarajuReturn<void> TestMsgQ::requestBlockingRead(int32_t count) {
948a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    std::vector<uint16_t> data(count);
958a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    bool result = mFmqSynchronized->readBlocking(
968a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju            &data[0],
978a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju            count,
988a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju            static_cast<uint32_t>(ITestMsgQ::EventFlagBits::FMQ_NOT_FULL),
998a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju            static_cast<uint32_t>(ITestMsgQ::EventFlagBits::FMQ_NOT_EMPTY),
1008a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju            5000000000 /* timeOutNanos */);
1018a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju
1028a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    if (result == false) {
1038a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju        ALOGE("Blocking read fails");
1048a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    }
1058a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    return Void();
1068a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju}
1078a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju
1088a7086296c145494ca35f93cd9c4f45a1c646689Hridya ValsarajuReturn<void> TestMsgQ::requestBlockingReadDefaultEventFlagBits(int32_t count) {
1098a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    std::vector<uint16_t> data(count);
1108a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    bool result = mFmqSynchronized->readBlocking(
1118a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju            &data[0],
1128a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju            count);
1138a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju
1148a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    if (result == false) {
1158a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju        ALOGE("Blocking read fails");
1168a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    }
1178a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju
1188a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    return Void();
1198a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju}
1208a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju
1218a7086296c145494ca35f93cd9c4f45a1c646689Hridya ValsarajuReturn<void> TestMsgQ::requestBlockingReadRepeat(int32_t count, int32_t numIter) {
1228a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    std::vector<uint16_t> data(count);
1238a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    for (int i = 0; i < numIter; i++) {
1248a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju        bool result = mFmqSynchronized->readBlocking(
1258a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju                &data[0],
1268a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju                count,
1278a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju                static_cast<uint32_t>(ITestMsgQ::EventFlagBits::FMQ_NOT_FULL),
1288a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju                static_cast<uint32_t>(ITestMsgQ::EventFlagBits::FMQ_NOT_EMPTY),
1298a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju                5000000000 /* timeOutNanos */);
1308a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju
1318a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju        if (result == false) {
1328a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju            ALOGE("Blocking read fails");
1338a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju            break;
1348a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju        }
1358a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    }
1368a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    return Void();
1378a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju}
1388a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju
1398a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju
1408a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju// Methods from ::android::hidl::base::V1_0::IBase follow.
1418a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju
1428a7086296c145494ca35f93cd9c4f45a1c646689Hridya ValsarajuITestMsgQ* HIDL_FETCH_ITestMsgQ(const char* /* name */) {
1438a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju    return new TestMsgQ();
1448a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju}
1458a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju
1468a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju}  // namespace implementation
1478a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju}  // namespace V1_0
1488a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju}  // namespace msgq
1498a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju}  // namespace tests
1508a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju}  // namespace hardware
1518a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju}  // namespace android
152