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