2
0
mirror of synced 2025-02-23 23:08:14 +00:00
mobile/cmd/gomobile/binary_xml_test.go
Changkun Ou 1fde1d6c3c cmd/gomobile: remove unused binary xml
The removed binary XML was introduced in CL 2653 for the TestBinaryXML.
But in CL 16150, the test was reworked and the binary XML was never
used since then.

Delete it.

Change-Id: I80fd90264142bdcd4a6d88a377e36cba64088a5a
Reviewed-on: https://go-review.googlesource.com/c/mobile/+/346389
Reviewed-by: Hajime Hoshi <hajimehoshi@gmail.com>
Run-TryBot: Hajime Hoshi <hajimehoshi@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Dmitri Shuralyov <dmitshur@golang.org>
2021-09-01 02:52:45 +00:00

250 lines
5.6 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 (
"archive/zip"
"bytes"
"flag"
"fmt"
"io/ioutil"
"log"
"os"
"os/exec"
"path/filepath"
"testing"
)
var dump = flag.Bool("dump", false, "dump junk.bin binary output")
var (
origSortPool = sortPool
origSortAttr = sortAttr
)
func TestBinaryXML(t *testing.T) {
sortPool, sortAttr = sortToMatchTest, sortAttrToMatchTest
defer func() { sortPool, sortAttr = origSortPool, origSortAttr }()
bin, err := binaryXML(bytes.NewBufferString(fmt.Sprintf(input, "")))
if err != nil {
t.Fatal(err)
}
if *dump {
if err := ioutil.WriteFile("junk.bin", bin, 0660); err != nil {
t.Fatal(err)
}
}
if exec.Command("which", "aapt").Run() != nil {
t.Skip("command aapt not found, skipping")
}
apiPath, err := androidAPIPath()
if err != nil {
t.Fatal(err)
}
androidJar := filepath.Join(apiPath, "android.jar")
tmpdir, err := ioutil.TempDir("", "gomobile-test-")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(tmpdir)
buf := new(bytes.Buffer)
zw := zip.NewWriter(buf)
zf, err := zw.Create("AndroidManifest.xml")
if err != nil {
t.Fatal(err)
}
if _, err := zf.Write(bin); err != nil {
t.Fatal(err)
}
if err := zw.Close(); err != nil {
t.Fatal(err)
}
mblapk := filepath.Join(tmpdir, "mbl.apk")
if err := ioutil.WriteFile(mblapk, buf.Bytes(), 0755); err != nil {
t.Fatal(err)
}
got, err := exec.Command("aapt", "d", "xmltree", mblapk, "AndroidManifest.xml").Output()
if err != nil {
t.Fatal(err)
}
manifest := filepath.Join(tmpdir, "AndroidManifest.xml")
inp := fmt.Sprintf(input, "<uses-sdk android:minSdkVersion=\"15\" />")
if err := ioutil.WriteFile(manifest, []byte(inp), 0755); err != nil {
t.Fatal(err)
}
sdkapk := filepath.Join(tmpdir, "sdk.apk")
if _, err := exec.Command("aapt", "p", "-M", manifest, "-I", androidJar, "-F", sdkapk).Output(); err != nil {
t.Fatal(err)
}
sdkout, err := exec.Command("aapt", "d", "xmltree", sdkapk, "AndroidManifest.xml").Output()
if err != nil {
t.Fatal(err)
}
if *dump {
b, err := ioutil.ReadFile(sdkapk)
if err != nil {
t.Fatal(err)
}
if err := ioutil.WriteFile("junk.sdk.apk", b, 0755); err != nil {
t.Fatal(err)
}
}
// manifests contain platformBuildVersionCode and platformBuildVersionName
// which are not present in gomobile output.
var fo [][]byte
for _, line := range bytes.Split(sdkout, []byte{'\n'}) {
if bytes.Contains(line, []byte("platformBuildVersionCode")) || bytes.Contains(line, []byte("platformBuildVersionName")) {
continue
}
fo = append(fo, line)
}
want := bytes.Join(fo, []byte{'\n'})
if !bytes.Equal(want, got) {
t.Fatalf("output does not match\nWANT\n%s\nGOT\n%s\n", want, got)
}
}
// The output of the Android encoder seems to be arbitrary. So for testing,
// we sort the string pool order to match the output we have seen.
func sortToMatchTest(p *binStringPool) {
var names = []string{
"versionCode",
"versionName",
"minSdkVersion",
"theme",
"label",
"hasCode",
"debuggable",
"name",
"screenOrientation",
"configChanges",
"value",
"android",
"http://schemas.android.com/apk/res/android",
"",
"package",
"manifest",
"com.zentus.balloon",
"1.0",
"uses-sdk",
"application",
"Balloon世界",
"activity",
"android.app.NativeActivity",
"Balloon",
"meta-data",
"android.app.lib_name",
"balloon",
"intent-filter",
"\there is some text\n",
"action",
"android.intent.action.MAIN",
"category",
"android.intent.category.LAUNCHER",
}
s := make([]*bstring, 0)
m := make(map[string]*bstring)
for _, str := range names {
bstr := p.m[str]
if bstr == nil {
log.Printf("missing %q", str)
continue
}
bstr.ind = uint32(len(s))
s = append(s, bstr)
m[str] = bstr
delete(p.m, str)
}
// add unexpected strings
for str, bstr := range p.m {
log.Printf("unexpected %q", str)
bstr.ind = uint32(len(s))
s = append(s, bstr)
}
p.s = s
p.m = m
}
func sortAttrToMatchTest(e *binStartElement, p *binStringPool) {
order := []string{
"versionCode",
"versionName",
"versionPackage",
"theme",
"label",
"name",
"screenOrientation",
"configChanges",
}
ordered := make([]*binAttr, len(order))
outer:
for i, n := range order {
for j, a := range e.attr {
if a != nil && a.name.str == n {
ordered[i] = a
e.attr[j] = nil
continue outer
}
}
}
var attr []*binAttr
for _, a := range ordered {
if a != nil {
attr = append(attr, a)
}
}
for _, a := range e.attr {
if a != nil {
attr = append(attr, a)
}
}
e.attr = attr
}
const input = `<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2014 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.
-->
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zentus.balloon"
android:versionCode="1"
android:versionName="1.0">
%s
<application android:label="Balloon世界" android:hasCode="false" android:debuggable="true">
<activity android:name="android.app.NativeActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:label="Balloon"
android:screenOrientation="portrait"
android:configChanges="orientation|keyboardHidden">
<meta-data android:name="android.app.lib_name" android:value="balloon" />
<intent-filter>
here is some text
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>`