aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/AdtTestData.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/AdtTestData.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/AdtTestData.java135
1 files changed, 135 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/AdtTestData.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/AdtTestData.java
new file mode 100644
index 000000000..c86f4cf5f
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/AdtTestData.java
@@ -0,0 +1,135 @@
+/*
+ * 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();
+ }
+}