1 /* 2 * Copyright 2022 Google LLC 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 package com.google.android.libraries.mobiledatadownload.internal; 17 18 import static com.google.common.truth.Truth.assertThat; 19 20 import android.content.Context; 21 import androidx.test.core.app.ApplicationProvider; 22 import com.google.android.libraries.mobiledatadownload.internal.Migrations.FileKeyVersion; 23 import com.google.android.libraries.mobiledatadownload.testing.TestFlags; 24 import com.google.common.base.Optional; 25 import com.google.mobiledatadownload.TransformProto.CompressTransform; 26 import com.google.mobiledatadownload.TransformProto.EncryptTransform; 27 import com.google.mobiledatadownload.TransformProto.IntegrityTransform; 28 import com.google.mobiledatadownload.TransformProto.Transform; 29 import com.google.mobiledatadownload.TransformProto.Transforms; 30 import com.google.mobiledatadownload.TransformProto.ZipTransform; 31 import com.google.mobiledatadownload.internal.MetadataProto.BaseFile; 32 import com.google.mobiledatadownload.internal.MetadataProto.DataFile; 33 import com.google.mobiledatadownload.internal.MetadataProto.DataFile.AndroidSharingChecksumType; 34 import com.google.mobiledatadownload.internal.MetadataProto.DataFile.AndroidSharingType; 35 import com.google.mobiledatadownload.internal.MetadataProto.DataFile.ChecksumType; 36 import com.google.mobiledatadownload.internal.MetadataProto.DataFileGroupInternal; 37 import com.google.mobiledatadownload.internal.MetadataProto.DeltaFile; 38 import com.google.mobiledatadownload.internal.MetadataProto.DeltaFile.DiffDecoder; 39 import com.google.mobiledatadownload.internal.MetadataProto.DownloadConditions; 40 import com.google.mobiledatadownload.internal.MetadataProto.DownloadConditions.DeviceNetworkPolicy; 41 import org.junit.Before; 42 import org.junit.Test; 43 import org.junit.runner.RunWith; 44 import org.robolectric.RobolectricTestRunner; 45 46 /** 47 * Unit tests for {@link 48 * com.google.android.libraries.mobiledatadownload.internal.DataFileGroupValidator}. 49 */ 50 @RunWith(RobolectricTestRunner.class) 51 public class DataFileGroupValidatorTest { 52 53 private static final String TEST_GROUP = "test-group"; 54 private Context context; 55 private final TestFlags flags = new TestFlags(); 56 57 @Before setUp()58 public void setUp() { 59 60 context = ApplicationProvider.getApplicationContext(); 61 } 62 63 @Test testAddGroupForDownload_compressedFile()64 public void testAddGroupForDownload_compressedFile() throws Exception { 65 Migrations.setCurrentVersion(context, FileKeyVersion.USE_CHECKSUM_ONLY); 66 Migrations.setMigratedToNewFileKey(context, true); 67 68 DataFileGroupInternal.Builder fileGroupBuilder = 69 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 1).toBuilder(); 70 DataFileGroupInternal dataFileGroup = 71 fileGroupBuilder 72 .setFile( 73 0, 74 fileGroupBuilder.getFile(0).toBuilder() 75 .setDownloadedFileChecksum("downloadchecksum") 76 .setDownloadTransforms( 77 Transforms.newBuilder() 78 .addTransform( 79 Transform.newBuilder() 80 .setCompress(CompressTransform.getDefaultInstance())))) 81 .build(); 82 83 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isTrue(); 84 } 85 86 @Test testAddGroupForDownload_compressedFile_noDownloadChecksum()87 public void testAddGroupForDownload_compressedFile_noDownloadChecksum() throws Exception { 88 Migrations.setCurrentVersion(context, FileKeyVersion.USE_CHECKSUM_ONLY); 89 Migrations.setMigratedToNewFileKey(context, true); 90 91 DataFileGroupInternal.Builder fileGroupBuilder = 92 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 1).toBuilder(); 93 DataFileGroupInternal dataFileGroup = 94 fileGroupBuilder 95 .setFile( 96 0, 97 fileGroupBuilder.getFile(0).toBuilder() 98 // Set valid download transforms so it won't fail transforms validation 99 .setDownloadTransforms( 100 Transforms.newBuilder() 101 .addTransform( 102 Transform.newBuilder() 103 .setCompress(CompressTransform.getDefaultInstance())))) 104 .build(); 105 106 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isFalse(); 107 } 108 109 @Test testAddGroupForDownload_encryptFileTransform()110 public void testAddGroupForDownload_encryptFileTransform() throws Exception { 111 Migrations.setCurrentVersion(context, FileKeyVersion.USE_CHECKSUM_ONLY); 112 Migrations.setMigratedToNewFileKey(context, true); 113 DataFileGroupInternal.Builder fileGroupBuilder = 114 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 1).toBuilder(); 115 DataFileGroupInternal dataFileGroup = 116 fileGroupBuilder 117 .setFile( 118 0, 119 fileGroupBuilder.getFile(0).toBuilder() 120 .setDownloadTransforms( 121 Transforms.newBuilder() 122 .addTransform( 123 Transform.newBuilder() 124 .setEncrypt(EncryptTransform.getDefaultInstance()))) 125 .setDownloadedFileChecksum("downloadchecksum")) 126 .build(); 127 128 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isTrue(); 129 } 130 131 @Test testAddGroupForDownload_integrityFileTransform()132 public void testAddGroupForDownload_integrityFileTransform() throws Exception { 133 Migrations.setCurrentVersion(context, FileKeyVersion.USE_CHECKSUM_ONLY); 134 Migrations.setMigratedToNewFileKey(context, true); 135 DataFileGroupInternal.Builder fileGroupBuilder = 136 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 1).toBuilder(); 137 DataFileGroupInternal dataFileGroup = 138 fileGroupBuilder 139 .setFile( 140 0, 141 fileGroupBuilder.getFile(0).toBuilder() 142 .setDownloadTransforms( 143 Transforms.newBuilder() 144 .addTransform( 145 Transform.newBuilder() 146 .setIntegrity(IntegrityTransform.getDefaultInstance()))) 147 .setDownloadedFileChecksum("downloadchecksum")) 148 .build(); 149 150 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isTrue(); 151 } 152 153 @Test testAddGroupForDownload_zip()154 public void testAddGroupForDownload_zip() { 155 flags.enableZipFolder = Optional.of(true); 156 157 Migrations.setCurrentVersion(context, FileKeyVersion.USE_CHECKSUM_ONLY); 158 Migrations.setMigratedToNewFileKey(context, true); 159 DataFileGroupInternal.Builder fileGroupBuilder = 160 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 1).toBuilder(); 161 DataFileGroupInternal dataFileGroup = 162 fileGroupBuilder 163 .setFile( 164 0, 165 fileGroupBuilder.getFile(0).toBuilder() 166 .setDownloadTransforms( 167 Transforms.newBuilder() 168 .addTransform( 169 Transform.newBuilder() 170 .setZip(ZipTransform.newBuilder().setTarget("*").build()))) 171 .setDownloadedFileChecksum("DOWNLOADEDFILECHECKSUM")) 172 .build(); 173 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isTrue(); 174 } 175 176 @Test testAddGroupForDownload_zip_featureOff()177 public void testAddGroupForDownload_zip_featureOff() { 178 flags.enableZipFolder = Optional.of(false); 179 180 Migrations.setCurrentVersion(context, FileKeyVersion.USE_CHECKSUM_ONLY); 181 Migrations.setMigratedToNewFileKey(context, true); 182 DataFileGroupInternal.Builder fileGroupBuilder = 183 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 1).toBuilder(); 184 DataFileGroupInternal dataFileGroup = 185 fileGroupBuilder 186 .setFile( 187 0, 188 fileGroupBuilder.getFile(0).toBuilder() 189 .setDownloadTransforms( 190 Transforms.newBuilder() 191 .addTransform( 192 Transform.newBuilder() 193 .setZip(ZipTransform.newBuilder().setTarget("*").build()))) 194 .setDownloadedFileChecksum("DOWNLOADEDFILECHECKSUM")) 195 .build(); 196 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isFalse(); 197 } 198 199 @Test testAddGroupForDownload_zip_noDownloadFileChecksum()200 public void testAddGroupForDownload_zip_noDownloadFileChecksum() { 201 flags.enableZipFolder = Optional.of(true); 202 203 Migrations.setCurrentVersion(context, FileKeyVersion.USE_CHECKSUM_ONLY); 204 Migrations.setMigratedToNewFileKey(context, true); 205 DataFileGroupInternal.Builder fileGroupBuilder = 206 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 1).toBuilder(); 207 DataFileGroupInternal dataFileGroup = 208 fileGroupBuilder 209 .setFile( 210 0, 211 fileGroupBuilder.getFile(0).toBuilder() 212 .setDownloadTransforms( 213 Transforms.newBuilder() 214 .addTransform( 215 Transform.newBuilder() 216 .setZip(ZipTransform.newBuilder().setTarget("*").build())))) 217 .build(); 218 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isFalse(); 219 } 220 221 @Test testAddGroupForDownload_zip_targetOneFile()222 public void testAddGroupForDownload_zip_targetOneFile() { 223 flags.enableZipFolder = Optional.of(true); 224 225 Migrations.setCurrentVersion(context, FileKeyVersion.USE_CHECKSUM_ONLY); 226 Migrations.setMigratedToNewFileKey(context, true); 227 DataFileGroupInternal.Builder fileGroupBuilder = 228 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 1).toBuilder(); 229 DataFileGroupInternal dataFileGroup = 230 fileGroupBuilder 231 .setFile( 232 0, 233 fileGroupBuilder.getFile(0).toBuilder() 234 .setDownloadTransforms( 235 Transforms.newBuilder() 236 .addTransform( 237 Transform.newBuilder() 238 .setZip( 239 ZipTransform.newBuilder().setTarget("abc.txt").build()))) 240 .setDownloadedFileChecksum("DOWNLOADEDFILECHECKSUM")) 241 .build(); 242 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isFalse(); 243 } 244 245 @Test testAddGroupForDownload_zip_moreThanOneTransforms()246 public void testAddGroupForDownload_zip_moreThanOneTransforms() { 247 flags.enableZipFolder = Optional.of(true); 248 249 Migrations.setCurrentVersion(context, FileKeyVersion.USE_CHECKSUM_ONLY); 250 Migrations.setMigratedToNewFileKey(context, true); 251 DataFileGroupInternal.Builder fileGroupBuilder = 252 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 1).toBuilder(); 253 DataFileGroupInternal dataFileGroup = 254 fileGroupBuilder 255 .setFile( 256 0, 257 fileGroupBuilder.getFile(0).toBuilder() 258 // Set valid download transforms so it won't fail transforms validation 259 .setDownloadTransforms( 260 Transforms.newBuilder() 261 .addTransform( 262 Transform.newBuilder() 263 .setZip(ZipTransform.newBuilder().setTarget("*").build())) 264 .addTransform( 265 Transform.newBuilder() 266 .setCompress(CompressTransform.getDefaultInstance())))) 267 .build(); 268 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isFalse(); 269 } 270 271 @Test testAddGroupForDownload_readTransform()272 public void testAddGroupForDownload_readTransform() throws Exception { 273 Migrations.setCurrentVersion(context, FileKeyVersion.USE_CHECKSUM_ONLY); 274 Migrations.setMigratedToNewFileKey(context, true); 275 DataFileGroupInternal.Builder fileGroupBuilder = 276 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 1).toBuilder(); 277 DataFileGroupInternal dataFileGroup = 278 fileGroupBuilder 279 .setFile( 280 0, 281 fileGroupBuilder.getFile(0).toBuilder() 282 .setReadTransforms( 283 Transforms.newBuilder() 284 .addTransform( 285 Transform.newBuilder() 286 .setIntegrity(IntegrityTransform.getDefaultInstance())))) 287 .build(); 288 289 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isTrue(); 290 } 291 292 @Test testAddGroupForDownload_readTransform_invalid()293 public void testAddGroupForDownload_readTransform_invalid() throws Exception { 294 Migrations.setCurrentVersion(context, FileKeyVersion.USE_CHECKSUM_ONLY); 295 Migrations.setMigratedToNewFileKey(context, true); 296 DataFileGroupInternal.Builder fileGroupBuilder = 297 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 1).toBuilder(); 298 DataFileGroupInternal dataFileGroup = 299 fileGroupBuilder 300 .setFile( 301 0, 302 fileGroupBuilder.getFile(0).toBuilder() 303 .setReadTransforms( 304 Transforms.newBuilder().addTransform(Transform.getDefaultInstance()))) 305 .build(); 306 307 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isFalse(); 308 } 309 310 @Test testAddGroupForDownload_isValidGroup()311 public void testAddGroupForDownload_isValidGroup() throws Exception { 312 // Group with empty name. 313 DataFileGroupInternal dataFileGroup = 314 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 1).toBuilder().setGroupName("").build(); 315 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isFalse(); 316 317 // Group with SPLIT_CHAR in the name. 318 dataFileGroup = 319 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 1).toBuilder() 320 .setGroupName("group|name") 321 .build(); 322 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isFalse(); 323 324 // Group with empty file id. 325 dataFileGroup = 326 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 2).toBuilder() 327 .setFile(0, dataFileGroup.getFile(0).toBuilder().clearFileId()) 328 .build(); 329 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isFalse(); 330 331 // Group with SPLIT_CHAR in the file id. 332 dataFileGroup = 333 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 2).toBuilder() 334 .setFile(0, dataFileGroup.getFile(0).toBuilder().setFileId("file|id")) 335 .build(); 336 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isFalse(); 337 338 // Group with empty url. 339 dataFileGroup = 340 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 2).toBuilder() 341 .setFile(0, dataFileGroup.getFile(0).toBuilder().clearUrlToDownload()) 342 .build(); 343 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isFalse(); 344 345 // Group with file size 0. 346 dataFileGroup = 347 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 2).toBuilder() 348 .setFile(1, dataFileGroup.getFile(1).toBuilder().clearByteSize()) 349 .build(); 350 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isTrue(); 351 352 // Group with empty checksum and ChecksumType = DEFAULT is invalid. 353 dataFileGroup = 354 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 2).toBuilder() 355 .setFile(0, dataFileGroup.getFile(0).toBuilder().setChecksum("")) 356 .build(); 357 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isFalse(); 358 359 // Group with empty checksum and ChecksumType = NONE is valid. 360 dataFileGroup = 361 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 2).toBuilder() 362 .setFile( 363 0, 364 dataFileGroup.getFile(0).toBuilder() 365 .setChecksum("") 366 .setChecksumType(ChecksumType.NONE)) 367 .build(); 368 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isTrue(); 369 370 // Group with download transforms but without downloaded file checksum, and ChecksumType = 371 // DEFAULT is invalid. 372 dataFileGroup = 373 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 2).toBuilder() 374 .setFile( 375 0, 376 dataFileGroup.getFile(0).toBuilder() 377 .setChecksumType(ChecksumType.DEFAULT) 378 .setDownloadTransforms( 379 Transforms.newBuilder() 380 .addTransform( 381 Transform.newBuilder() 382 .setCompress(CompressTransform.getDefaultInstance())))) 383 .build(); 384 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isFalse(); 385 386 // Group with download transforms but without downloaded file checksum, and ChecksumType = NONE 387 // is valid. 388 dataFileGroup = 389 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 2).toBuilder() 390 .setFile( 391 0, 392 dataFileGroup.getFile(0).toBuilder() 393 .setChecksum("") 394 .setChecksumType(ChecksumType.NONE) 395 .setDownloadTransforms( 396 Transforms.newBuilder() 397 .addTransform( 398 Transform.newBuilder() 399 .setCompress(CompressTransform.getDefaultInstance())))) 400 .build(); 401 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isTrue(); 402 403 // Group with SPLIT_CHAR in the checksum. 404 dataFileGroup = 405 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 2).toBuilder() 406 .setFile( 407 0, 408 dataFileGroup.getFile(0).toBuilder() 409 .setChecksumType(ChecksumType.DEFAULT) 410 .setChecksum("check|sum")) 411 .build(); 412 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isFalse(); 413 414 // Group with duplicate file ids. 415 dataFileGroup = 416 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 2).toBuilder() 417 .setFile( 418 0, 419 dataFileGroup.getFile(0).toBuilder() 420 .setFileId(dataFileGroup.getFile(1).getFileId())) 421 .build(); 422 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isFalse(); 423 424 // For DeviceNetworkPolicy.DOWNLOAD_FIRST_ON_WIFI_THEN_ON_ANY_NETWORK 425 // download_first_on_wifi_period_secs must be > 0. 426 DownloadConditions downloadConditions = 427 DownloadConditions.newBuilder() 428 .setDeviceNetworkPolicy(DeviceNetworkPolicy.DOWNLOAD_FIRST_ON_WIFI_THEN_ON_ANY_NETWORK) 429 .setDownloadFirstOnWifiPeriodSecs(0) 430 .build(); 431 dataFileGroup = 432 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 1).toBuilder() 433 .setDownloadConditions(downloadConditions) 434 .build(); 435 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isFalse(); 436 437 // Group with shared and not-shared files. 438 dataFileGroup = 439 MddTestUtil.createDataFileGroupInternal(TEST_GROUP, 2).toBuilder() 440 .setFile( 441 0, 442 dataFileGroup.getFile(0).toBuilder() 443 .setAndroidSharingType(AndroidSharingType.ANDROID_BLOB_WHEN_AVAILABLE) 444 .setAndroidSharingChecksumType(AndroidSharingChecksumType.SHA2_256) 445 .setAndroidSharingChecksum("sha256_file0")) 446 .build(); 447 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isTrue(); 448 } 449 450 @Test testInvalidAndroidSharedFile()451 public void testInvalidAndroidSharedFile() { 452 DataFileGroupInternal dataFileGroup = 453 MddTestUtil.createSharedDataFileGroupInternal(TEST_GROUP, 1); 454 DataFileGroupInternal invalidGroup = 455 dataFileGroup.toBuilder() 456 .setFile(0, dataFileGroup.getFile(0).toBuilder().setAndroidSharingChecksum("")) 457 .build(); 458 assertThat(DataFileGroupValidator.isValidGroup(invalidGroup, context, flags)).isFalse(); 459 } 460 461 @Test testValidDeltaFile()462 public void testValidDeltaFile() { 463 Migrations.setCurrentVersion(context, FileKeyVersion.USE_CHECKSUM_ONLY); 464 DataFileGroupInternal dataFileGroup = 465 MddTestUtil.createFileGroupInternalWithDeltaFile(TEST_GROUP); 466 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup, context, flags)).isTrue(); 467 } 468 469 @Test testInvalidDeltaFile_noDownloadUrl()470 public void testInvalidDeltaFile_noDownloadUrl() { 471 Migrations.setCurrentVersion(context, FileKeyVersion.USE_CHECKSUM_ONLY); 472 // create with delta file with NO download url 473 DataFileGroupInternal.Builder dataFileGroup = 474 MddTestUtil.createFileGroupInternalWithDeltaFile(TEST_GROUP).toBuilder(); 475 DeltaFile deltaFile = MddTestUtil.createDeltaFile().toBuilder().clearUrlToDownload().build(); 476 DataFile dataFile = 477 dataFileGroup.getFile(0).toBuilder().clearDeltaFile().addDeltaFile(deltaFile).build(); 478 dataFileGroup = dataFileGroup.setFile(0, dataFile); 479 480 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup.build(), context, flags)) 481 .isFalse(); 482 } 483 484 @Test testInvalidDeltaFile_noDiffDecoder()485 public void testInvalidDeltaFile_noDiffDecoder() { 486 Migrations.setCurrentVersion(context, FileKeyVersion.USE_CHECKSUM_ONLY); 487 // create with delta file with NO diff decoder 488 DataFileGroupInternal.Builder dataFileGroup = 489 MddTestUtil.createFileGroupInternalWithDeltaFile(TEST_GROUP).toBuilder(); 490 DeltaFile deltaFile = MddTestUtil.createDeltaFile().toBuilder().clearDiffDecoder().build(); 491 DataFile dataFile = 492 dataFileGroup.getFile(0).toBuilder().clearDeltaFile().addDeltaFile(deltaFile).build(); 493 dataFileGroup = dataFileGroup.setFile(0, dataFile); 494 495 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup.build(), context, flags)) 496 .isFalse(); 497 } 498 499 @Test testInvalidDeltaFile_unspecifiedDiffDecoder()500 public void testInvalidDeltaFile_unspecifiedDiffDecoder() { 501 Migrations.setCurrentVersion(context, FileKeyVersion.USE_CHECKSUM_ONLY); 502 // create with delta file with UNSPECIFIED diff decoder 503 DataFileGroupInternal.Builder dataFileGroup = 504 MddTestUtil.createFileGroupInternalWithDeltaFile(TEST_GROUP).toBuilder(); 505 DeltaFile deltaFile = 506 MddTestUtil.createDeltaFile().toBuilder().setDiffDecoder(DiffDecoder.UNSPECIFIED).build(); 507 DataFile dataFile = 508 dataFileGroup.getFile(0).toBuilder().clearDeltaFile().addDeltaFile(deltaFile).build(); 509 dataFileGroup = dataFileGroup.setFile(0, dataFile); 510 511 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup.build(), context, flags)) 512 .isFalse(); 513 } 514 515 @Test testInvalidDeltaFile_noChecksum()516 public void testInvalidDeltaFile_noChecksum() { 517 Migrations.setCurrentVersion(context, FileKeyVersion.USE_CHECKSUM_ONLY); 518 // create with delta file with NO checksum 519 DataFileGroupInternal.Builder dataFileGroup = 520 MddTestUtil.createFileGroupInternalWithDeltaFile(TEST_GROUP).toBuilder(); 521 DeltaFile deltaFile = MddTestUtil.createDeltaFile().toBuilder().clearChecksum().build(); 522 DataFile dataFile = 523 dataFileGroup.getFile(0).toBuilder().clearDeltaFile().addDeltaFile(deltaFile).build(); 524 dataFileGroup = dataFileGroup.setFile(0, dataFile); 525 526 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup.build(), context, flags)) 527 .isFalse(); 528 } 529 530 @Test testInvalidDeltaFile_noByteSize()531 public void testInvalidDeltaFile_noByteSize() { 532 Migrations.setCurrentVersion(context, FileKeyVersion.USE_CHECKSUM_ONLY); 533 // create with delta file with NO byte size 534 DataFileGroupInternal.Builder dataFileGroup = 535 MddTestUtil.createFileGroupInternalWithDeltaFile(TEST_GROUP).toBuilder(); 536 DeltaFile deltaFile = MddTestUtil.createDeltaFile().toBuilder().clearByteSize().build(); 537 DataFile dataFile = 538 dataFileGroup.getFile(0).toBuilder().clearDeltaFile().addDeltaFile(deltaFile).build(); 539 dataFileGroup = dataFileGroup.setFile(0, dataFile); 540 541 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup.build(), context, flags)) 542 .isFalse(); 543 } 544 545 @Test testInvalidDeltaFile_noBaseFileChecksum()546 public void testInvalidDeltaFile_noBaseFileChecksum() { 547 Migrations.setCurrentVersion(context, FileKeyVersion.USE_CHECKSUM_ONLY); 548 DataFileGroupInternal.Builder dataFileGroup = 549 MddTestUtil.createFileGroupInternalWithDeltaFile(TEST_GROUP).toBuilder(); 550 DeltaFile deltaFile = 551 MddTestUtil.createDeltaFile().toBuilder() 552 .setBaseFile(BaseFile.getDefaultInstance()) 553 .build(); 554 DataFile dataFile = 555 dataFileGroup.getFile(0).toBuilder().clearDeltaFile().addDeltaFile(deltaFile).build(); 556 dataFileGroup = dataFileGroup.setFile(0, dataFile); 557 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup.build(), context, flags)) 558 .isFalse(); 559 } 560 561 @Test testInvalidDeltaFile_baseFile_invalidChecksum()562 public void testInvalidDeltaFile_baseFile_invalidChecksum() { 563 Migrations.setCurrentVersion(context, FileKeyVersion.USE_CHECKSUM_ONLY); 564 DataFileGroupInternal.Builder dataFileGroup = 565 MddTestUtil.createFileGroupInternalWithDeltaFile(TEST_GROUP).toBuilder(); 566 DeltaFile deltaFile = 567 MddTestUtil.createDeltaFile().toBuilder() 568 .setBaseFile(BaseFile.newBuilder().setChecksum("abc" + "|" + "def")) 569 .build(); 570 DataFile dataFile = 571 dataFileGroup.getFile(0).toBuilder().clearDeltaFile().addDeltaFile(deltaFile).build(); 572 dataFileGroup = dataFileGroup.setFile(0, dataFile); 573 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup.build(), context, flags)) 574 .isFalse(); 575 } 576 577 @Test testInvalidDeltaFile_noBaseFile()578 public void testInvalidDeltaFile_noBaseFile() { 579 Migrations.setCurrentVersion(context, FileKeyVersion.USE_CHECKSUM_ONLY); 580 DataFileGroupInternal.Builder dataFileGroup = 581 MddTestUtil.createFileGroupInternalWithDeltaFile(TEST_GROUP).toBuilder(); 582 DeltaFile deltaFile = MddTestUtil.createDeltaFile().toBuilder().clearBaseFile().build(); 583 DataFile dataFile = 584 dataFileGroup.getFile(0).toBuilder().clearDeltaFile().addDeltaFile(deltaFile).build(); 585 dataFileGroup = dataFileGroup.setFile(0, dataFile); 586 assertThat(DataFileGroupValidator.isValidGroup(dataFileGroup.build(), context, flags)) 587 .isFalse(); 588 } 589 590 @Test testSideloadedFile_validWhenSideloadingEnabled()591 public void testSideloadedFile_validWhenSideloadingEnabled() { 592 // Create sideloaded group 593 DataFileGroupInternal sideloadedGroup = 594 DataFileGroupInternal.newBuilder() 595 .setGroupName(TEST_GROUP) 596 .addFile( 597 DataFile.newBuilder() 598 .setFileId("sideloaded_file") 599 .setUrlToDownload("file:/test") 600 .setChecksumType(DataFile.ChecksumType.NONE) 601 .build()) 602 .build(); 603 604 { 605 // Force sideloading off 606 flags.enableSideloading = Optional.of(false); 607 608 assertThat(DataFileGroupValidator.isValidGroup(sideloadedGroup, context, flags)).isFalse(); 609 } 610 611 { 612 // Force sideloading on 613 flags.enableSideloading = Optional.of(true); 614 615 assertThat(DataFileGroupValidator.isValidGroup(sideloadedGroup, context, flags)).isTrue(); 616 } 617 } 618 } 619