blob: 37f00075e183e2866c6d0f2b20a31e5c0a5e4bf5 [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.os.storage;
import android.content.Context;
import android.os.Environment;
import android.test.InstrumentationTestCase;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.Suppress;
import android.util.Log;
import com.android.frameworks.coretests.R;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.File;
import java.io.FileInputStream;
import junit.framework.AssertionFailedError;
public class StorageManagerIntegrationTest extends StorageManagerBaseTest {
private static String LOG_TAG = "StorageManagerBaseTest.StorageManagerIntegrationTest";
protected File mFile = null;
/**
* {@inheritDoc}
*/
@Override
public void setUp() throws Exception {
super.setUp();
mContext = getInstrumentation().getContext();
mFile = null;
}
/**
* {@inheritDoc}
*/
@Override
protected void tearDown() throws Exception {
if (mFile != null) {
mFile.delete();
mFile = null;
}
super.tearDown();
}
/**
* Tests mounting a single OBB file and verifies its contents.
*/
@LargeTest
public void testMountSingleObb() {
mFile = createObbFile(OBB_FILE_1, R.raw.obb_file1);
String filePath = mFile.getAbsolutePath();
mountObb(filePath);
verifyObb1Contents(filePath);
unmountObb(filePath, DONT_FORCE);
}
/**
* Tests mounting several OBB files and verifies its contents.
*/
@LargeTest
public void testMountMultipleObb() {
File file1 = null;
File file2 = null;
File file3 = null;
try {
file1 = createObbFile(OBB_FILE_1, R.raw.obb_file1);
String filePath1 = file1.getAbsolutePath();
mountObb(filePath1);
verifyObb1Contents(filePath1);
file2 = createObbFile(OBB_FILE_2, R.raw.obb_file2);
String filePath2 = file2.getAbsolutePath();
mountObb(filePath2);
verifyObb2Contents(filePath2);
file3 = createObbFile(OBB_FILE_3, R.raw.obb_file3);
String filePath3 = file3.getAbsolutePath();
mountObb(filePath3);
verifyObb3Contents(filePath3);
unmountObb(filePath1, DONT_FORCE);
unmountObb(filePath2, DONT_FORCE);
unmountObb(filePath3, DONT_FORCE);
} finally {
if (file1 != null) {
file1.delete();
}
if (file2 != null) {
file2.delete();
}
if (file3 != null) {
file3.delete();
}
}
}
/**
* Tests mounting a single encrypted OBB file and verifies its contents.
*/
@LargeTest
public void testMountSingleEncryptedObb() {
mFile = createObbFile(OBB_FILE_3_ENCRYPTED, R.raw.obb_enc_file100_orig3);
String filePath = mFile.getAbsolutePath();
mountObb(filePath, OBB_FILE_3_PASSWORD, OnObbStateChangeListener.MOUNTED);
verifyObb3Contents(filePath);
unmountObb(filePath, DONT_FORCE);
}
/**
* Tests mounting a single encrypted OBB file using an invalid password.
*/
@LargeTest
@Suppress // Failing.
public void testMountSingleEncryptedObbInvalidPassword() {
mFile = createObbFile("bad password@$%#@^*(!&)", R.raw.obb_enc_file100_orig3);
String filePath = mFile.getAbsolutePath();
mountObb(filePath, OBB_FILE_3_PASSWORD, OnObbStateChangeListener.ERROR_COULD_NOT_MOUNT);
unmountObb(filePath, DONT_FORCE);
}
/**
* Tests simultaneously mounting 2 encrypted OBBs with different keys and verifies contents.
*/
@LargeTest
public void testMountTwoEncryptedObb() {
File file3 = null;
File file1 = null;
try {
file3 = createObbFile(OBB_FILE_3_ENCRYPTED, R.raw.obb_enc_file100_orig3);
String filePath3 = file3.getAbsolutePath();
mountObb(filePath3, OBB_FILE_3_PASSWORD, OnObbStateChangeListener.MOUNTED);
verifyObb3Contents(filePath3);
file1 = createObbFile(OBB_FILE_1_ENCRYPTED, R.raw.obb_enc_file100_orig1);
String filePath1 = file1.getAbsolutePath();
mountObb(filePath1, OBB_FILE_1_PASSWORD, OnObbStateChangeListener.MOUNTED);
verifyObb1Contents(filePath1);
unmountObb(filePath3, DONT_FORCE);
unmountObb(filePath1, DONT_FORCE);
} finally {
if (file3 != null) {
file3.delete();
}
if (file1 != null) {
file1.delete();
}
}
}
/**
* Tests that we can not force unmount when a file is currently open on the OBB.
*/
@LargeTest
public void testUnmount_DontForce() {
mFile = createObbFile(OBB_FILE_1, R.raw.obb_file1);
String obbFilePath = mFile.getAbsolutePath();
MountingObbThread mountingThread = new MountingObbThread(obbFilePath,
OBB_FILE_1_CONTENTS_1);
try {
mountingThread.start();
long waitTime = 0;
while (!mountingThread.isFileOpenOnObb()) {
synchronized (mountingThread) {
Log.i(LOG_TAG, "Waiting for file to be opened on OBB...");
mountingThread.wait(WAIT_TIME_INCR);
waitTime += WAIT_TIME_INCR;
if (waitTime > MAX_WAIT_TIME) {
fail("Timed out waiting for file file to be opened on OBB!");
}
}
}
unmountObb(obbFilePath, DONT_FORCE);
// verify still mounted
assertTrue("mounted path should not be null!", obbFilePath != null);
assertTrue("mounted path should still be mounted!", mSm.isObbMounted(obbFilePath));
// close the opened file
mountingThread.doStop();
// try unmounting again (should succeed this time)
unmountObb(obbFilePath, DONT_FORCE);
assertFalse("mounted path should no longer be mounted!",
mSm.isObbMounted(obbFilePath));
} catch (InterruptedException e) {
fail("Timed out waiting for file on OBB to be opened...");
}
}
/**
* Tests mounting a single OBB that isn't signed.
*/
@LargeTest
public void testMountUnsignedObb() {
mFile = createObbFile(OBB_FILE_2_UNSIGNED, R.raw.obb_file2_nosign);
String filePath = mFile.getAbsolutePath();
mountObb(filePath, OBB_FILE_2_UNSIGNED, OnObbStateChangeListener.ERROR_INTERNAL);
}
/**
* Tests mounting a single OBB that is signed with a different package.
*/
@LargeTest
public void testMountBadPackageNameObb() {
mFile = createObbFile(OBB_FILE_3_BAD_PACKAGENAME, R.raw.obb_file3_bad_packagename);
String filePath = mFile.getAbsolutePath();
mountObb(filePath, OBB_FILE_3_BAD_PACKAGENAME,
OnObbStateChangeListener.ERROR_PERMISSION_DENIED);
}
/**
* Tests remounting a single OBB that has already been mounted.
*/
@LargeTest
public void testRemountObb() {
mFile = createObbFile(OBB_FILE_1, R.raw.obb_file1);
String filePath = mFile.getAbsolutePath();
mountObb(filePath);
verifyObb1Contents(filePath);
mountObb(filePath, null, OnObbStateChangeListener.ERROR_ALREADY_MOUNTED);
verifyObb1Contents(filePath);
unmountObb(filePath, DONT_FORCE);
}
}