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