2
0
mirror of synced 2025-02-25 15:55:27 +00:00
mobile/cmd/gomobile/init_test.go
Changkun Ou a0f9ae51e3 cmd/gomobile: allow tests to pass on ios builder
There are several tests are skipped for Android but they may still be
tested on iOS. This will leads to trybot failure.

This CL skips those tests and allow them to pass on iOS.

Furthermore, deprecated C function warning are promoted to errors on
builders, this CL also fixes a deprecated asl_log for iOS in mobileinit.

Change-Id: Ie9da57a20dd75ef3d29b393e30aef01051bab454
Reviewed-on: https://go-review.googlesource.com/c/mobile/+/346391
Reviewed-by: Hajime Hoshi <hajimehoshi@gmail.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
Run-TryBot: Hajime Hoshi <hajimehoshi@gmail.com>
Trust: Dmitri Shuralyov <dmitshur@golang.org>
2021-09-01 15:13:16 +00:00

205 lines
5.1 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"
"io/ioutil"
"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 = ioutil.TempDir("", "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 := ioutil.TempDir("", "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() (outputData, error) {
projPbxproj := new(bytes.Buffer)
if err := projPbxprojTmpl.Execute(projPbxproj, projPbxprojTmplData{
BitcodeEnabled: bitcodeEnabled,
}); err != nil {
return outputData{}, err
}
data := outputData{
GOOS: goos,
GOARCH: goarch,
GOPATH: gopath,
NDKARCH: archNDK(),
Xproj: string(projPbxproj.Bytes()),
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
go install -x golang.org/x/mobile/cmd/gobind
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"
`))