1*5c4dab75SAndroid Build Coastguard Worker /*
2*5c4dab75SAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project
3*5c4dab75SAndroid Build Coastguard Worker *
4*5c4dab75SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*5c4dab75SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*5c4dab75SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*5c4dab75SAndroid Build Coastguard Worker *
8*5c4dab75SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*5c4dab75SAndroid Build Coastguard Worker *
10*5c4dab75SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*5c4dab75SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*5c4dab75SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*5c4dab75SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*5c4dab75SAndroid Build Coastguard Worker * limitations under the License.
15*5c4dab75SAndroid Build Coastguard Worker */
16*5c4dab75SAndroid Build Coastguard Worker
17*5c4dab75SAndroid Build Coastguard Worker #include <gtest/gtest.h>
18*5c4dab75SAndroid Build Coastguard Worker
19*5c4dab75SAndroid Build Coastguard Worker #include <include/ese/app/weaver.h>
20*5c4dab75SAndroid Build Coastguard Worker
21*5c4dab75SAndroid Build Coastguard Worker #include <esecpp/NxpPn80tNqNci.h>
22*5c4dab75SAndroid Build Coastguard Worker using EseInterfaceImpl = android::NxpPn80tNqNci;
23*5c4dab75SAndroid Build Coastguard Worker
24*5c4dab75SAndroid Build Coastguard Worker const uint8_t KEY[kEseWeaverKeySize] = {
25*5c4dab75SAndroid Build Coastguard Worker 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
26*5c4dab75SAndroid Build Coastguard Worker const uint8_t WRONG_KEY[kEseWeaverKeySize] = {0};
27*5c4dab75SAndroid Build Coastguard Worker const uint8_t VALUE[kEseWeaverValueSize] = {
28*5c4dab75SAndroid Build Coastguard Worker 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
29*5c4dab75SAndroid Build Coastguard Worker
30*5c4dab75SAndroid Build Coastguard Worker struct WeaverTest : public ::testing::Test {
31*5c4dab75SAndroid Build Coastguard Worker EseInterfaceImpl mEse;
32*5c4dab75SAndroid Build Coastguard Worker EseWeaverSession mSession;
33*5c4dab75SAndroid Build Coastguard Worker
SetUpWeaverTest34*5c4dab75SAndroid Build Coastguard Worker virtual void SetUp() override {
35*5c4dab75SAndroid Build Coastguard Worker mEse.init();
36*5c4dab75SAndroid Build Coastguard Worker if (mEse.open() < 0) {
37*5c4dab75SAndroid Build Coastguard Worker std::string errMsg = "Failed to open connection to eSE";
38*5c4dab75SAndroid Build Coastguard Worker if (mEse.error()) {
39*5c4dab75SAndroid Build Coastguard Worker errMsg += " (" + std::to_string(mEse.error_code()) + "): " + mEse.error_message();
40*5c4dab75SAndroid Build Coastguard Worker } else {
41*5c4dab75SAndroid Build Coastguard Worker errMsg += ": reason unknown";
42*5c4dab75SAndroid Build Coastguard Worker }
43*5c4dab75SAndroid Build Coastguard Worker FAIL() << errMsg;
44*5c4dab75SAndroid Build Coastguard Worker }
45*5c4dab75SAndroid Build Coastguard Worker
46*5c4dab75SAndroid Build Coastguard Worker ese_weaver_session_init(&mSession);
47*5c4dab75SAndroid Build Coastguard Worker ASSERT_EQ(ESE_APP_RESULT_OK, ese_weaver_session_open(mEse.ese_interface(), &mSession));
48*5c4dab75SAndroid Build Coastguard Worker }
49*5c4dab75SAndroid Build Coastguard Worker
TearDownWeaverTest50*5c4dab75SAndroid Build Coastguard Worker virtual void TearDown() override {
51*5c4dab75SAndroid Build Coastguard Worker ASSERT_EQ(ESE_APP_RESULT_OK, ese_weaver_session_close(&mSession));
52*5c4dab75SAndroid Build Coastguard Worker mEse.close();
53*5c4dab75SAndroid Build Coastguard Worker }
54*5c4dab75SAndroid Build Coastguard Worker };
55*5c4dab75SAndroid Build Coastguard Worker
TEST_F(WeaverTest,getNumSlots)56*5c4dab75SAndroid Build Coastguard Worker TEST_F(WeaverTest, getNumSlots) {
57*5c4dab75SAndroid Build Coastguard Worker uint32_t numSlots;
58*5c4dab75SAndroid Build Coastguard Worker ASSERT_EQ(ESE_APP_RESULT_OK, ese_weaver_get_num_slots(&mSession, &numSlots));
59*5c4dab75SAndroid Build Coastguard Worker ASSERT_EQ(uint32_t{64}, numSlots);
60*5c4dab75SAndroid Build Coastguard Worker }
61*5c4dab75SAndroid Build Coastguard Worker
TEST_F(WeaverTest,writeAndReadWithCorrectKey)62*5c4dab75SAndroid Build Coastguard Worker TEST_F(WeaverTest, writeAndReadWithCorrectKey) {
63*5c4dab75SAndroid Build Coastguard Worker const uint32_t slotId = 3;
64*5c4dab75SAndroid Build Coastguard Worker ASSERT_EQ(ese_weaver_write(&mSession, slotId, KEY, VALUE), ESE_APP_RESULT_OK);
65*5c4dab75SAndroid Build Coastguard Worker
66*5c4dab75SAndroid Build Coastguard Worker uint8_t readValue[kEseWeaverValueSize];
67*5c4dab75SAndroid Build Coastguard Worker uint32_t timeout;
68*5c4dab75SAndroid Build Coastguard Worker ASSERT_EQ(ESE_APP_RESULT_OK, ese_weaver_read(&mSession, slotId, KEY, readValue, &timeout));
69*5c4dab75SAndroid Build Coastguard Worker ASSERT_EQ(0, memcmp(VALUE, readValue, kEseWeaverValueSize));
70*5c4dab75SAndroid Build Coastguard Worker }
71*5c4dab75SAndroid Build Coastguard Worker
TEST_F(WeaverTest,writeAndReadWithIncorrectKey)72*5c4dab75SAndroid Build Coastguard Worker TEST_F(WeaverTest, writeAndReadWithIncorrectKey) {
73*5c4dab75SAndroid Build Coastguard Worker const uint32_t slotId = 7;
74*5c4dab75SAndroid Build Coastguard Worker ASSERT_EQ(ese_weaver_write(&mSession, slotId, KEY, VALUE), ESE_APP_RESULT_OK);
75*5c4dab75SAndroid Build Coastguard Worker
76*5c4dab75SAndroid Build Coastguard Worker uint8_t readValue[kEseWeaverValueSize];
77*5c4dab75SAndroid Build Coastguard Worker uint32_t timeout;
78*5c4dab75SAndroid Build Coastguard Worker ASSERT_EQ(ESE_WEAVER_READ_WRONG_KEY,
79*5c4dab75SAndroid Build Coastguard Worker ese_weaver_read(&mSession, slotId, WRONG_KEY, readValue, &timeout));
80*5c4dab75SAndroid Build Coastguard Worker ASSERT_NE(0, memcmp(VALUE, readValue, kEseWeaverValueSize));
81*5c4dab75SAndroid Build Coastguard Worker ASSERT_EQ(uint32_t{0}, timeout); // First timeout is 0
82*5c4dab75SAndroid Build Coastguard Worker }
83*5c4dab75SAndroid Build Coastguard Worker
TEST_F(WeaverTest,writeAndEraseValue)84*5c4dab75SAndroid Build Coastguard Worker TEST_F(WeaverTest, writeAndEraseValue) {
85*5c4dab75SAndroid Build Coastguard Worker const uint32_t slotId = 0;
86*5c4dab75SAndroid Build Coastguard Worker ASSERT_EQ(ese_weaver_write(&mSession, slotId, KEY, VALUE), ESE_APP_RESULT_OK);
87*5c4dab75SAndroid Build Coastguard Worker ASSERT_EQ(ese_weaver_erase_value(&mSession, slotId), ESE_APP_RESULT_OK);
88*5c4dab75SAndroid Build Coastguard Worker
89*5c4dab75SAndroid Build Coastguard Worker // The read should be successful as the key is unchanged but the value should
90*5c4dab75SAndroid Build Coastguard Worker // be all zeros
91*5c4dab75SAndroid Build Coastguard Worker uint8_t readValue[kEseWeaverValueSize];
92*5c4dab75SAndroid Build Coastguard Worker uint32_t timeout;
93*5c4dab75SAndroid Build Coastguard Worker ASSERT_EQ(ESE_APP_RESULT_OK, ese_weaver_read(&mSession, slotId, KEY, readValue, &timeout));
94*5c4dab75SAndroid Build Coastguard Worker
95*5c4dab75SAndroid Build Coastguard Worker const uint8_t expectedValue[kEseWeaverValueSize] = {0};
96*5c4dab75SAndroid Build Coastguard Worker ASSERT_EQ(0, memcmp(readValue, expectedValue, kEseWeaverValueSize));
97*5c4dab75SAndroid Build Coastguard Worker }
98