blob: 8b178bd6e3e1434fa08cd455e45b033d355dc593 [file] [log] [blame]
/*
* Copyright (C) 2014 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 com.android.sdklib;
import com.android.prefs.AndroidLocation;
import com.android.prefs.AndroidLocation.EnvVar;
import com.android.sdklib.mock.MockLog;
import java.io.File;
import java.io.IOException;
import junit.framework.TestCase;
/**
* Test case that overrides the {@link AndroidLocation} to point to temp one.
* <p>
* This one doesn't create a temp fake SDK (see {@link SdkManagerTestCase}.)
*/
public abstract class AndroidLocationTestCase extends TestCase {
private String mOldAndroidHomeProp;
private File mAndroidHome;
/**
* Sets up a {@link MockLog}, a fake SDK in a temporary directory
* and an AVD Manager pointing to an initially-empty AVD directory.
*/
@Override
public void setUp() throws Exception {
makeFakeAndroidHome();
}
/**
* Removes the temporary SDK and AVD directories.
*/
@Override
public void tearDown() throws Exception {
tearDownAndroidHome();
}
private void makeFakeAndroidHome() throws IOException {
// First we create a temp file to "reserve" the temp directory name we want to use.
mAndroidHome = File.createTempFile(
"androidhome_" + this.getClass().getSimpleName() + '_' + this.getName(), null);
// Then erase the file and make the directory
mAndroidHome.delete();
mAndroidHome.mkdirs();
// Set the system property that will force AndroidLocation to use this
mOldAndroidHomeProp = System.getProperty(EnvVar.ANDROID_SDK_HOME.getName());
System.setProperty(EnvVar.ANDROID_SDK_HOME.getName(), mAndroidHome.getAbsolutePath());
AndroidLocation.resetFolder();
}
private void tearDownAndroidHome() {
if (mOldAndroidHomeProp == null) {
System.clearProperty(EnvVar.ANDROID_SDK_HOME.getName());
} else {
System.setProperty(EnvVar.ANDROID_SDK_HOME.getName(), mOldAndroidHomeProp);
}
AndroidLocation.resetFolder();
deleteDir(mAndroidHome);
}
/** Clear the .android home folder and reconstruct it empty. */
protected void clearAndroidHome() {
deleteDir(mAndroidHome);
mAndroidHome.mkdirs();
AndroidLocation.resetFolder();
}
/**
* Recursive delete directory. Mostly for fake SDKs.
*
* @param root directory to delete
*/
private void deleteDir(File root) {
if (root.exists()) {
for (File file : root.listFiles()) {
if (file.isDirectory()) {
deleteDir(file);
} else {
file.delete();
}
}
root.delete();
}
}
}