github.com/acrespo/mobile@v0.0.0-20190107162257-dc0771356504/cmd/gomobile/bind_test.go (about) 1 // Copyright 2015 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "bytes" 9 "os" 10 "path" 11 "path/filepath" 12 "strings" 13 "testing" 14 "text/template" 15 ) 16 17 func TestImportPackagesPathCleaning(t *testing.T) { 18 slashPath := "golang.org/x/mobile/example/bind/hello/" 19 pkgs, err := importPackages([]string{slashPath}) 20 if err != nil { 21 t.Fatal(err) 22 } 23 p := pkgs[0] 24 if c := path.Clean(slashPath); p.ImportPath != c { 25 t.Errorf("expected %s; got %s", c, p.ImportPath) 26 } 27 } 28 29 func TestBindAndroid(t *testing.T) { 30 androidHome := os.Getenv("ANDROID_HOME") 31 if androidHome == "" { 32 t.Skip("ANDROID_HOME not found, skipping bind") 33 } 34 platform, err := androidAPIPath() 35 if err != nil { 36 t.Skip("No android API platform found in $ANDROID_HOME, skipping bind") 37 } 38 platform = strings.Replace(platform, androidHome, "$ANDROID_HOME", -1) 39 40 defer func() { 41 xout = os.Stderr 42 buildN = false 43 buildX = false 44 buildO = "" 45 buildTarget = "" 46 bindJavaPkg = "" 47 }() 48 buildN = true 49 buildX = true 50 buildO = "asset.aar" 51 buildTarget = "android/arm" 52 53 tests := []struct { 54 javaPkg string 55 }{ 56 { 57 // Empty javaPkg 58 }, 59 { 60 javaPkg: "com.example.foo", 61 }, 62 } 63 for _, tc := range tests { 64 bindJavaPkg = tc.javaPkg 65 66 buf := new(bytes.Buffer) 67 xout = buf 68 gopath = filepath.SplitList(goEnv("GOPATH"))[0] 69 if goos == "windows" { 70 os.Setenv("HOMEDRIVE", "C:") 71 } 72 cmdBind.flag.Parse([]string{"golang.org/x/mobile/asset"}) 73 err := runBind(cmdBind) 74 if err != nil { 75 t.Log(buf.String()) 76 t.Fatal(err) 77 } 78 got := filepath.ToSlash(buf.String()) 79 80 data := struct { 81 outputData 82 AndroidPlatform string 83 JavaPkg string 84 }{ 85 outputData: defaultOutputData(), 86 AndroidPlatform: platform, 87 JavaPkg: tc.javaPkg, 88 } 89 90 wantBuf := new(bytes.Buffer) 91 if err := bindAndroidTmpl.Execute(wantBuf, data); err != nil { 92 t.Errorf("%+v: computing diff failed: %v", tc, err) 93 continue 94 } 95 96 diff, err := diff(got, wantBuf.String()) 97 if err != nil { 98 t.Errorf("%+v: computing diff failed: %v", tc, err) 99 continue 100 } 101 if diff != "" { 102 t.Errorf("%+v: unexpected output:\n%s", tc, diff) 103 } 104 } 105 } 106 107 func TestBindIOS(t *testing.T) { 108 if !xcodeAvailable() { 109 t.Skip("Xcode is missing") 110 } 111 defer func() { 112 xout = os.Stderr 113 buildN = false 114 buildX = false 115 buildO = "" 116 buildTarget = "" 117 bindPrefix = "" 118 }() 119 buildN = true 120 buildX = true 121 buildO = "Asset.framework" 122 buildTarget = "ios/arm" 123 124 tests := []struct { 125 prefix string 126 }{ 127 { 128 // empty prefix 129 }, 130 { 131 prefix: "Foo", 132 }, 133 } 134 for _, tc := range tests { 135 bindPrefix = tc.prefix 136 137 buf := new(bytes.Buffer) 138 xout = buf 139 gopath = filepath.SplitList(goEnv("GOPATH"))[0] 140 if goos == "windows" { 141 os.Setenv("HOMEDRIVE", "C:") 142 } 143 cmdBind.flag.Parse([]string{"golang.org/x/mobile/asset"}) 144 err := runBind(cmdBind) 145 if err != nil { 146 t.Log(buf.String()) 147 t.Fatal(err) 148 } 149 got := filepath.ToSlash(buf.String()) 150 151 data := struct { 152 outputData 153 Prefix string 154 }{ 155 outputData: defaultOutputData(), 156 Prefix: tc.prefix, 157 } 158 159 wantBuf := new(bytes.Buffer) 160 if err := bindIOSTmpl.Execute(wantBuf, data); err != nil { 161 t.Errorf("%+v: computing diff failed: %v", tc, err) 162 continue 163 } 164 165 diff, err := diff(got, wantBuf.String()) 166 if err != nil { 167 t.Errorf("%+v: computing diff failed: %v", tc, err) 168 continue 169 } 170 if diff != "" { 171 t.Errorf("%+v: unexpected output:\n%s", tc, diff) 172 } 173 } 174 } 175 176 var bindAndroidTmpl = template.Must(template.New("output").Parse(`GOMOBILE={{.GOPATH}}/pkg/gomobile 177 WORK=$WORK 178 GOOS=android CGO_ENABLED=1 gobind -lang=go,java -outdir=$WORK{{if .JavaPkg}} -javapkg={{.JavaPkg}}{{end}} golang.org/x/mobile/asset 179 GOOS=android GOARCH=arm CC=$GOMOBILE/ndk-toolchains/arm/bin/arm-linux-androideabi-clang CXX=$GOMOBILE/ndk-toolchains/arm/bin/arm-linux-androideabi-clang++ CGO_ENABLED=1 GOARM=7 GOPATH=$WORK:$GOPATH go build -x -buildmode=c-shared -o=$WORK/android/src/main/jniLibs/armeabi-v7a/libgojni.so gobind 180 PWD=$WORK/java javac -d $WORK/javac-output -source 1.7 -target 1.7 -bootclasspath {{.AndroidPlatform}}/android.jar *.java 181 jar c -C $WORK/javac-output . 182 `)) 183 184 var bindIOSTmpl = template.Must(template.New("output").Parse(`GOMOBILE={{.GOPATH}}/pkg/gomobile 185 WORK=$WORK 186 GOOS=darwin CGO_ENABLED=1 gobind -lang=go,objc -outdir=$WORK -tags=ios{{if .Prefix}} -prefix={{.Prefix}}{{end}} golang.org/x/mobile/asset 187 GOARM=7 GOOS=darwin GOARCH=arm CC=clang-iphoneos CXX=clang-iphoneos CGO_CFLAGS=-isysroot=iphoneos -miphoneos-version-min=6.1 -arch armv7 CGO_LDFLAGS=-isysroot=iphoneos -miphoneos-version-min=6.1 -arch armv7 CGO_ENABLED=1 GOPATH=$WORK:$GOPATH go build -tags ios -x -buildmode=c-archive -o $WORK/asset-arm.a gobind 188 rm -r -f "Asset.framework" 189 mkdir -p Asset.framework/Versions/A/Headers 190 ln -s A Asset.framework/Versions/Current 191 ln -s Versions/Current/Headers Asset.framework/Headers 192 ln -s Versions/Current/Asset Asset.framework/Asset 193 xcrun lipo -create -arch armv7 $WORK/asset-arm.a -o Asset.framework/Versions/A/Asset 194 cp $WORK/src/gobind/{{.Prefix}}Asset.objc.h Asset.framework/Versions/A/Headers/{{.Prefix}}Asset.objc.h 195 mkdir -p Asset.framework/Versions/A/Headers 196 cp $WORK/src/gobind/universe.objc.h Asset.framework/Versions/A/Headers/universe.objc.h 197 mkdir -p Asset.framework/Versions/A/Headers 198 cp $WORK/src/gobind/ref.h Asset.framework/Versions/A/Headers/ref.h 199 mkdir -p Asset.framework/Versions/A/Headers 200 mkdir -p Asset.framework/Versions/A/Headers 201 mkdir -p Asset.framework/Versions/A/Resources 202 ln -s Versions/Current/Resources Asset.framework/Resources 203 mkdir -p Asset.framework/Resources 204 mkdir -p Asset.framework/Versions/A/Modules 205 ln -s Versions/Current/Modules Asset.framework/Modules 206 `))