1 /* 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 package android.os; 18 19 import static org.junit.Assert.assertNull; 20 import static org.junit.Assert.assertTrue; 21 import static org.junit.Assert.fail; 22 23 import android.platform.test.annotations.DisabledOnRavenwood; 24 import android.platform.test.ravenwood.RavenwoodRule; 25 import android.util.ArrayMap; 26 27 import androidx.test.ext.junit.runners.AndroidJUnit4; 28 import androidx.test.filters.SmallTest; 29 30 import org.junit.Rule; 31 import org.junit.Test; 32 import org.junit.runner.RunWith; 33 34 import java.util.ArrayList; 35 import java.util.HashMap; 36 import java.util.List; 37 import java.util.Map; 38 39 @SmallTest 40 @RunWith(AndroidJUnit4.class) 41 public final class ParcelNullabilityTest { 42 @Rule 43 public final RavenwoodRule mRavenwood = new RavenwoodRule(); 44 45 @Test nullByteArray()46 public void nullByteArray() { 47 Parcel p = Parcel.obtain(); 48 p.writeByteArray(null); 49 50 assertNull(throughBytes(p).createByteArray()); 51 } 52 53 @Test nullBlob()54 public void nullBlob() { 55 Parcel p = Parcel.obtain(); 56 p.writeBlob(null); 57 58 assertNull(throughBytes(p).readBlob()); 59 } 60 61 @Test nullString()62 public void nullString() { 63 Parcel p = Parcel.obtain(); 64 p.writeString(null); 65 66 assertNull(throughBytes(p).readString()); 67 } 68 69 @Test 70 @DisabledOnRavenwood(blockedBy = android.text.Spanned.class) nullCharSequence()71 public void nullCharSequence() { 72 Parcel p = Parcel.obtain(); 73 p.writeCharSequence(null); 74 75 assertNull(throughBytes(p).readCharSequence()); 76 } 77 78 @Test nullStrongBinder()79 public void nullStrongBinder() { 80 Parcel p = Parcel.obtain(); 81 p.writeStrongBinder(null); 82 83 assertNull(throughBytes(p).readStrongBinder()); 84 } 85 86 @Test nullStringInterface()87 public void nullStringInterface() { 88 Parcel p = Parcel.obtain(); 89 p.writeStrongInterface(null); 90 91 assertNull(throughBytes(p).readStrongBinder()); 92 } 93 94 @Test nullFileDescriptor()95 public void nullFileDescriptor() { 96 Parcel p = Parcel.obtain(); 97 try { 98 p.writeFileDescriptor(null); 99 fail(); 100 } catch (RuntimeException expected) { 101 } 102 } 103 104 @Test nullRawFileDescriptor()105 public void nullRawFileDescriptor() { 106 Parcel p = Parcel.obtain(); 107 try { 108 p.writeRawFileDescriptor(null); 109 fail(); 110 } catch (RuntimeException expected) { 111 } 112 } 113 114 @Test nullRawFileDescriptorArray()115 public void nullRawFileDescriptorArray() { 116 Parcel p = Parcel.obtain(); 117 p.writeRawFileDescriptorArray(null); 118 119 assertNull(throughBytes(p).createRawFileDescriptorArray()); 120 } 121 122 @Test nullMap()123 public void nullMap() { 124 Parcel p = Parcel.obtain(); 125 p.writeMap(null); 126 127 Map<Object, Object> map = new HashMap<>(); 128 throughBytes(p).readMap(map, null); 129 assertTrue(map.isEmpty()); 130 } 131 132 @Test nullArrayMap()133 public void nullArrayMap() { 134 Parcel p = Parcel.obtain(); 135 p.writeArrayMap(null); 136 137 ArrayMap<Object, Object> map = new ArrayMap<>(); 138 throughBytes(p).readArrayMap(map, null); 139 assertTrue(map.isEmpty()); 140 } 141 142 @Test nullArraySet()143 public void nullArraySet() { 144 Parcel p = Parcel.obtain(); 145 p.writeArraySet(null); 146 147 assertNull(throughBytes(p).readArraySet(null)); 148 } 149 150 @Test nullBundle()151 public void nullBundle() { 152 Parcel p = Parcel.obtain(); 153 p.writeBundle(null); 154 155 assertNull(throughBytes(p).readBundle()); 156 } 157 158 @Test nullPersistableBundle()159 public void nullPersistableBundle() { 160 Parcel p = Parcel.obtain(); 161 p.writePersistableBundle(null); 162 163 assertNull(throughBytes(p).readPersistableBundle()); 164 } 165 166 @Test nullSize()167 public void nullSize() { 168 Parcel p = Parcel.obtain(); 169 try { 170 p.writeSize(null); 171 fail(); 172 } catch (RuntimeException expected) { 173 } 174 } 175 176 @Test nullSizeF()177 public void nullSizeF() { 178 Parcel p = Parcel.obtain(); 179 try { 180 p.writeSizeF(null); 181 fail(); 182 } catch (RuntimeException expected) { 183 } 184 } 185 186 @Test nullList()187 public void nullList() { 188 Parcel p = Parcel.obtain(); 189 p.writeList(null); 190 191 List<Object> map = new ArrayList<>(); 192 throughBytes(p).readList(map, null); 193 assertTrue(map.isEmpty()); 194 } 195 196 @Test nullArray()197 public void nullArray() { 198 Parcel p = Parcel.obtain(); 199 p.writeArray(null); 200 201 assertNull(throughBytes(p).readArray(null)); 202 } 203 204 @Test nullSparseArray()205 public void nullSparseArray() { 206 Parcel p = Parcel.obtain(); 207 p.writeSparseArray(null); 208 209 assertNull(throughBytes(p).readSparseArray(null)); 210 } 211 212 @Test nullSparseBooleanArray()213 public void nullSparseBooleanArray() { 214 Parcel p = Parcel.obtain(); 215 p.writeSparseBooleanArray(null); 216 217 assertNull(throughBytes(p).readSparseBooleanArray()); 218 } 219 220 @Test nullSparseIntArray()221 public void nullSparseIntArray() { 222 Parcel p = Parcel.obtain(); 223 p.writeSparseIntArray(null); 224 225 assertNull(throughBytes(p).readSparseIntArray()); 226 } 227 228 @Test nullBooleanArray()229 public void nullBooleanArray() { 230 Parcel p = Parcel.obtain(); 231 p.writeBooleanArray(null); 232 233 assertNull(throughBytes(p).createBooleanArray()); 234 } 235 236 @Test nullCharArray()237 public void nullCharArray() { 238 Parcel p = Parcel.obtain(); 239 p.writeCharArray(null); 240 241 assertNull(throughBytes(p).createCharArray()); 242 } 243 244 @Test nullIntArray()245 public void nullIntArray() { 246 Parcel p = Parcel.obtain(); 247 p.writeIntArray(null); 248 249 assertNull(throughBytes(p).createIntArray()); 250 } 251 252 @Test nullLongArray()253 public void nullLongArray() { 254 Parcel p = Parcel.obtain(); 255 p.writeLongArray(null); 256 257 assertNull(throughBytes(p).createLongArray()); 258 } 259 260 @Test nullFloatArray()261 public void nullFloatArray() { 262 Parcel p = Parcel.obtain(); 263 p.writeFloatArray(null); 264 265 assertNull(throughBytes(p).createFloatArray()); 266 } 267 268 @Test nullDoubleArray()269 public void nullDoubleArray() { 270 Parcel p = Parcel.obtain(); 271 p.writeDoubleArray(null); 272 273 assertNull(throughBytes(p).createDoubleArray()); 274 } 275 276 @Test nullStringArray()277 public void nullStringArray() { 278 Parcel p = Parcel.obtain(); 279 p.writeStringArray(null); 280 281 assertNull(throughBytes(p).createStringArray()); 282 } 283 284 @Test nullCharSequenceArray()285 public void nullCharSequenceArray() { 286 Parcel p = Parcel.obtain(); 287 p.writeCharSequenceArray(null); 288 289 assertNull(throughBytes(p).readCharSequenceArray()); 290 } 291 292 @Test nullCharSequenceList()293 public void nullCharSequenceList() { 294 Parcel p = Parcel.obtain(); 295 p.writeCharSequenceList(null); 296 297 assertNull(throughBytes(p).readCharSequenceList()); 298 } 299 300 @Test nullBinderArray()301 public void nullBinderArray() { 302 Parcel p = Parcel.obtain(); 303 p.writeBinderArray(null); 304 305 assertNull(throughBytes(p).createBinderArray()); 306 } 307 308 @Test nullTypedList()309 public void nullTypedList() { 310 Parcel p = Parcel.obtain(); 311 p.writeTypedList(null); 312 313 assertNull(throughBytes(p).createTypedArrayList(null)); 314 } 315 316 @Test nullStringList()317 public void nullStringList() { 318 Parcel p = Parcel.obtain(); 319 p.writeStringList(null); 320 321 assertNull(throughBytes(p).createStringArrayList()); 322 } 323 324 @Test nullBinderList()325 public void nullBinderList() { 326 Parcel p = Parcel.obtain(); 327 p.writeBinderList(null); 328 329 assertNull(throughBytes(p).createBinderArrayList()); 330 } 331 332 @Test nullParcelableList()333 public void nullParcelableList() { 334 Parcel p = Parcel.obtain(); 335 p.writeParcelableList(null, 0); 336 337 List<Parcelable> list = new ArrayList<>(); 338 throughBytes(p).readParcelableList(list, null); 339 assertTrue(list.isEmpty()); 340 } 341 342 @Test nullTypedArray()343 public void nullTypedArray() { 344 Parcel p = Parcel.obtain(); 345 p.writeTypedArray(null, 0); 346 347 assertNull(throughBytes(p).createTypedArray(null)); 348 } 349 350 @Test nullTypedObject()351 public void nullTypedObject() { 352 Parcel p = Parcel.obtain(); 353 p.writeTypedObject(null, 0); 354 355 assertNull(throughBytes(p).readTypedObject(null)); 356 } 357 358 @Test nullValue()359 public void nullValue() { 360 Parcel p = Parcel.obtain(); 361 p.writeValue(null); 362 363 assertNull(throughBytes(p).readValue(null)); 364 } 365 366 @Test nullParcelable()367 public void nullParcelable() { 368 Parcel p = Parcel.obtain(); 369 p.writeParcelable(null, 0); 370 371 assertNull(throughBytes(p).readParcelable(null)); 372 } 373 374 @Test nullSerializable()375 public void nullSerializable() { 376 Parcel p = Parcel.obtain(); 377 p.writeSerializable(null); 378 379 assertNull(throughBytes(p).readSerializable()); 380 } 381 382 @Test nullException()383 public void nullException() { 384 Parcel p = Parcel.obtain(); 385 try { 386 p.writeException(null); 387 fail(); 388 } catch (RuntimeException expected) { 389 } 390 } 391 throughBytes(Parcel p)392 private static Parcel throughBytes(Parcel p) { 393 byte[] bytes = p.marshall(); 394 p = Parcel.obtain(); 395 p.unmarshall(bytes, 0, bytes.length); 396 p.setDataPosition(0); 397 return p; 398 } 399 } 400