Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9823fcd8 authored by Shuoq's avatar Shuoq Committed by sqian
Browse files

Add VTS tests for Sap Apis.

Bug: 32022332
Test: vts
Change-Id: I9a55978aa485a59510090f46a8e5edfb87bccc0e
parent 675ae49a
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -44,3 +44,27 @@ cc_test {
        "-g",
    ],
}

cc_test {
    name: "VtsHalSapV1_0TargetTest",
    defaults: ["hidl_defaults"],
    srcs: ["sap_callback.cpp",
           "sap_hidl_hal_api.cpp",
           "sap_hidl_hal_test.cpp",
           "VtsHalSapV1_0TargetTest.cpp"],
    shared_libs: [
        "libbase",
        "liblog",
        "libcutils",
        "libhidlbase",
        "libhidltransport",
        "libnativehelper",
        "libutils",
        "android.hardware.radio@1.0",
    ],
    static_libs: ["VtsHalHidlTargetTestBase"],
    cflags: [
        "-O0",
        "-g",
    ],
}
+28 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include<sap_hidl_hal_utils.h>

int main(int argc, char** argv) {
    // Add Sim-access Profile Hidl Environment
    ::testing::AddGlobalTestEnvironment(new SapHidlEnvironment);
    ::testing::InitGoogleTest(&argc, argv);

    int status = RUN_ALL_TESTS();
    LOG(INFO) << "Test result = " << status;

    return status;
}
+92 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include<sap_hidl_hal_utils.h>

SapCallback::SapCallback(SapHidlTest& parent) : parent(parent) {
}

Return<void> SapCallback::connectResponse(int32_t token, SapConnectRsp /*sapConnectRsp*/,
        int32_t /*maxMsgSize*/) {
    sapResponseToken = token;
    parent.notify();
    return Void();
}

Return<void> SapCallback::disconnectResponse(int32_t token) {
    sapResponseToken = token;
    parent.notify();
    return Void();
}

Return<void> SapCallback::disconnectIndication(int32_t /*token*/,
        SapDisconnectType /*disconnectType*/) {
    return Void();
}

Return<void> SapCallback::apduResponse(int32_t token, SapResultCode resultCode,
        const ::android::hardware::hidl_vec<uint8_t>& /*apduRsp*/) {
    sapResponseToken = token;
    sapResultCode = resultCode;
    parent.notify();
    return Void();
}

Return<void> SapCallback::transferAtrResponse(int32_t token, SapResultCode resultCode,
        const ::android::hardware::hidl_vec<uint8_t>& /*atr*/) {
    sapResponseToken = token;
    sapResultCode = resultCode;
    parent.notify();
    return Void();
}

Return<void> SapCallback::powerResponse(int32_t token, SapResultCode resultCode) {
    sapResponseToken = token;
    sapResultCode = resultCode;
    parent.notify();
    return Void();
}

Return<void> SapCallback::resetSimResponse(int32_t token, SapResultCode resultCode) {
    sapResponseToken = token;
    sapResultCode = resultCode;
    parent.notify();
    return Void();
}

Return<void> SapCallback::statusIndication(int32_t /*token*/, SapStatus /*status*/) {
    return Void();
}

Return<void> SapCallback::transferCardReaderStatusResponse(int32_t token,
            SapResultCode resultCode, int32_t /*cardReaderStatus*/) {
    sapResponseToken = token;
    sapResultCode = resultCode;
    parent.notify();
    return Void();
}

Return<void> SapCallback::errorResponse(int32_t /*token*/) {
    return Void();
}

Return<void> SapCallback::transferProtocolResponse(int32_t token,
            SapResultCode resultCode) {
    sapResponseToken = token;
    sapResultCode = resultCode;
    parent.notify();
    return Void();
}
+131 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include<sap_hidl_hal_utils.h>

/*
 * Test ISap.connectReq() for the response returned.
 */
TEST_F(SapHidlTest, connectReq) {
    int32_t token = 0;
    int32_t maxMsgSize = 100;

    sap->connectReq(++token, maxMsgSize);
    EXPECT_EQ(std::cv_status::no_timeout, wait());
    EXPECT_EQ(sapCb->sapResponseToken, token);
}

/*
 * Test IRadio.disconnectReq() for the response returned
 */
TEST_F(SapHidlTest, disconnectReq) {
    int32_t token = 0;

    sap->disconnectReq(++token);
    EXPECT_EQ(std::cv_status::no_timeout, wait());
    EXPECT_EQ(sapCb->sapResponseToken, token);
}

/*
 * Test IRadio.apduReq() for the response returned.
 */
TEST_F(SapHidlTest, apduReq) {
    int32_t token = 0;
    SapApduType sapApduType = SapApduType::APDU;
    android::hardware::hidl_vec<uint8_t> command = {};

    sap->apduReq(++token, sapApduType, command);
    EXPECT_EQ(std::cv_status::no_timeout, wait());
    EXPECT_EQ(sapCb->sapResponseToken, token);

    ASSERT_TRUE(SapResultCode::CARD_NOT_ACCESSSIBLE == sapCb->sapResultCode ||
              SapResultCode::CARD_ALREADY_POWERED_OFF == sapCb->sapResultCode ||
              SapResultCode::CARD_REMOVED == sapCb->sapResultCode);
}

/*
 * Test IRadio.transferAtrReq() for the response returned.
 */
TEST_F(SapHidlTest, transferAtrReq) {
    int32_t token = 0;

    sap->transferAtrReq(++token);
    EXPECT_EQ(std::cv_status::no_timeout, wait());
    EXPECT_EQ(sapCb->sapResponseToken, token);

    ASSERT_TRUE(SapResultCode::DATA_NOT_AVAILABLE == sapCb->sapResultCode ||
              SapResultCode::CARD_ALREADY_POWERED_OFF == sapCb->sapResultCode ||
              SapResultCode::CARD_REMOVED == sapCb->sapResultCode);
}

/*
 * Test IRadio.powerReq() for the response returned.
 */
TEST_F(SapHidlTest, powerReq) {
    int32_t token = 0;
    bool state = true;

    sap->powerReq(++token, state);
    EXPECT_EQ(std::cv_status::no_timeout, wait());
    EXPECT_EQ(sapCb->sapResponseToken, token);

    ASSERT_TRUE(SapResultCode::CARD_NOT_ACCESSSIBLE == sapCb->sapResultCode ||
              SapResultCode::CARD_ALREADY_POWERED_OFF == sapCb->sapResultCode ||
              SapResultCode::CARD_REMOVED == sapCb->sapResultCode ||
              SapResultCode::CARD_ALREADY_POWERED_ON == sapCb->sapResultCode);
}

/*
 * Test IRadio.resetSimReq() for the response returned.
 */
TEST_F(SapHidlTest, resetSimReq) {
    int32_t token = 0;

    sap->resetSimReq(++token);
    EXPECT_EQ(std::cv_status::no_timeout, wait());
    EXPECT_EQ(sapCb->sapResponseToken, token);

    ASSERT_TRUE(SapResultCode::CARD_NOT_ACCESSSIBLE == sapCb->sapResultCode ||
              SapResultCode::CARD_ALREADY_POWERED_OFF == sapCb->sapResultCode ||
              SapResultCode::CARD_REMOVED == sapCb->sapResultCode);
}

/*
 * Test IRadio.transferCardReaderStatusReq() for the response returned.
 */
TEST_F(SapHidlTest, transferCardReaderStatusReq) {
    int32_t token = 0;

    sap->transferCardReaderStatusReq(++token);
    EXPECT_EQ(std::cv_status::no_timeout, wait());
    EXPECT_EQ(sapCb->sapResponseToken, token);

    EXPECT_EQ(SapResultCode::DATA_NOT_AVAILABLE, sapCb->sapResultCode);
}

/*
 * Test IRadio.setTransferProtocolReq() for the response returned.
 */
TEST_F(SapHidlTest, setTransferProtocolReq) {
    int32_t token = 0;
    SapTransferProtocol sapTransferProtocol = SapTransferProtocol::T0;

    sap->setTransferProtocolReq(++token, sapTransferProtocol);
    EXPECT_EQ(std::cv_status::no_timeout, wait());
    EXPECT_EQ(sapCb->sapResponseToken, token);

    EXPECT_EQ(SapResultCode::NOT_SUPPORTED, sapCb->sapResultCode);
}
+54 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include<sap_hidl_hal_utils.h>

void SapHidlTest::SetUp() {
    sap = ::testing::VtsHalHidlTargetTestBase::getService<ISap>(hidl_string("sap_uim_socket1"));
    ASSERT_NE(sap, nullptr);

    sapCb = new SapCallback(*this);
    ASSERT_NE(sapCb, nullptr);

    count = 0;

    sap->setCallback(sapCb);
}

void SapHidlTest::TearDown() {
}

void SapHidlTest::notify() {
    std::unique_lock<std::mutex> lock(mtx);
    count++;
    cv.notify_one();
}

std::cv_status SapHidlTest::wait() {
    std::unique_lock<std::mutex> lock(mtx);

    std::cv_status status = std::cv_status::no_timeout;
    auto now = std::chrono::system_clock::now();
    while (count == 0) {
        status = cv.wait_until(lock, now + std::chrono::seconds(TIMEOUT_PERIOD));
        if (status == std::cv_status::timeout) {
            return status;
        }
    }
    count--;
    return status;
}
Loading