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