• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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