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