| /* |
| * 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(); |
| } |
| } |
| |
| } |