1 /* 2 * Copyright (C) 2016 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.documentsui.archives; 18 19 import com.android.documentsui.archives.Archive; 20 import com.android.documentsui.tests.R; 21 22 import android.content.Context; 23 import android.net.Uri; 24 import android.os.ParcelFileDescriptor; 25 26 import java.io.File; 27 import java.io.FileOutputStream; 28 import java.io.IOException; 29 import java.io.InputStream; 30 import java.util.concurrent.ExecutorService; 31 32 import android.util.Log; 33 34 public class TestUtils { 35 public static final Uri ARCHIVE_URI = Uri.parse("content://i/love/strawberries"); 36 public static final String NOTIFICATION_URI = "content://notification-uri"; 37 38 public final Context mTargetContext; 39 public final Context mTestContext; 40 public final ExecutorService mExecutor; 41 TestUtils(Context targetContext, Context testContext, ExecutorService executor)42 public TestUtils(Context targetContext, Context testContext, ExecutorService executor) { 43 mTargetContext = targetContext; 44 mTestContext = testContext; 45 mExecutor = executor; 46 } 47 48 /** 49 * Creates an empty temporary file. 50 */ createTemporaryFile()51 public File createTemporaryFile() throws IOException { 52 return File.createTempFile("com.android.documentsui.archives.tests{", 53 "}.zip", mTargetContext.getCacheDir()); 54 } 55 56 /** 57 * Opens a resource and returns the contents via file descriptor to a local 58 * snapshot file. 59 */ getSeekableDescriptor(int resource)60 public ParcelFileDescriptor getSeekableDescriptor(int resource) { 61 // Extract the file from resources. 62 File file = null; 63 try { 64 file = File.createTempFile("com.android.documentsui.archives.tests{", 65 "}.zip", mTargetContext.getCacheDir()); 66 try ( 67 final FileOutputStream outputStream = 68 new ParcelFileDescriptor.AutoCloseOutputStream( 69 ParcelFileDescriptor.open( 70 file, ParcelFileDescriptor.MODE_WRITE_ONLY)); 71 final InputStream inputStream = 72 mTestContext.getResources().openRawResource(resource); 73 ) { 74 final byte[] buffer = new byte[32 * 1024]; 75 int bytes; 76 while ((bytes = inputStream.read(buffer)) != -1) { 77 outputStream.write(buffer, 0, bytes); 78 } 79 outputStream.flush(); 80 } 81 return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY); 82 } catch (IOException e) { 83 throw new IllegalStateException("Creating a snapshot failed. ", e); 84 } finally { 85 // On UNIX the file will be still available for processes which opened it, even 86 // after deleting it. Remove it ASAP, as it won't be used by anyone else. 87 if (file != null) { 88 file.delete(); 89 } 90 } 91 } 92 93 /** 94 * Opens a resource and returns the contents via a pipe. 95 */ getNonSeekableDescriptor(int resource)96 public ParcelFileDescriptor getNonSeekableDescriptor(int resource) { 97 ParcelFileDescriptor[] pipe = null; 98 try { 99 pipe = ParcelFileDescriptor.createPipe(); 100 final ParcelFileDescriptor finalOutputPipe = pipe[1]; 101 mExecutor.execute( 102 new Runnable() { 103 @Override 104 public void run() { 105 try ( 106 final ParcelFileDescriptor.AutoCloseOutputStream outputStream = 107 new ParcelFileDescriptor. 108 AutoCloseOutputStream(finalOutputPipe); 109 final InputStream inputStream = 110 mTestContext.getResources().openRawResource(resource); 111 ) { 112 final byte[] buffer = new byte[32 * 1024]; 113 int bytes; 114 while ((bytes = inputStream.read(buffer)) != -1) { 115 outputStream.write(buffer, 0, bytes); 116 } 117 } catch (IOException e) { 118 throw new IllegalStateException("Piping resource failed.", e); 119 } 120 } 121 }); 122 return pipe[0]; 123 } catch (IOException e) { 124 throw new IllegalStateException("Failed to create a pipe.", e); 125 } 126 } 127 } 128