blob: c86f4cf5f0910af4ab3382c4d6e93b24198940a4 [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
*
* 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.ide.eclipse.tests;
import com.android.SdkConstants;
import com.android.ide.eclipse.adt.AdtConstants;
import com.android.ide.eclipse.adt.AdtPlugin;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Platform;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.logging.Logger;
/**
* Helper class for retrieving test data
* <p/>
* All tests which need to retrieve paths to test data files should go through this class.
*/
public class AdtTestData {
/** singleton instance */
private static AdtTestData sInstance = null;
private static final Logger sLogger = Logger.getLogger(AdtTestData.class.getName());
/** The prefered directory separator to use. */
private static final String DIR_SEP_STR = "/";
private static final char DIR_SEP_CHAR = '/';
/** The absolute file path to the plugin's contents. */
private String mOsRootDataPath;
private AdtTestData() {
// can set test_data env variable to override default behavior of
// finding data using class loader
// useful when running in plugin environment, where test data is inside
// bundled jar, and must be extracted to temp filesystem location to be
// accessed normally
mOsRootDataPath = System.getProperty("test_data");
if (mOsRootDataPath == null) {
sLogger.info("Cannot find test_data environment variable, init to class loader");
URL url = this.getClass().getClassLoader().getResource("."); //$NON-NLS-1$
if (Platform.isRunning()) {
sLogger.info("Running as an Eclipse Plug-in JUnit test, using FileLocator");
try {
mOsRootDataPath = FileLocator.resolve(url).getFile();
if (SdkConstants.currentPlatform() == SdkConstants.PLATFORM_WINDOWS) {
// Fix the path returned by the URL resolver
// so that it actually works on Windows.
// First, Windows paths don't start with a / especially
// if they contain a drive spec such as C:/...
int pos = mOsRootDataPath.indexOf(':');
if (pos > 0 && mOsRootDataPath.charAt(0) == '/') {
mOsRootDataPath = mOsRootDataPath.substring(1);
}
// Looking for "." probably inserted a /./, so clean it up
mOsRootDataPath = mOsRootDataPath.replace("/./", "/");
}
} catch (IOException e) {
sLogger.warning("IOException while using FileLocator, reverting to url");
mOsRootDataPath = url.getFile();
}
} else {
sLogger.info("Running as an plain JUnit test, using url as-is");
mOsRootDataPath = url.getFile();
}
}
if (mOsRootDataPath.equals(AdtConstants.WS_SEP)) {
sLogger.warning("Resource data not found using class loader!, Defaulting to no path");
}
if (File.separatorChar == '\\') {
// On Windows, uniformize all separators to use the / convention
mOsRootDataPath.replace('\\', DIR_SEP_CHAR);
}
if (!mOsRootDataPath.endsWith(File.separator) && !mOsRootDataPath.endsWith(DIR_SEP_STR)) {
sLogger.info("Fixing test_data env variable (does not end with path separator)");
mOsRootDataPath += DIR_SEP_STR;
}
}
/** Get the singleton instance of AdtTestData */
public static AdtTestData getInstance() {
if (sInstance == null) {
sInstance = new AdtTestData();
}
return sInstance;
}
/**
* Returns the absolute file path to a file located in this plugin.
*
* @param osRelativePath {@link String} path to file contained in plugin. Must
* use path separators appropriate to host OS
*
* @return absolute OS path to test file
*/
public String getTestFilePath(String osRelativePath) {
File path = new File(mOsRootDataPath, osRelativePath);
if (!path.exists()) {
// On Windows at least this ends up using the wrong plugin path.
String pkgAdt = AdtPlugin .class.getPackage().getName();
String pkgTests = AdtTestData.class.getPackage().getName();
if (mOsRootDataPath.contains(pkgAdt)) {
path = new File(mOsRootDataPath.replace(pkgAdt, pkgTests), osRelativePath);
}
assert path.exists();
}
return path.getAbsolutePath();
}
}