To use the NDK before version r19b standalone toolchains had to be generated. Version r19b added prebuilt standalone toolchains. Use the prebuilt for gomobile build and gomobile bind and stop generating toolchains during gomobile init. gomobile init is now only necessary for building OpenAL for gomobile build programs. This change is not compatible with NDK versions < r19b, but the user is instructed how to upgrade when running gomobile build or gomobile bind. Change-Id: I96953298ecce42402459a9dd15169c09fe6b6f8b Reviewed-on: https://go-review.googlesource.com/c/163378 Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
182 lines
4.4 KiB
Go
182 lines
4.4 KiB
Go
// Copyright 2015 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
"text/template"
|
|
)
|
|
|
|
func TestRFC1034Label(t *testing.T) {
|
|
tests := []struct {
|
|
in, want string
|
|
}{
|
|
{"a", "a"},
|
|
{"123", "-23"},
|
|
{"a.b.c", "a-b-c"},
|
|
{"a-b", "a-b"},
|
|
{"a:b", "a-b"},
|
|
{"a?b", "a-b"},
|
|
{"αβγ", "---"},
|
|
{"💩", "--"},
|
|
{"My App", "My-App"},
|
|
{"...", ""},
|
|
{".-.", "--"},
|
|
}
|
|
|
|
for _, tc := range tests {
|
|
if got := rfc1034Label(tc.in); got != tc.want {
|
|
t.Errorf("rfc1034Label(%q) = %q, want %q", tc.in, got, tc.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestAndroidPkgName(t *testing.T) {
|
|
tests := []struct {
|
|
in, want string
|
|
}{
|
|
{"a", "a"},
|
|
{"a123", "a123"},
|
|
{"a.b.c", "a_b_c"},
|
|
{"a-b", "a_b"},
|
|
{"a:b", "a_b"},
|
|
{"a?b", "a_b"},
|
|
{"αβγ", "go___"},
|
|
{"💩", "go_"},
|
|
{"My App", "My_App"},
|
|
{"...", "go___"},
|
|
{".-.", "go___"},
|
|
{"abstract", "abstract_"},
|
|
{"Abstract", "Abstract"},
|
|
{"12345", "go12345"},
|
|
}
|
|
|
|
for _, tc := range tests {
|
|
if got := androidPkgName(tc.in); got != tc.want {
|
|
t.Errorf("len %d", len(tc.in))
|
|
t.Errorf("androidPkgName(%q) = %q, want %q", tc.in, got, tc.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestAndroidBuild(t *testing.T) {
|
|
buf := new(bytes.Buffer)
|
|
defer func() {
|
|
xout = os.Stderr
|
|
buildN = false
|
|
buildX = false
|
|
}()
|
|
xout = buf
|
|
buildN = true
|
|
buildX = true
|
|
buildO = "basic.apk"
|
|
buildTarget = "android/arm"
|
|
gopath = filepath.ToSlash(filepath.SplitList(goEnv("GOPATH"))[0])
|
|
if goos == "windows" {
|
|
os.Setenv("HOMEDRIVE", "C:")
|
|
}
|
|
cmdBuild.flag.Parse([]string{"golang.org/x/mobile/example/basic"})
|
|
oldTags := ctx.BuildTags
|
|
ctx.BuildTags = []string{"tag1"}
|
|
defer func() {
|
|
ctx.BuildTags = oldTags
|
|
}()
|
|
err := runBuild(cmdBuild)
|
|
if err != nil {
|
|
t.Log(buf.String())
|
|
t.Fatal(err)
|
|
}
|
|
|
|
diff, err := diffOutput(buf.String(), androidBuildTmpl)
|
|
if err != nil {
|
|
t.Fatalf("computing diff failed: %v", err)
|
|
}
|
|
if diff != "" {
|
|
t.Errorf("unexpected output:\n%s", diff)
|
|
}
|
|
}
|
|
|
|
var androidBuildTmpl = template.Must(template.New("output").Parse(`GOMOBILE={{.GOPATH}}/pkg/gomobile
|
|
WORK=$WORK
|
|
mkdir -p $WORK/lib/armeabi-v7a
|
|
GOOS=android GOARCH=arm CC=$NDK_PATH/toolchains/llvm/prebuilt/{{.NDKARCH}}/bin/armv7a-linux-androideabi16-clang CXX=$NDK_PATH/toolchains/llvm/prebuilt/{{.NDKARCH}}/bin/armv7a-linux-androideabi16-clang++ CGO_ENABLED=1 GOARM=7 go build -tags tag1 -x -buildmode=c-shared -o $WORK/lib/armeabi-v7a/libbasic.so golang.org/x/mobile/example/basic
|
|
`))
|
|
|
|
func TestParseBuildTargetFlag(t *testing.T) {
|
|
archs := strings.Join(allArchs, ",")
|
|
|
|
tests := []struct {
|
|
in string
|
|
wantErr bool
|
|
wantOS string
|
|
wantArchs string
|
|
}{
|
|
{"android", false, "android", archs},
|
|
{"android,android/arm", false, "android", archs},
|
|
{"android/arm", false, "android", "arm"},
|
|
|
|
{"ios", false, "darwin", archs},
|
|
{"ios,ios/arm", false, "darwin", archs},
|
|
{"ios/arm", false, "darwin", "arm"},
|
|
{"ios/amd64", false, "darwin", "amd64"},
|
|
|
|
{"", true, "", ""},
|
|
{"linux", true, "", ""},
|
|
{"android/x86", true, "", ""},
|
|
{"android/arm5", true, "", ""},
|
|
{"ios/mips", true, "", ""},
|
|
{"android,ios", true, "", ""},
|
|
{"ios,android", true, "", ""},
|
|
}
|
|
|
|
for _, tc := range tests {
|
|
gotOS, gotArchs, err := parseBuildTarget(tc.in)
|
|
if tc.wantErr {
|
|
if err == nil {
|
|
t.Errorf("-target=%q; want error, got (%q, %q, nil)", tc.in, gotOS, gotArchs)
|
|
}
|
|
continue
|
|
}
|
|
if err != nil || gotOS != tc.wantOS || strings.Join(gotArchs, ",") != tc.wantArchs {
|
|
t.Errorf("-target=%q; want (%v, [%v], nil), got (%q, %q, %v)",
|
|
tc.in, tc.wantOS, tc.wantArchs, gotOS, gotArchs, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestRegexImportGolangXPackage(t *testing.T) {
|
|
tests := []struct {
|
|
in string
|
|
want string
|
|
wantLen int
|
|
}{
|
|
{"ffffffff t golang.org/x/mobile", "golang.org/x/mobile", 2},
|
|
{"ffffffff t github.com/example/repo/vendor/golang.org/x/mobile", "golang.org/x/mobile", 2},
|
|
{"ffffffff t github.com/example/golang.org/x/mobile", "", 0},
|
|
{"ffffffff t github.com/example/repo", "", 0},
|
|
{"ffffffff t github.com/example/repo/vendor", "", 0},
|
|
}
|
|
|
|
for _, tc := range tests {
|
|
res := nmRE.FindStringSubmatch(tc.in)
|
|
if len(res) != tc.wantLen {
|
|
t.Errorf("nmRE returned unexpected result for %q: want len(res) = %d, got %d",
|
|
tc.in, tc.wantLen, len(res))
|
|
continue
|
|
}
|
|
if tc.wantLen == 0 {
|
|
continue
|
|
}
|
|
if res[1] != tc.want {
|
|
t.Errorf("nmRE returned unexpected result. want (%v), got (%v)",
|
|
tc.want, res[1])
|
|
}
|
|
}
|
|
}
|