blob: 9a1c1455762fef19b0922a23f248c3edce7c3567 [file] [log] [blame]
/*
* Copyright (C) 2022 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 <android/binder_manager.h>
#include "radio_sap_utils.h"
#define ASSERT_OK(ret) ASSERT_TRUE((ret).isOk())
#define TIMEOUT_PERIOD 40
void SapTest::SetUp() {
ALOGD("BEGIN %s#%s", ::testing::UnitTest::GetInstance()->current_test_info()->test_suite_name(),
::testing::UnitTest::GetInstance()->current_test_info()->name());
count = 0;
serial = -1;
std::string serviceName = GetParam();
if (!isServiceValidForDeviceConfiguration(serviceName)) {
ALOGI("Skipped the test due to device configuration.");
GTEST_SKIP();
}
sap = ISap::fromBinder(ndk::SpAIBinder(AServiceManager_waitForService(serviceName.c_str())));
ASSERT_NE(sap.get(), nullptr);
sapCb = ndk::SharedRefBase::make<SapCallback>(*this);
ASSERT_NE(sapCb.get(), nullptr);
ndk::ScopedAStatus res = sap->setCallback(sapCb);
ASSERT_OK(res) << res;
}
void SapTest::TearDown() {
count_ = 0;
serial = -1;
ALOGD("END %s#%s", ::testing::UnitTest::GetInstance()->current_test_info()->test_suite_name(),
::testing::UnitTest::GetInstance()->current_test_info()->name());
}
::testing::AssertionResult SapTest::CheckAnyOfErrors(SapResultCode err,
std::vector<SapResultCode> errors) {
for (size_t i = 0; i < errors.size(); i++) {
if (err == errors[i]) {
return testing::AssertionSuccess();
}
}
return testing::AssertionFailure() << "SapError:" + toString(err) + " is returned";
}
void SapTest::notify(int receivedSerial) {
std::lock_guard<std::mutex> lock(mtx);
if (serial == receivedSerial) {
count++;
cv.notify_one();
}
}
std::cv_status SapTest::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;
}
/*
* Test ISap.connectReq() for the response returned.
*/
TEST_P(SapTest, connectReq) {
serial = GetRandomSerialNumber();
int32_t maxMsgSize = 100;
ndk::ScopedAStatus res = sap->connectReq(serial, maxMsgSize);
ASSERT_OK(res) << res;
EXPECT_EQ(std::cv_status::no_timeout, wait());
EXPECT_EQ(sapCb->sapResponseSerial, serial);
// Modem side need time for connect to finish. Adding a waiting time to prevent
// disconnect being requested right after connect request.
sleep(1);
}
/*
* Test ISap.disconnectReq() for the response returned
*/
TEST_P(SapTest, disconnectReq) {
serial = GetRandomSerialNumber();
ndk::ScopedAStatus res = sap->disconnectReq(serial);
ASSERT_OK(res) << res;
EXPECT_EQ(std::cv_status::no_timeout, wait());
EXPECT_EQ(sapCb->sapResponseSerial, serial);
}
/*
* Test ISap.apduReq() for the response returned.
*/
TEST_P(SapTest, apduReq) {
serial = GetRandomSerialNumber();
SapApduType sapApduType = SapApduType::APDU;
std::vector<uint8_t> command = {};
ndk::ScopedAStatus res = sap->apduReq(serial, sapApduType, command);
ASSERT_OK(res) << res;
EXPECT_EQ(std::cv_status::no_timeout, wait());
EXPECT_EQ(sapCb->sapResponseSerial, serial);
ASSERT_TRUE(CheckAnyOfErrors(
sapCb->sapResultCode,
{SapResultCode::GENERIC_FAILURE, SapResultCode::CARD_ALREADY_POWERED_OFF,
SapResultCode::CARD_NOT_ACCESSSIBLE, SapResultCode::CARD_REMOVED,
SapResultCode::SUCCESS}));
}
/*
* Test ISap.transferAtrReq() for the response returned.
*/
TEST_P(SapTest, transferAtrReq) {
serial = GetRandomSerialNumber();
ndk::ScopedAStatus res = sap->transferAtrReq(serial);
ASSERT_OK(res) << res;
EXPECT_EQ(std::cv_status::no_timeout, wait());
EXPECT_EQ(sapCb->sapResponseSerial, serial);
ASSERT_TRUE(CheckAnyOfErrors(sapCb->sapResultCode,
{SapResultCode::GENERIC_FAILURE, SapResultCode::DATA_NOT_AVAILABLE,
SapResultCode::CARD_ALREADY_POWERED_OFF,
SapResultCode::CARD_REMOVED, SapResultCode::SUCCESS}));
}
/*
* Test ISap.powerReq() for the response returned.
*/
TEST_P(SapTest, powerReq) {
serial = GetRandomSerialNumber();
bool state = true;
ndk::ScopedAStatus res = sap->powerReq(serial, state);
ASSERT_OK(res) << res;
EXPECT_EQ(std::cv_status::no_timeout, wait());
EXPECT_EQ(sapCb->sapResponseSerial, serial);
ASSERT_TRUE(
CheckAnyOfErrors(sapCb->sapResultCode,
{SapResultCode::GENERIC_FAILURE, SapResultCode::CARD_NOT_ACCESSSIBLE,
SapResultCode::CARD_ALREADY_POWERED_OFF, SapResultCode::CARD_REMOVED,
SapResultCode::CARD_ALREADY_POWERED_ON, SapResultCode::SUCCESS}));
}
/*
* Test ISap.resetSimReq() for the response returned.
*/
TEST_P(SapTest, resetSimReq) {
serial = GetRandomSerialNumber();
ndk::ScopedAStatus res = sap->resetSimReq(serial);
ASSERT_OK(res) << res;
EXPECT_EQ(std::cv_status::no_timeout, wait());
EXPECT_EQ(sapCb->sapResponseSerial, serial);
ASSERT_TRUE(
CheckAnyOfErrors(sapCb->sapResultCode,
{SapResultCode::GENERIC_FAILURE, SapResultCode::CARD_NOT_ACCESSSIBLE,
SapResultCode::CARD_ALREADY_POWERED_OFF, SapResultCode::CARD_REMOVED,
SapResultCode::SUCCESS}));
}
/*
* Test ISap.transferCardReaderStatusReq() for the response returned.
*/
TEST_P(SapTest, transferCardReaderStatusReq) {
serial = GetRandomSerialNumber();
ndk::ScopedAStatus res = sap->transferCardReaderStatusReq(serial);
ASSERT_OK(res) << res;
EXPECT_EQ(std::cv_status::no_timeout, wait());
EXPECT_EQ(sapCb->sapResponseSerial, serial);
ASSERT_TRUE(CheckAnyOfErrors(sapCb->sapResultCode,
{SapResultCode::GENERIC_FAILURE, SapResultCode::DATA_NOT_AVAILABLE,
SapResultCode::SUCCESS}));
}
/*
* Test ISap.setTransferProtocolReq() for the response returned.
*/
TEST_P(SapTest, setTransferProtocolReq) {
serial = GetRandomSerialNumber();
SapTransferProtocol sapTransferProtocol = SapTransferProtocol::T0;
ndk::ScopedAStatus res = sap->setTransferProtocolReq(serial, sapTransferProtocol);
ASSERT_OK(res) << res;
EXPECT_EQ(std::cv_status::no_timeout, wait());
EXPECT_EQ(sapCb->sapResponseSerial, serial);
ASSERT_TRUE(CheckAnyOfErrors(sapCb->sapResultCode,
{SapResultCode::NOT_SUPPORTED, SapResultCode::SUCCESS}));
}