1 /* 2 * Copyright (C) 2021 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 com.android.providers.media.photopicker; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import android.content.ContentValues; 22 import android.content.Context; 23 import android.database.Cursor; 24 import android.net.Uri; 25 26 import static org.junit.Assert.*; 27 28 import androidx.test.InstrumentationRegistry; 29 30 import com.android.providers.media.photopicker.data.UnreliableVolumeDatabaseHelper; 31 32 import org.junit.After; 33 import org.junit.Before; 34 import org.junit.Test; 35 36 import java.util.ArrayList; 37 import java.util.List; 38 39 public class UnreliableVolumeFacadeTest { 40 private static final int BATCH_SIZE = 100; 41 private static final long SIZE_BYTES = 7000; 42 private static final String DISPLAY_NAME = "random test image"; 43 private static final long DATE_MODIFIED = 1623852851911L; 44 private static final String MIME_TYPE = "image/jpg"; 45 private static final String DATA_PREFIX = "mnt/media_rw/A678954/"; 46 47 private static UnreliableVolumeFacade mFacade; 48 49 @Before setUp()50 public void setUp() { 51 Context context = InstrumentationRegistry.getTargetContext(); 52 mFacade = new UnreliableVolumeFacade(context); 53 } 54 55 @After tearDown()56 public void tearDown() { 57 mFacade.deleteMedia(); 58 } 59 60 @Test queryAllMedia()61 public void queryAllMedia() { 62 int counter = mFacade.insertMedia(generateContentDb()); 63 try (Cursor cr = mFacade.queryMediaAll()) { 64 assertThat(cr.getCount()).isEqualTo(counter); 65 cr.moveToFirst(); 66 assertThat(cr.getString(1)).isEqualTo(DATA_PREFIX + "1"); 67 cr.moveToNext(); 68 assertThat(cr.getString(1)).isEqualTo(DATA_PREFIX + "2"); 69 } 70 } 71 72 @Test testUniqueConstraint()73 public void testUniqueConstraint() { 74 List<ContentValues> values = generateContentDb(); 75 int initialCounter = mFacade.insertMedia(values); 76 int sameInsertionAttempt = mFacade.insertMedia(values); 77 assertEquals(100, initialCounter); 78 assertEquals(0, sameInsertionAttempt); 79 try (Cursor cr = mFacade.queryMediaAll()) { 80 assertThat(cr.getCount()).isEqualTo(initialCounter); 81 } 82 } 83 84 @Test deleteAllMedia()85 public void deleteAllMedia() { 86 mFacade.deleteMedia(); 87 try (Cursor cr = mFacade.queryMediaAll()) { 88 assertThat(cr.getCount()).isEqualTo(0); 89 } 90 } 91 92 @Test queryMediaId()93 public void queryMediaId() { 94 List<ContentValues> values = generateContentDb(); 95 int counter = mFacade.insertMedia(values); 96 String uriString = "content://media/external/file/10"; 97 Uri uri = Uri.parse(uriString); 98 try (Cursor cr = mFacade.queryMediaId(uri)) { 99 assertThat(cr.getCount()).isEqualTo(1); 100 cr.moveToFirst(); 101 String id = "10"; 102 assertThat(cr.getString(0)).isEqualTo(id); 103 } 104 } 105 generateAndGetContentValues(int index)106 private static ContentValues generateAndGetContentValues(int index) { 107 ContentValues values = new ContentValues(); 108 values.put(UnreliableVolumeDatabaseHelper.MediaColumns.DATE_MODIFIED, DATE_MODIFIED); 109 values.put(UnreliableVolumeDatabaseHelper.MediaColumns.SIZE_BYTES, SIZE_BYTES); 110 values.put(UnreliableVolumeDatabaseHelper.MediaColumns.DISPLAY_NAME, DISPLAY_NAME); 111 values.put(UnreliableVolumeDatabaseHelper.MediaColumns._DATA, DATA_PREFIX + index); 112 values.put(UnreliableVolumeDatabaseHelper.MediaColumns.MIME_TYPE, MIME_TYPE); 113 values.put(UnreliableVolumeDatabaseHelper.MediaColumns._ID, index); 114 115 return values; 116 } 117 generateContentDb()118 public List<ContentValues> generateContentDb() { 119 List<ContentValues> list = new ArrayList<>(); 120 for (int i = 1; i <= BATCH_SIZE; i++) { 121 list.add(generateAndGetContentValues(i)); 122 } 123 return list; 124 } 125 } 126