blob: bef412b6c2145718e5e90c580ef8dc102c5f93f4 [file] [log] [blame]
Ruchi Kandoi912ce332018-01-31 13:47:17 -08001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "nfc_hidl_hal_test"
18#include <android-base/logging.h>
19
20#include <android/hardware/nfc/1.0/types.h>
21#include <android/hardware/nfc/1.1/INfc.h>
22#include <android/hardware/nfc/1.1/INfcClientCallback.h>
23#include <android/hardware/nfc/1.1/types.h>
24#include <hardware/nfc.h>
25
26#include <VtsHalHidlTargetCallbackBase.h>
27#include <VtsHalHidlTargetTestBase.h>
Zhuoyao Zhangb4744d12018-02-08 21:00:15 -080028#include <VtsHalHidlTargetTestEnvBase.h>
Ruchi Kandoi912ce332018-01-31 13:47:17 -080029
30using ::android::hardware::nfc::V1_1::INfc;
31using ::android::hardware::nfc::V1_1::INfcClientCallback;
32using ::android::hardware::nfc::V1_1::NfcEvent;
33using ::android::hardware::nfc::V1_0::NfcStatus;
34using ::android::hardware::nfc::V1_0::NfcData;
35using ::android::hardware::Return;
36using ::android::hardware::Void;
37using ::android::hardware::hidl_vec;
38using ::android::sp;
39
40constexpr char kCallbackNameSendEvent[] = "sendEvent";
41constexpr char kCallbackNameSendData[] = "sendData";
42
43class NfcClientCallbackArgs {
44 public:
45 NfcEvent last_event_;
46 NfcStatus last_status_;
47 NfcData last_data_;
48};
49
50/* Callback class for data & Event. */
51class NfcClientCallback : public ::testing::VtsHalHidlTargetCallbackBase<NfcClientCallbackArgs>,
52 public INfcClientCallback {
53 public:
54 virtual ~NfcClientCallback() = default;
55
56 /* sendEvent callback function - Records the Event & Status
57 * and notifies the TEST
58 **/
59 Return<void> sendEvent_1_1(NfcEvent event, NfcStatus event_status) override {
60 NfcClientCallbackArgs args;
61 args.last_event_ = event;
62 args.last_status_ = event_status;
63 NotifyFromCallback(kCallbackNameSendEvent, args);
64 return Void();
65 };
66
67 /** NFC 1.1 HAL shouldn't send 1.0 callbacks */
68 Return<void> sendEvent(__attribute__((unused))::android::hardware::nfc::V1_0::NfcEvent event,
69 __attribute__((unused)) NfcStatus event_status) override {
70 return Void();
71 }
72
73 /* sendData callback function. Records the data and notifies the TEST*/
74 Return<void> sendData(const NfcData& data) override {
75 NfcClientCallbackArgs args;
76 args.last_data_ = data;
77 NotifyFromCallback(kCallbackNameSendData, args);
78 return Void();
79 };
80};
81
Zhuoyao Zhangb4744d12018-02-08 21:00:15 -080082// Test environment for Nfc HIDL HAL.
83class NfcHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase {
84 public:
85 // get the test environment singleton
86 static NfcHidlEnvironment* Instance() {
87 static NfcHidlEnvironment* instance = new NfcHidlEnvironment;
88 return instance;
89 }
90
91 virtual void registerTestServices() override { registerTestService<INfc>(); }
92 private:
93 NfcHidlEnvironment() {}
94};
95
Ruchi Kandoi912ce332018-01-31 13:47:17 -080096// The main test class for NFC HIDL HAL.
97class NfcHidlTest : public ::testing::VtsHalHidlTargetTestBase {
98 public:
99 virtual void SetUp() override {
100 nfc_ = ::testing::VtsHalHidlTargetTestBase::getService<INfc>();
101 ASSERT_NE(nfc_, nullptr);
102
103 nfc_cb_ = new NfcClientCallback();
104 ASSERT_NE(nfc_cb_, nullptr);
105
106 EXPECT_EQ(NfcStatus::OK, nfc_->open_1_1(nfc_cb_));
107 // Wait for OPEN_CPLT event
108 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
109 EXPECT_TRUE(res.no_timeout);
110 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
111 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
112
113 /*
114 * Close the hal and then re-open to make sure we are in a predictable
115 * state for all the tests.
116 */
117 EXPECT_EQ(NfcStatus::OK, nfc_->close());
118 // Wait for CLOSE_CPLT event
119 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
120 EXPECT_TRUE(res.no_timeout);
121 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
122 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
123
124 EXPECT_EQ(NfcStatus::OK, nfc_->open_1_1(nfc_cb_));
125 // Wait for OPEN_CPLT event
126 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
127 EXPECT_TRUE(res.no_timeout);
128 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
129 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
130 }
131
132 virtual void TearDown() override {
133 EXPECT_EQ(NfcStatus::OK, nfc_->close());
134 // Wait for CLOSE_CPLT event
135 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
136 EXPECT_TRUE(res.no_timeout);
137 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
138 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
139 }
140
141 sp<INfc> nfc_;
142 sp<NfcClientCallback> nfc_cb_;
143};
144
Ruchi Kandoi912ce332018-01-31 13:47:17 -0800145/*
146 * factoryReset
147 * calls factoryReset()
148 * checks status
149 */
150TEST_F(NfcHidlTest, FactoryReset) {
151 nfc_->factoryReset();
152
153 EXPECT_EQ(NfcStatus::OK, nfc_->close());
154 // Wait for CLOSE_CPLT event
155 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
156 EXPECT_TRUE(res.no_timeout);
157 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
158 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
159
160 EXPECT_EQ(NfcStatus::OK, nfc_->open_1_1(nfc_cb_));
161 // Wait for OPEN_CPLT event
162 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
163 EXPECT_TRUE(res.no_timeout);
164 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
165 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
166}
167
168/*
169 * OpenAndClose:
170 * Makes an open call, waits for NfcEvent.OPEN_CPLT
171 * Immediately calls closeforPowerOffCase() and waits for NfcEvent.CLOSE_CPLT
172 */
173TEST_F(NfcHidlTest, OpenAndCloseForPowerOff) {
174 EXPECT_EQ(NfcStatus::OK, nfc_->closeForPowerOffCase());
175 // Wait for CLOSE_CPLT event
176 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
177 EXPECT_TRUE(res.no_timeout);
178 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
179 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
180
181 EXPECT_EQ(NfcStatus::OK, nfc_->open_1_1(nfc_cb_));
182 // Wait for OPEN_CPLT event
183 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
184 EXPECT_TRUE(res.no_timeout);
185 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
186 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
187}
188
189/*
190 * CloseForPowerOffCaseAfterClose:
191 * Calls closeForPowerOffCase()
192 * Calls close() - checks failed status
193 */
194TEST_F(NfcHidlTest, CloseForPowerCaseOffAfterClose) {
195 EXPECT_EQ(NfcStatus::OK, nfc_->closeForPowerOffCase());
196 // Wait for CLOSE_CPLT event
197 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
198 EXPECT_TRUE(res.no_timeout);
199 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
200 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
201
202 EXPECT_EQ(NfcStatus::FAILED, nfc_->close());
203
204 EXPECT_EQ(NfcStatus::OK, nfc_->open_1_1(nfc_cb_));
205 // Wait for OPEN_CPLT event
206 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
207 EXPECT_TRUE(res.no_timeout);
208 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
209 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
210}
211
212int main(int argc, char** argv) {
Zhuoyao Zhangb4744d12018-02-08 21:00:15 -0800213 ::testing::AddGlobalTestEnvironment(NfcHidlEnvironment::Instance());
Ruchi Kandoi912ce332018-01-31 13:47:17 -0800214 ::testing::InitGoogleTest(&argc, argv);
Zhuoyao Zhangb4744d12018-02-08 21:00:15 -0800215 NfcHidlEnvironment::Instance()->init(&argc, argv);
Ruchi Kandoi912ce332018-01-31 13:47:17 -0800216
217 std::system("svc nfc disable"); /* Turn off NFC */
218 sleep(5);
219
220 int status = RUN_ALL_TESTS();
221 LOG(INFO) << "Test result = " << status;
222
223 std::system("svc nfc enable"); /* Turn on NFC */
224 sleep(5);
225
226 return status;
227}