• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 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 package android.nfc;
18 
19 import static org.junit.Assert.assertArrayEquals;
20 import static org.junit.Assert.assertEquals;
21 import static org.junit.Assert.assertNotNull;
22 import static org.junit.Assert.assertNull;
23 import static org.mockito.Mockito.mock;
24 
25 import android.os.Parcel;
26 
27 import org.junit.Test;
28 import org.junit.runner.RunWith;
29 import org.junit.runners.JUnit4;
30 
31 import java.time.Instant;
32 
33 @RunWith(JUnit4.class)
34 public final class OemLogItemsTest {
35 
36     private final int mAction = 1;
37     private final int mEvent = 2;
38     private final int mCallingPid = 1234;
39     private final byte[] mCommandApdus = new byte[] {0x01, 0x02, 0x03};
40     private final byte[] mResponseApdus = new byte[] {0x0A, 0x0B, 0x0C};
41     private final Instant mRfFieldOnTime = Instant.now();
42     private Tag mMockTag;
43 
44     @Test
testGetAction()45     public void testGetAction() {
46         OemLogItems item = new OemLogItems.Builder(OemLogItems.LOG_ACTION_RF_FIELD_STATE_CHANGED)
47                 .build();
48         assertEquals(OemLogItems.LOG_ACTION_RF_FIELD_STATE_CHANGED, item.getAction());
49     }
50 
51     @Test
testGetEvent()52     public void testGetEvent() {
53         OemLogItems item = new OemLogItems.Builder(OemLogItems.LOG_ACTION_NFC_TOGGLE)
54                 .setCallingEvent(OemLogItems.EVENT_ENABLE)
55                 .build();
56         assertEquals(OemLogItems.EVENT_ENABLE, item.getEvent());
57     }
58 
59     @Test
testGetCallingPid()60     public void testGetCallingPid() {
61         OemLogItems item = new OemLogItems.Builder(OemLogItems.LOG_ACTION_NFC_TOGGLE)
62                 .setCallingPid(1234)
63                 .build();
64         assertEquals(1234, item.getCallingPid());
65     }
66 
67     @Test
testGetCommandApdu()68     public void testGetCommandApdu() {
69         byte[] commandApdu = {0x01, 0x02, 0x03};
70         OemLogItems item = new OemLogItems.Builder(OemLogItems.LOG_ACTION_HCE_DATA)
71                 .setApduCommand(commandApdu)
72                 .build();
73         assertArrayEquals(commandApdu, item.getCommandApdu());
74     }
75 
76     @Test
testGetResponseApdu()77     public void testGetResponseApdu() {
78         byte[] responseApdu = {0x04, 0x05, 0x06};
79         OemLogItems item = new OemLogItems.Builder(OemLogItems.LOG_ACTION_HCE_DATA)
80                 .setApduResponse(responseApdu)
81                 .build();
82         assertArrayEquals(responseApdu, item.getResponseApdu());
83     }
84 
85     @Test
testGetRfFieldEventTimeMillis()86     public void testGetRfFieldEventTimeMillis() {
87         Instant expectedTime = Instant.ofEpochSecond(1688768000, 123456789);
88         OemLogItems item = new OemLogItems.Builder(OemLogItems.LOG_ACTION_RF_FIELD_STATE_CHANGED)
89                 .setRfFieldOnTime(expectedTime)
90                 .build();
91         assertEquals(expectedTime, item.getRfFieldEventTimeMillis());
92     }
93 
94     @Test
testGetTag()95     public void testGetTag() {
96         Tag mockTag = mock(Tag.class);
97         OemLogItems item = new OemLogItems.Builder(OemLogItems.LOG_ACTION_TAG_DETECTED)
98                 .setTag(mockTag)
99                 .build();
100         assertEquals(mockTag, item.getTag());
101     }
102 
103     @Test
testConstructorInitialization()104     public void testConstructorInitialization() {
105         mMockTag = mock(Tag.class);
106         OemLogItems oemLogItems = new OemLogItems(mAction, mEvent, mCallingPid,
107                 mCommandApdus, mResponseApdus, mRfFieldOnTime, mMockTag);
108 
109         assertEquals(mAction, oemLogItems.getAction());
110         assertEquals(mEvent, oemLogItems.getEvent());
111         assertEquals(mCallingPid, oemLogItems.getCallingPid());
112         assertArrayEquals(mCommandApdus, oemLogItems.getCommandApdu());
113         assertArrayEquals(mResponseApdus, oemLogItems.getResponseApdu());
114         assertEquals(mRfFieldOnTime, oemLogItems.getRfFieldEventTimeMillis());
115         assertEquals(mMockTag, oemLogItems.getTag());
116     }
117 
118     @Test
testParcelableImplementation()119     public void testParcelableImplementation() {
120         mMockTag = mock(Tag.class);
121         OemLogItems original = new OemLogItems(mAction, mEvent, mCallingPid,
122                 mCommandApdus, mResponseApdus, mRfFieldOnTime, mMockTag);
123         Parcel parcel = Parcel.obtain();
124         original.writeToParcel(parcel, 0);
125         parcel.setDataPosition(0);
126         OemLogItems recreated = OemLogItems.CREATOR.createFromParcel(parcel);
127 
128         assertEquals(original.getAction(), recreated.getAction());
129         assertEquals(original.getEvent(), recreated.getEvent());
130         assertEquals(original.getCallingPid(), recreated.getCallingPid());
131         assertArrayEquals(original.getCommandApdu(), recreated.getCommandApdu());
132         assertArrayEquals(original.getResponseApdu(), recreated.getResponseApdu());
133         assertEquals(original.getRfFieldEventTimeMillis(), recreated.getRfFieldEventTimeMillis());
134         assertNotNull(recreated.getTag());
135         parcel.recycle();
136     }
137 
138     @Test
testNewArray()139     public void testNewArray() {
140         int arraySize = 5;
141         OemLogItems[] oemLogItemsArray = OemLogItems.CREATOR.newArray(arraySize);
142 
143         assertNotNull(oemLogItemsArray);
144         assertEquals(arraySize, oemLogItemsArray.length);
145     }
146 
147     @Test
testParcelableWithNullRfFieldOnTime()148     public void testParcelableWithNullRfFieldOnTime() {
149         mMockTag = mock(Tag.class);
150         OemLogItems original = new OemLogItems(mAction, mEvent, mCallingPid,
151                 mCommandApdus, mResponseApdus, null, mMockTag);
152         Parcel parcel = Parcel.obtain();
153         original.writeToParcel(parcel, 0);
154         parcel.setDataPosition(0);
155         OemLogItems recreated = OemLogItems.CREATOR.createFromParcel(parcel);
156 
157         assertEquals(original.getAction(), recreated.getAction());
158         assertEquals(original.getEvent(), recreated.getEvent());
159         assertEquals(original.getCallingPid(), recreated.getCallingPid());
160         assertArrayEquals(original.getCommandApdu(), recreated.getCommandApdu());
161         assertArrayEquals(original.getResponseApdu(), recreated.getResponseApdu());
162         assertNull(recreated.getRfFieldEventTimeMillis());
163         assertNotNull(recreated.getTag());
164         parcel.recycle();
165     }
166 
167     @Test
testToString()168     public void testToString() {
169         mMockTag = mock(Tag.class);
170         OemLogItems oemLogItems = new OemLogItems(mAction, mEvent, mCallingPid,
171                 mCommandApdus, mResponseApdus, mRfFieldOnTime, mMockTag);
172         String expectedString = "[mCommandApdus: " + byteToHex(mCommandApdus)
173                 + "[mResponseApdus: " + byteToHex(mResponseApdus)
174                 + ", mCallingApi= " + mEvent
175                 + ", mAction= " + mAction
176                 + ", mCallingPId = " + mCallingPid
177                 + ", mRfFieldOnTime= " + mRfFieldOnTime;
178 
179         assertEquals(expectedString, oemLogItems.toString());
180     }
181 
182     @Test
testWriteToParcel()183     public void testWriteToParcel() {
184         mMockTag = mock(Tag.class);
185         OemLogItems original = new OemLogItems(mAction, mEvent, mCallingPid,
186                 mCommandApdus, mResponseApdus, mRfFieldOnTime, mMockTag);
187         Parcel parcel = Parcel.obtain();
188         original.writeToParcel(parcel, 0);
189         parcel.setDataPosition(0);
190 
191         assertEquals(mAction, parcel.readInt());
192         assertEquals(mEvent, parcel.readInt());
193         assertEquals(mCallingPid, parcel.readInt());
194 
195         int commandApdusLength = parcel.readInt();
196         byte[] readCommandApdus = new byte[commandApdusLength];
197         parcel.readByteArray(readCommandApdus);
198         assertArrayEquals(mCommandApdus, readCommandApdus);
199 
200         int responseApdusLength = parcel.readInt();
201         byte[] readResponseApdus = new byte[responseApdusLength];
202         parcel.readByteArray(readResponseApdus);
203         assertArrayEquals(mResponseApdus, readResponseApdus);
204 
205         boolean isRfFieldOnTimeSet = parcel.readBoolean();
206         if (isRfFieldOnTimeSet) {
207             long epochSecond = parcel.readLong();
208             int nano = parcel.readInt();
209             Instant readRfFieldOnTime = Instant.ofEpochSecond(epochSecond, nano);
210             assertEquals(mRfFieldOnTime, readRfFieldOnTime);
211         } else {
212             assertNull(original.getRfFieldEventTimeMillis());
213         }
214 
215         assertNotNull(parcel.readParcelable(Tag.class.getClassLoader()));
216         parcel.recycle();
217     }
218 
byteToHex(byte[] bytes)219     private String byteToHex(byte[] bytes) {
220         char[] HexArray = "0123456789ABCDEF".toCharArray();
221         char[] hexChars = new char[bytes.length * 2];
222         for (int j = 0; j < bytes.length; j++) {
223             int v = bytes[j] & 0xFF;
224             hexChars[j * 2] = HexArray[v >>> 4];
225             hexChars[j * 2 + 1] = HexArray[v & 0x0F];
226         }
227         return new String(hexChars);
228     }
229 }
230