| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- // 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"
- "os/exec"
- "path/filepath"
- "runtime"
- "strings"
- "testing"
- "text/template"
- )
- var gopath string
- func TestInit(t *testing.T) {
- if runtime.GOOS == "android" || runtime.GOOS == "ios" {
- t.Skipf("not available on %s", runtime.GOOS)
- }
- if _, err := exec.LookPath("diff"); err != nil {
- t.Skip("command diff not found, skipping")
- }
- buf := new(bytes.Buffer)
- gopathorig := os.Getenv("GOPATH")
- defer func() {
- xout = os.Stderr
- buildN = false
- buildX = false
- os.Setenv("GOPATH", gopathorig)
- }()
- xout = buf
- buildN = true
- buildX = true
- // Test that first GOPATH element is chosen correctly.
- var err error
- gopath, err = os.MkdirTemp("", "gomobile-test")
- if err != nil {
- t.Fatal(err)
- }
- paths := []string{gopath, "/path2", "/path3"}
- if goos == "windows" {
- gopath = filepath.ToSlash(`C:\GOPATH1`)
- paths = []string{gopath, `C:\PATH2`, `C:\PATH3`}
- }
- os.Setenv("GOPATH", strings.Join(paths, string(os.PathListSeparator)))
- os.Setenv("GOROOT_BOOTSTRAP", "go1.4")
- if goos == "windows" {
- os.Setenv("HOMEDRIVE", "C:")
- }
- emptymod, err := os.MkdirTemp("", "gomobile-test")
- if err != nil {
- t.Fatal(err)
- }
- defer os.RemoveAll(emptymod)
- // Create go.mod, but without Go files.
- f, err := os.Create(filepath.Join(emptymod, "go.mod"))
- if err != nil {
- t.Fatal(err)
- }
- defer f.Close()
- if _, err := f.WriteString("module example.com/m\n"); err != nil {
- t.Fatal(err)
- }
- if err := f.Sync(); err != nil {
- t.Fatal(err)
- }
- dirs := []struct {
- dir string
- name string
- }{
- {
- dir: ".",
- name: "current",
- },
- {
- dir: emptymod,
- name: "emptymod",
- },
- }
- for _, dir := range dirs {
- dir := dir
- t.Run(dir.name, func(t *testing.T) {
- wd, err := os.Getwd()
- if err != nil {
- t.Fatal(err)
- }
- if err := os.Chdir(dir.dir); err != nil {
- t.Fatal(err)
- }
- defer os.Chdir(wd)
- if err := runInit(cmdInit); err != nil {
- t.Log(buf.String())
- t.Fatal(err)
- }
- if dir.name == "emptymod" {
- return
- }
- diff, err := diffOutput(buf.String(), initTmpl)
- if err != nil {
- t.Fatalf("computing diff failed: %v", err)
- }
- if diff != "" {
- t.Errorf("unexpected output:\n%s", diff)
- }
- })
- }
- }
- func diffOutput(got string, wantTmpl *template.Template) (string, error) {
- got = filepath.ToSlash(got)
- wantBuf := new(bytes.Buffer)
- data, err := defaultOutputData("")
- if err != nil {
- return "", err
- }
- if err := wantTmpl.Execute(wantBuf, data); err != nil {
- return "", err
- }
- want := wantBuf.String()
- if got != want {
- return diff(got, want)
- }
- return "", nil
- }
- type outputData struct {
- GOOS string
- GOARCH string
- GOPATH string
- NDKARCH string
- EXE string // .extension for executables. (ex. ".exe" for windows)
- Xproj string
- Xcontents string
- Xinfo infoplistTmplData
- }
- func defaultOutputData(teamID string) (outputData, error) {
- projPbxproj := new(bytes.Buffer)
- if err := projPbxprojTmpl.Execute(projPbxproj, projPbxprojTmplData{
- TeamID: teamID,
- }); err != nil {
- return outputData{}, err
- }
- data := outputData{
- GOOS: goos,
- GOARCH: goarch,
- GOPATH: gopath,
- NDKARCH: archNDK(),
- Xproj: projPbxproj.String(),
- Xcontents: contentsJSON,
- Xinfo: infoplistTmplData{BundleID: "org.golang.todo.basic", Name: "Basic"},
- }
- if goos == "windows" {
- data.EXE = ".exe"
- }
- return data, nil
- }
- var initTmpl = template.Must(template.New("output").Parse(`GOMOBILE={{.GOPATH}}/pkg/gomobile
- rm -r -f "$GOMOBILE"
- mkdir -p $GOMOBILE
- WORK={{.GOPATH}}/pkg/gomobile/work
- GOMODCACHE={{.GOPATH}}/pkg/mod go install -x golang.org/x/mobile/cmd/gobind@latest
- cp $OPENAL_PATH/include/AL/al.h $GOMOBILE/include/AL/al.h
- mkdir -p $GOMOBILE/include/AL
- cp $OPENAL_PATH/include/AL/alc.h $GOMOBILE/include/AL/alc.h
- mkdir -p $GOMOBILE/include/AL
- mkdir -p $WORK/build/armeabi
- PWD=$WORK/build/armeabi cmake $OPENAL_PATH -DCMAKE_TOOLCHAIN_FILE=$OPENAL_PATH/XCompile-Android.txt -DHOST=armv7a-linux-androideabi16
- PWD=$WORK/build/armeabi $NDK_PATH/prebuilt/{{.NDKARCH}}/bin/make
- cp $WORK/build/armeabi/libopenal.so $GOMOBILE/lib/armeabi-v7a/libopenal.so
- mkdir -p $GOMOBILE/lib/armeabi-v7a
- mkdir -p $WORK/build/arm64
- PWD=$WORK/build/arm64 cmake $OPENAL_PATH -DCMAKE_TOOLCHAIN_FILE=$OPENAL_PATH/XCompile-Android.txt -DHOST=aarch64-linux-android21
- PWD=$WORK/build/arm64 $NDK_PATH/prebuilt/{{.NDKARCH}}/bin/make
- cp $WORK/build/arm64/libopenal.so $GOMOBILE/lib/arm64-v8a/libopenal.so
- mkdir -p $GOMOBILE/lib/arm64-v8a
- mkdir -p $WORK/build/x86
- PWD=$WORK/build/x86 cmake $OPENAL_PATH -DCMAKE_TOOLCHAIN_FILE=$OPENAL_PATH/XCompile-Android.txt -DHOST=i686-linux-android16
- PWD=$WORK/build/x86 $NDK_PATH/prebuilt/{{.NDKARCH}}/bin/make
- cp $WORK/build/x86/libopenal.so $GOMOBILE/lib/x86/libopenal.so
- mkdir -p $GOMOBILE/lib/x86
- mkdir -p $WORK/build/x86_64
- PWD=$WORK/build/x86_64 cmake $OPENAL_PATH -DCMAKE_TOOLCHAIN_FILE=$OPENAL_PATH/XCompile-Android.txt -DHOST=x86_64-linux-android21
- PWD=$WORK/build/x86_64 $NDK_PATH/prebuilt/{{.NDKARCH}}/bin/make
- cp $WORK/build/x86_64/libopenal.so $GOMOBILE/lib/x86_64/libopenal.so
- mkdir -p $GOMOBILE/lib/x86_64
- rm -r -f "$WORK"
- `))
|