1 /* 2 * Copyright (C) 2019 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.view.autofill; 18 19 import static android.view.autofill.AutofillId.NO_SESSION; 20 21 import static com.google.common.truth.Truth.assertThat; 22 import static com.google.common.truth.Truth.assertWithMessage; 23 24 import static org.testng.Assert.assertThrows; 25 26 import android.os.Parcel; 27 import android.view.View; 28 29 import org.junit.Test; 30 import org.junit.runner.RunWith; 31 import org.junit.runners.JUnit4; 32 33 @RunWith(JUnit4.class) 34 public class AutofillIdTest { 35 36 @Test testNonVirtual()37 public void testNonVirtual() { 38 final AutofillId id = new AutofillId(42); 39 assertNonVirtual(id, 42, NO_SESSION); 40 41 final AutofillId clone = cloneThroughParcel(id); 42 assertNonVirtual(clone, 42, NO_SESSION); 43 } 44 45 @Test testVirtual_int()46 public void testVirtual_int() { 47 final AutofillId id = new AutofillId(42, 108); 48 assertThat(id.getViewId()).isEqualTo(42); 49 assertThat(id.isVirtualInt()).isTrue(); 50 assertThat(id.isVirtualLong()).isFalse(); 51 assertThat(id.isNonVirtual()).isFalse(); 52 assertThat(id.getVirtualChildIntId()).isEqualTo(108); 53 assertThat(id.getVirtualChildLongId()).isEqualTo(View.NO_ID); 54 55 final AutofillId clone = cloneThroughParcel(id); 56 assertThat(clone.getViewId()).isEqualTo(42); 57 assertThat(clone.isVirtualLong()).isFalse(); 58 assertThat(clone.isVirtualInt()).isTrue(); 59 assertThat(clone.isNonVirtual()).isFalse(); 60 assertThat(clone.getVirtualChildIntId()).isEqualTo(108); 61 assertThat(clone.getVirtualChildLongId()).isEqualTo(View.NO_ID); 62 } 63 64 @Test testVirtual_long()65 public void testVirtual_long() { 66 final AutofillId id = new AutofillId(new AutofillId(42), 4815162342L, 108); 67 assertThat(id.getViewId()).isEqualTo(42); 68 assertThat(id.isVirtualLong()).isTrue(); 69 assertThat(id.isVirtualInt()).isFalse(); 70 assertThat(id.isNonVirtual()).isFalse(); 71 assertThat(id.getVirtualChildIntId()).isEqualTo(View.NO_ID); 72 assertThat(id.getVirtualChildLongId()).isEqualTo(4815162342L); 73 74 final AutofillId clone = cloneThroughParcel(id); 75 assertThat(clone.getViewId()).isEqualTo(42); 76 assertThat(clone.isVirtualLong()).isTrue(); 77 assertThat(clone.isVirtualInt()).isFalse(); 78 assertThat(clone.isNonVirtual()).isFalse(); 79 assertThat(clone.getVirtualChildIntId()).isEqualTo(View.NO_ID); 80 assertThat(clone.getVirtualChildLongId()).isEqualTo(4815162342L); 81 } 82 83 @Test testVirtual_parentObjectConstructor()84 public void testVirtual_parentObjectConstructor() { 85 assertThrows(NullPointerException.class, () -> new AutofillId(null, 108)); 86 87 final AutofillId id = new AutofillId(new AutofillId(42), 108); 88 assertThat(id.getViewId()).isEqualTo(42); 89 assertThat(id.isVirtualInt()).isTrue(); 90 assertThat(id.getVirtualChildIntId()).isEqualTo(108); 91 92 final AutofillId clone = cloneThroughParcel(id); 93 assertThat(clone.getViewId()).isEqualTo(42); 94 assertThat(clone.isVirtualInt()).isTrue(); 95 assertThat(clone.getVirtualChildIntId()).isEqualTo(108); 96 } 97 98 @Test testVirtual_withSession()99 public void testVirtual_withSession() { 100 final AutofillId id = new AutofillId(new AutofillId(42), 108L, 666); 101 assertThat(id.getViewId()).isEqualTo(42); 102 assertThat(id.isVirtualLong()).isTrue(); 103 assertThat(id.isVirtualInt()).isFalse(); 104 assertThat(id.isNonVirtual()).isFalse(); 105 assertThat(id.getVirtualChildLongId()).isEqualTo(108L); 106 assertThat(id.getVirtualChildIntId()).isEqualTo(View.NO_ID); 107 assertThat(id.getSessionId()).isEqualTo(666); 108 109 final AutofillId clone = cloneThroughParcel(id); 110 assertThat(clone.getViewId()).isEqualTo(42); 111 assertThat(clone.isVirtualLong()).isTrue(); 112 assertThat(clone.isVirtualInt()).isFalse(); 113 assertThat(clone.isNonVirtual()).isFalse(); 114 assertThat(clone.getVirtualChildLongId()).isEqualTo(108L); 115 assertThat(clone.getVirtualChildIntId()).isEqualTo(View.NO_ID); 116 assertThat(clone.getSessionId()).isEqualTo(666); 117 } 118 119 @Test testFactoryMethod_withoutSession()120 public void testFactoryMethod_withoutSession() { 121 final AutofillId id = new AutofillId(42); 122 id.setSessionId(108); 123 assertNonVirtual(id, 42, 108); 124 final AutofillId idWithoutSession = AutofillId.withoutSession(id); 125 assertNonVirtual(idWithoutSession, 42, NO_SESSION); 126 } 127 128 @Test testVirtual_Long_withoutSession()129 public void testVirtual_Long_withoutSession() { 130 final AutofillId id = new AutofillId(new AutofillId(42), 108L, 666); 131 final AutofillId idWithoutSession = AutofillId.withoutSession(id); 132 assertThat(idWithoutSession.getViewId()).isEqualTo(42); 133 assertThat(idWithoutSession.isVirtualLong()).isTrue(); 134 assertThat(idWithoutSession.isVirtualInt()).isFalse(); 135 assertThat(idWithoutSession.isNonVirtual()).isFalse(); 136 assertThat(idWithoutSession.getVirtualChildLongId()).isEqualTo(108L); 137 assertThat(idWithoutSession.getVirtualChildIntId()).isEqualTo(View.NO_ID); 138 assertThat(idWithoutSession.getSessionId()).isEqualTo(NO_SESSION); 139 } 140 141 @Test testVirtual_Int_withoutSession()142 public void testVirtual_Int_withoutSession() { 143 final AutofillId id = new AutofillId(42, 108); 144 final AutofillId idWithoutSession = AutofillId.withoutSession(id); 145 assertThat(idWithoutSession.getViewId()).isEqualTo(42); 146 assertThat(idWithoutSession.isVirtualLong()).isFalse(); 147 assertThat(idWithoutSession.isVirtualInt()).isTrue(); 148 assertThat(idWithoutSession.isNonVirtual()).isFalse(); 149 assertThat(idWithoutSession.getVirtualChildIntId()).isEqualTo(108); 150 assertThat(idWithoutSession.getVirtualChildLongId()).isEqualTo(View.NO_ID); 151 assertThat(idWithoutSession.getSessionId()).isEqualTo(NO_SESSION); 152 } 153 154 @Test testSetResetSession()155 public void testSetResetSession() { 156 final AutofillId id = new AutofillId(42); 157 assertNonVirtual(id, 42, NO_SESSION); 158 id.setSessionId(108); 159 assertNonVirtual(id, 42, 108); 160 161 final AutofillId clone1 = cloneThroughParcel(id); 162 assertNonVirtual(clone1, 42, 108); 163 164 id.resetSessionId(); 165 assertThat(id.getSessionId()).isEqualTo(NO_SESSION); 166 final AutofillId clone2 = cloneThroughParcel(id); 167 assertNonVirtual(clone2, 42, NO_SESSION); 168 } 169 170 @Test testEqualsHashCode_nonVirtual_same()171 public void testEqualsHashCode_nonVirtual_same() { 172 final AutofillId id = new AutofillId(42); 173 final AutofillId sameId = new AutofillId(42); 174 175 assertThat(id).isEqualTo(sameId); 176 assertThat(sameId).isEqualTo(id); 177 assertEqualsIgnoreSession(id, sameId); 178 assertEqualsIgnoreSession(sameId, id); 179 assertThat(id.hashCode()).isEqualTo(sameId.hashCode()); 180 } 181 182 @Test testEqualsHashCode_nonVirtual_other()183 public void testEqualsHashCode_nonVirtual_other() { 184 final AutofillId id = new AutofillId(42); 185 final AutofillId otherId = new AutofillId(108); 186 187 assertThat(id).isNotEqualTo(otherId); 188 assertThat(otherId).isNotEqualTo(id); 189 assertNotEqualsIgnoreSession(id, otherId); 190 assertNotEqualsIgnoreSession(otherId, id); 191 assertThat(id.hashCode()).isNotEqualTo(otherId.hashCode()); 192 } 193 194 @Test testEqualsHashCode_virtual_same()195 public void testEqualsHashCode_virtual_same() { 196 final AutofillId id = new AutofillId(42); 197 final AutofillId virtual = new AutofillId(42, 1); 198 final AutofillId sameVirtual = new AutofillId(42, 1); 199 200 assertThat(virtual).isEqualTo(sameVirtual); 201 assertThat(sameVirtual).isEqualTo(virtual); 202 assertEqualsIgnoreSession(virtual, sameVirtual); 203 assertEqualsIgnoreSession(sameVirtual, virtual); 204 assertThat(virtual.hashCode()).isEqualTo(sameVirtual.hashCode()); 205 assertThat(virtual).isNotEqualTo(id); 206 assertThat(id).isNotEqualTo(virtual); 207 assertNotEqualsIgnoreSession(id, virtual); 208 assertNotEqualsIgnoreSession(virtual, id); 209 } 210 211 @Test testEqualsHashCode_virtual_otherChild()212 public void testEqualsHashCode_virtual_otherChild() { 213 final AutofillId id = new AutofillId(42); 214 final AutofillId virtual = new AutofillId(42, 1); 215 final AutofillId virtualOtherChild = new AutofillId(42, 2); 216 217 assertThat(virtualOtherChild).isNotEqualTo(virtual); 218 assertThat(virtual).isNotEqualTo(virtualOtherChild); 219 assertNotEqualsIgnoreSession(virtualOtherChild, virtual); 220 assertNotEqualsIgnoreSession(virtual, virtualOtherChild); 221 assertThat(virtualOtherChild).isNotEqualTo(id); 222 assertThat(id).isNotEqualTo(virtualOtherChild); 223 assertNotEqualsIgnoreSession(virtualOtherChild, id); 224 assertNotEqualsIgnoreSession(id, virtualOtherChild); 225 } 226 227 @Test testEqualsHashCode_virtual_otherParent()228 public void testEqualsHashCode_virtual_otherParent() { 229 final AutofillId virtual = new AutofillId(42, 1); 230 final AutofillId virtualOtherParent = new AutofillId(108, 1); 231 final AutofillId virtualOtherChild = new AutofillId(42, 2); 232 233 assertThat(virtualOtherParent).isNotEqualTo(virtual); 234 assertThat(virtual).isNotEqualTo(virtualOtherParent); 235 assertNotEqualsIgnoreSession(virtualOtherParent, virtual); 236 assertNotEqualsIgnoreSession(virtual, virtualOtherParent); 237 assertThat(virtualOtherParent).isNotEqualTo(virtualOtherChild); 238 assertThat(virtualOtherChild).isNotEqualTo(virtualOtherParent); 239 assertNotEqualsIgnoreSession(virtualOtherParent, virtualOtherChild); 240 assertNotEqualsIgnoreSession(virtualOtherChild, virtualOtherParent); 241 } 242 243 @Test testEqualsHashCode_virtual_otherSession()244 public void testEqualsHashCode_virtual_otherSession() { 245 final AutofillId virtual = new AutofillId(42, 1); 246 final AutofillId virtualOtherSession = new AutofillId(42, 1); 247 virtualOtherSession.setSessionId(666); 248 249 assertThat(virtualOtherSession).isNotEqualTo(virtual); 250 assertThat(virtual).isNotEqualTo(virtualOtherSession); 251 assertEqualsIgnoreSession(virtualOtherSession, virtual); 252 assertEqualsIgnoreSession(virtual, virtualOtherSession); 253 } 254 255 @Test testEqualsHashCode_virtual_longId_same()256 public void testEqualsHashCode_virtual_longId_same() { 257 final AutofillId hostId = new AutofillId(42); 258 final AutofillId virtual = new AutofillId(hostId, 1L, 108); 259 final AutofillId sameVirtual = new AutofillId(hostId, 1L, 108); 260 261 assertThat(sameVirtual).isEqualTo(virtual); 262 assertThat(virtual).isEqualTo(sameVirtual); 263 assertEqualsIgnoreSession(sameVirtual, virtual); 264 assertEqualsIgnoreSession(virtual, sameVirtual); 265 assertThat(sameVirtual).isNotEqualTo(hostId); 266 assertThat(hostId).isNotEqualTo(sameVirtual); 267 assertNotEqualsIgnoreSession(sameVirtual, hostId); 268 assertNotEqualsIgnoreSession(hostId, sameVirtual); 269 } 270 271 @Test testEqualsHashCode_virtual_longId_otherChild()272 public void testEqualsHashCode_virtual_longId_otherChild() { 273 final AutofillId hostId = new AutofillId(42); 274 final AutofillId virtual = new AutofillId(hostId, 1L, 108); 275 final AutofillId virtualOtherChild = new AutofillId(hostId, 2L, 108); 276 277 assertThat(virtualOtherChild).isNotEqualTo(virtual); 278 assertThat(virtual).isNotEqualTo(virtualOtherChild); 279 assertNotEqualsIgnoreSession(virtualOtherChild, virtual); 280 assertNotEqualsIgnoreSession(virtual, virtualOtherChild); 281 assertThat(virtualOtherChild).isNotEqualTo(hostId); 282 assertThat(hostId).isNotEqualTo(virtualOtherChild); 283 assertNotEqualsIgnoreSession(virtualOtherChild, hostId); 284 assertNotEqualsIgnoreSession(hostId, virtualOtherChild); 285 } 286 287 @Test testEqualsHashCode_virtual_longId_otherParent()288 public void testEqualsHashCode_virtual_longId_otherParent() { 289 final AutofillId hostId = new AutofillId(42); 290 final AutofillId virtual = new AutofillId(hostId, 1L, 108); 291 final AutofillId virtualOtherParent = new AutofillId(new AutofillId(666), 1L, 108); 292 final AutofillId virtualOtherChild = new AutofillId(hostId, 2L, 108); 293 294 assertThat(virtualOtherParent).isNotEqualTo(virtual); 295 assertThat(virtual).isNotEqualTo(virtualOtherParent); 296 assertNotEqualsIgnoreSession(virtualOtherParent, virtual); 297 assertNotEqualsIgnoreSession(virtual, virtualOtherParent); 298 assertThat(virtualOtherParent).isNotEqualTo(virtualOtherChild); 299 assertThat(virtualOtherChild).isNotEqualTo(virtualOtherParent); 300 assertNotEqualsIgnoreSession(virtualOtherParent, virtualOtherChild); 301 assertNotEqualsIgnoreSession(virtualOtherChild, virtualOtherParent); 302 } 303 304 @Test testEqualsHashCode_virtual_longId_otherSession()305 public void testEqualsHashCode_virtual_longId_otherSession() { 306 final AutofillId hostId = new AutofillId(42); 307 final AutofillId virtual = new AutofillId(hostId, 1L, 108); 308 final AutofillId virtualOtherSession = new AutofillId(hostId, 1L, 666); 309 310 assertThat(virtualOtherSession).isNotEqualTo(virtual); 311 assertThat(virtual).isNotEqualTo(virtualOtherSession); 312 assertEqualsIgnoreSession(virtualOtherSession, virtual); 313 assertEqualsIgnoreSession(virtual, virtualOtherSession); 314 } 315 cloneThroughParcel(AutofillId id)316 private AutofillId cloneThroughParcel(AutofillId id) { 317 Parcel parcel = Parcel.obtain(); 318 319 try { 320 // Write to parcel 321 parcel.setDataPosition(0); // Validity Check 322 id.writeToParcel(parcel, 0); 323 324 // Read from parcel 325 parcel.setDataPosition(0); 326 AutofillId clone = AutofillId.CREATOR.createFromParcel(parcel); 327 assertThat(clone).isNotNull(); 328 return clone; 329 } finally { 330 parcel.recycle(); 331 } 332 } 333 assertEqualsIgnoreSession(AutofillId id1, AutofillId id2)334 private void assertEqualsIgnoreSession(AutofillId id1, AutofillId id2) { 335 assertWithMessage("id1 is null").that(id1).isNotNull(); 336 assertWithMessage("id2 is null").that(id2).isNotNull(); 337 assertWithMessage("%s is not equal to %s", id1, id2).that(id1.equalsIgnoreSession(id2)) 338 .isTrue(); 339 } 340 assertNotEqualsIgnoreSession(AutofillId id1, AutofillId id2)341 private void assertNotEqualsIgnoreSession(AutofillId id1, AutofillId id2) { 342 assertWithMessage("id1 is null").that(id1).isNotNull(); 343 assertWithMessage("id2 is null").that(id2).isNotNull(); 344 assertWithMessage("%s is not equal to %s", id1, id2).that(id1.equalsIgnoreSession(id2)) 345 .isFalse(); 346 } 347 assertNonVirtual(AutofillId id, int expectedId, int expectSessionId)348 private void assertNonVirtual(AutofillId id, int expectedId, int expectSessionId) { 349 assertThat(id.getViewId()).isEqualTo(expectedId); 350 assertThat(id.isNonVirtual()).isTrue(); 351 assertThat(id.isVirtualInt()).isFalse(); 352 assertThat(id.isVirtualLong()).isFalse(); 353 assertThat(id.getVirtualChildIntId()).isEqualTo(View.NO_ID); 354 assertThat(id.getVirtualChildLongId()).isEqualTo(View.NO_ID); 355 assertThat(id.getSessionId()).isEqualTo(expectSessionId); 356 } 357 } 358