internal/binres: skip resources tests if android.jar of api 15 is missing

Change-Id: I1cf92bb03c420e1eddaa36824cf488c5ed6f5a78
Reviewed-on: https://go-review.googlesource.com/93998
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
diff --git a/internal/binres/binres_test.go b/internal/binres/binres_test.go
index 6fba715..183583b 100644
--- a/internal/binres/binres_test.go
+++ b/internal/binres/binres_test.go
@@ -494,10 +494,7 @@
 }
 
 func TestTableRefByName(t *testing.T) {
-	sdkdir := os.Getenv("ANDROID_HOME")
-	if sdkdir == "" {
-		t.Skip("ANDROID_HOME env var not set")
-	}
+	checkResources(t)
 	tbl, err := OpenSDKTable()
 	if err != nil {
 		t.Fatal(err)
@@ -517,10 +514,7 @@
 }
 
 func TestTableMarshal(t *testing.T) {
-	sdkdir := os.Getenv("ANDROID_HOME")
-	if sdkdir == "" {
-		t.Skip("ANDROID_HOME env var not set")
-	}
+	checkResources(t)
 	tbl, err := OpenSDKTable()
 	if err != nil {
 		t.Fatal(err)
@@ -633,6 +627,21 @@
 	}
 }
 
+func checkResources(t *testing.T) {
+	t.Helper()
+	sdkdir := os.Getenv("ANDROID_HOME")
+	if sdkdir == "" {
+		t.Skip("ANDROID_HOME env var not set")
+	}
+	rscPath, err := apiResourcesPath()
+	if err != nil {
+		t.Skipf("failed to find resources: %v", err)
+	}
+	if _, err := os.Stat(rscPath); err != nil {
+		t.Skipf("failed to find resources: %v", err)
+	}
+}
+
 func BenchmarkTableRefByName(b *testing.B) {
 	sdkdir := os.Getenv("ANDROID_HOME")
 	if sdkdir == "" {
diff --git a/internal/binres/sdk.go b/internal/binres/sdk.go
index 7e751c5..5817c75 100644
--- a/internal/binres/sdk.go
+++ b/internal/binres/sdk.go
@@ -15,15 +15,14 @@
 
 // Requires environment variable ANDROID_HOME to be set.
 func apiResources() ([]byte, error) {
-	sdkdir := os.Getenv("ANDROID_HOME")
-	if sdkdir == "" {
-		return nil, fmt.Errorf("ANDROID_HOME env var not set")
+	apiResPath, err := apiResourcesPath()
+	if err != nil {
+		return nil, err
 	}
-	platform := fmt.Sprintf("android-%v", MinSDK)
-	zr, err := zip.OpenReader(path.Join(sdkdir, "platforms", platform, "android.jar"))
+	zr, err := zip.OpenReader(apiResPath)
 	if err != nil {
 		if os.IsNotExist(err) {
-			return nil, fmt.Errorf(`%v; consider installing with "android update sdk --all --no-ui --filter %s"`, err, platform)
+			return nil, fmt.Errorf(`%v; consider installing with "android update sdk --all --no-ui --filter android-%d"`, err, MinSDK)
 		}
 		return nil, err
 	}
@@ -50,6 +49,17 @@
 	return buf.Bytes(), nil
 }
 
+func apiResourcesPath() (string, error) {
+	// TODO(elias.naur): use the logic from gomobile's androidAPIPath and use the any installed version of the
+	// Android SDK instead. Currently, the binres_test.go tests fail on anything newer than android-15.
+	sdkdir := os.Getenv("ANDROID_HOME")
+	if sdkdir == "" {
+		return "", fmt.Errorf("ANDROID_HOME env var not set")
+	}
+	platform := fmt.Sprintf("android-%v", MinSDK)
+	return path.Join(sdkdir, "platforms", platform, "android.jar"), nil
+}
+
 // PackResources produces a stripped down gzip version of the resources.arsc from api jar.
 func PackResources() ([]byte, error) {
 	tbl, err := OpenSDKTable()