OSDN Git Service

original
[gb-231r1-is01/GB_2.3_IS01.git] / sdk / eclipse / plugins / com.android.ide.eclipse.tests / src / com / android / ide / eclipse / tests / SdkTestCase.java
diff --git a/sdk/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/SdkTestCase.java b/sdk/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/SdkTestCase.java
new file mode 100644 (file)
index 0000000..2774557
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * 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.ide.common.sdk.LoadStatus;
+import com.android.ide.eclipse.adt.AdtPlugin;
+import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetParser;
+import com.android.ide.eclipse.adt.internal.sdk.Sdk;
+import com.android.sdklib.IAndroidTarget;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+
+import junit.framework.TestCase;
+
+/**
+ * A test case which uses the SDK loaded by the ADT plugin.
+ */
+public abstract class SdkTestCase extends TestCase {
+
+    private Sdk mSdk;
+
+    protected SdkTestCase() {
+    }
+
+    /**
+     * Retrieve the {@link Sdk} under test.
+     */
+    protected Sdk getSdk() {
+        if (mSdk == null) {
+            mSdk = loadSdk();
+            assertNotNull(mSdk);
+            validateSdk(mSdk);
+        }
+        return mSdk;
+    }
+
+    /**
+     * Gets the current SDK from ADT, waiting if necessary.
+     */
+    private Sdk loadSdk() {
+        AdtPlugin adt = AdtPlugin.getDefault();
+
+        // We'll never get an AdtPlugin object when running this with the
+        // non-Eclipse jUnit test runner.
+        if (adt == null) {
+            return null;
+        }
+
+        Object sdkLock = Sdk.getLock();
+        LoadStatus loadStatus = LoadStatus.LOADING;
+        // wait for ADT to load the SDK on a separate thread
+        // loop max of 600 times * 200 ms =  2 minutes
+        final int maxWait = 600;
+        for (int i=0; i < maxWait && loadStatus == LoadStatus.LOADING; i++) {
+            try {
+                Thread.sleep(200);
+            }
+            catch (InterruptedException e) {
+                // ignore
+            }
+            synchronized(sdkLock) {
+                loadStatus = adt.getSdkLoadStatus();
+            }
+        }
+        Sdk sdk = null;
+        synchronized(sdkLock) {
+            assertEquals(LoadStatus.LOADED, loadStatus);
+            sdk = Sdk.getCurrent();
+        }
+        assertNotNull(sdk);
+        return sdk;
+    }
+
+    /**
+     * Checks that the provided sdk contains one or more valid targets.
+     * @param sdk the {@link Sdk} to validate.
+     */
+    private void validateSdk(Sdk sdk) {
+        assertTrue("sdk has no targets", sdk.getTargets().length > 0);
+        for (IAndroidTarget target : sdk.getTargets()) {
+            IStatus status = new AndroidTargetParser(target).run(new NullProgressMonitor());
+            if (status.getCode() != IStatus.OK) {
+                fail("Failed to parse targets data");
+            }
+        }
+    }
+}