1 /* 2 * Copyright (C) 2017 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.cts.backup.fullbackuponlyapp; 18 19 import static android.support.test.InstrumentationRegistry.getTargetContext; 20 21 import static org.junit.Assert.assertFalse; 22 import static org.junit.Assert.assertTrue; 23 24 import android.content.Context; 25 import android.support.test.runner.AndroidJUnit4; 26 import android.util.Log; 27 28 import org.junit.Before; 29 import org.junit.Test; 30 import org.junit.runner.RunWith; 31 32 import java.io.BufferedOutputStream; 33 import java.io.File; 34 import java.io.FileOutputStream; 35 import java.io.IOException; 36 import java.util.Random; 37 38 /** 39 * Device side routines to be invoked by the host side FullBackupOnlyHostSideTest. These 40 * are not designed to be called in any other way, as they rely on state set up by the host side 41 * test. 42 */ 43 @RunWith(AndroidJUnit4.class) 44 public class FullBackupOnlyTest { 45 private static final String TAG = "FullBackupOnlyTest"; 46 47 private static final int FILE_SIZE_BYTES = 1024 * 1024; 48 49 private File mKeyValueBackupFile; 50 private File mDoBackupFile; 51 private File mDoBackupFile2; 52 53 private Context mContext; 54 55 @Before setUp()56 public void setUp() { 57 Log.i(TAG, "set up"); 58 mContext = getTargetContext(); 59 setupFiles(); 60 } 61 setupFiles()62 private void setupFiles() { 63 mKeyValueBackupFile = getKeyValueBackupFile(mContext); 64 65 // Files to be backed up with Dolly 66 File filesDir = mContext.getFilesDir(); 67 File normalFolder = new File(filesDir, "normal_folder"); 68 69 mDoBackupFile = new File(filesDir, "file_to_backup"); 70 mDoBackupFile2 = new File(normalFolder, "file_to_backup2"); 71 } 72 73 @Test createFiles()74 public void createFiles() throws Exception { 75 // Make sure the data does not exist from before 76 deleteAllFiles(); 77 assertNoFilesExist(); 78 79 // Create test data 80 generateFiles(); 81 assertAllFilesExist(); 82 83 Log.d(TAG, "Test files created: \n" 84 + mKeyValueBackupFile.getAbsolutePath() + "\n" 85 + mDoBackupFile.getAbsolutePath() + "\n" 86 + mDoBackupFile2.getAbsolutePath()); 87 } 88 89 @Test checkKeyValueFileDoesntExist()90 public void checkKeyValueFileDoesntExist() throws Exception { 91 assertKeyValueFileDoesntExist(); 92 } 93 94 @Test checkKeyValueFileExists()95 public void checkKeyValueFileExists() throws Exception { 96 assertKeyValueFileExists(); 97 } 98 99 @Test checkDollyFilesExist()100 public void checkDollyFilesExist() throws Exception { 101 assertDollyFilesExist(); 102 } 103 104 @Test checkDollyFilesDontExist()105 public void checkDollyFilesDontExist() throws Exception { 106 assertDollyFilesDontExist(); 107 } 108 getKeyValueBackupFile(Context context)109 protected static File getKeyValueBackupFile(Context context) { 110 // Files in the 'no_backup' directory are not backed up with Dolly. 111 // We're going to use it to store a file the contents of which are backed up via key/value. 112 File noBackupDir = context.getNoBackupFilesDir(); 113 return new File(noBackupDir, "key_value_backup_file"); 114 } 115 generateFiles()116 private void generateFiles() { 117 try { 118 // Add data to all the files we created 119 addData(mKeyValueBackupFile); 120 addData(mDoBackupFile); 121 addData(mDoBackupFile2); 122 Log.d(TAG, "Files generated!"); 123 } catch (IOException e) { 124 Log.e(TAG, "Unable to generate files", e); 125 } 126 } 127 deleteAllFiles()128 private void deleteAllFiles() { 129 mKeyValueBackupFile.delete(); 130 mDoBackupFile.delete(); 131 mDoBackupFile2.delete(); 132 Log.d(TAG, "Files deleted!"); 133 } 134 addData(File file)135 private void addData(File file) throws IOException { 136 file.getParentFile().mkdirs(); 137 byte[] bytes = new byte[FILE_SIZE_BYTES]; 138 new Random().nextBytes(bytes); 139 140 try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file))) { 141 bos.write(bytes, 0, bytes.length); 142 } 143 } 144 assertAllFilesExist()145 private void assertAllFilesExist() { 146 assertKeyValueFileExists(); 147 assertDollyFilesExist(); 148 } 149 assertNoFilesExist()150 private void assertNoFilesExist() { 151 assertKeyValueFileDoesntExist(); 152 assertDollyFilesDontExist(); 153 } 154 assertKeyValueFileExists()155 private void assertKeyValueFileExists() { 156 assertTrue("Key/value file did not exist!", mKeyValueBackupFile.exists()); 157 } 158 assertKeyValueFileDoesntExist()159 private void assertKeyValueFileDoesntExist() { 160 assertFalse("Key/value file did exist!", mKeyValueBackupFile.exists()); 161 } 162 assertDollyFilesExist()163 private void assertDollyFilesExist() { 164 assertTrue("File in 'files' did not exist!", mDoBackupFile.exists()); 165 assertTrue("File in folder inside 'files' did not exist!", mDoBackupFile2.exists()); 166 } 167 assertDollyFilesDontExist()168 private void assertDollyFilesDontExist() { 169 assertFalse("File in 'files' did exist!", mDoBackupFile.exists()); 170 assertFalse("File in folder inside 'files' did exist!", mDoBackupFile2.exists()); 171 } 172 } 173