aboutsummaryrefslogtreecommitdiff
path: root/src/tools/ak/generatemanifest/generatemanifest_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/ak/generatemanifest/generatemanifest_test.go')
-rw-r--r--src/tools/ak/generatemanifest/generatemanifest_test.go220
1 files changed, 220 insertions, 0 deletions
diff --git a/src/tools/ak/generatemanifest/generatemanifest_test.go b/src/tools/ak/generatemanifest/generatemanifest_test.go
new file mode 100644
index 0000000..ade3d4e
--- /dev/null
+++ b/src/tools/ak/generatemanifest/generatemanifest_test.go
@@ -0,0 +1,220 @@
+// Copyright 2022 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Package generatemanifest is a command line tool to generate an empty AndroidManifest
+package generatemanifest
+
+import (
+ "io"
+ "strings"
+ "testing"
+
+ "github.com/google/go-cmp/cmp"
+)
+
+type fakeFile struct {
+ reader *strings.Reader
+}
+
+func (f fakeFile) Read(b []byte) (int, error) {
+ return f.reader.Read(b)
+}
+
+func (f fakeFile) Close() error {
+ return nil
+}
+
+func TestExtractMinSdk(t *testing.T) {
+ tests := []struct {
+ name string
+ manifests []*strings.Reader
+ defaultMinSdk int
+ expectedMinSdk int
+ }{
+ {
+ name: "one manifest",
+ manifests: []*strings.Reader{
+ strings.NewReader(
+ `<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.default">
+ <uses-sdk android:minSdkVersion="20" />
+</manifest>`)},
+ defaultMinSdk: 14,
+ expectedMinSdk: 20,
+ },
+ {
+ name: "one manifest, lower then default min sdk",
+ manifests: []*strings.Reader{
+ strings.NewReader(
+ `<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.default">
+ <uses-sdk android:minSdkVersion="20" />
+</manifest>`)},
+ defaultMinSdk: 30,
+ expectedMinSdk: 30,
+ },
+ {
+ name: "multiple manifests",
+ manifests: []*strings.Reader{
+ strings.NewReader(
+ `<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.default">
+ <uses-sdk android:minSdkVersion="20" />
+</manifest>`),
+ strings.NewReader(
+ `<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.default">
+ <uses-sdk android:minSdkVersion="5" />
+</manifest>`),
+ strings.NewReader(
+ `<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.default">
+ <uses-sdk android:minSdkVersion="30" />
+</manifest>`),
+ },
+ defaultMinSdk: 14,
+ expectedMinSdk: 30,
+ },
+ {
+ name: "multiple manifests, all lower than default min sdk",
+ manifests: []*strings.Reader{
+ strings.NewReader(
+ `<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.default">
+ <uses-sdk android:minSdkVersion="1" />
+</manifest>`),
+ strings.NewReader(
+ `<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.default">
+ <uses-sdk android:minSdkVersion="2" />
+</manifest>`),
+ strings.NewReader(
+ `<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.default">
+ <uses-sdk android:minSdkVersion="3" />
+</manifest>`),
+ },
+ defaultMinSdk: 4,
+ expectedMinSdk: 4,
+ },
+ }
+ for _, tc := range tests {
+ t.Run(tc.name, func(t *testing.T) {
+ files := make([]io.ReadCloser, 0, len(tc.manifests))
+ for _, f := range tc.manifests {
+ file := fakeFile{reader: f}
+ file.reader.Seek(0, 0)
+ files = append(files, file)
+ }
+ minSdk, err := extractMinSdk(files, tc.defaultMinSdk)
+ if err != nil {
+ t.Fatalf("extractMinSdk(%v, %d) failed with err: %v", files, tc.defaultMinSdk, err)
+ }
+ if diff := cmp.Diff(tc.expectedMinSdk, minSdk); diff != "" {
+ t.Errorf("extractMinSdkFromManifest(%v) returned diff (-want, +got):\n%v", files, diff)
+ }
+ })
+ }
+
+}
+
+func TestExtractMinSdkFromManifest(t *testing.T) {
+ tests := []struct {
+ name string
+ manifest *strings.Reader
+ expectedMinSdk int
+ }{
+ {
+ name: "minimal manifest",
+ manifest: strings.NewReader(
+ `<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.default">
+ <uses-sdk android:minSdkVersion="1" />
+ <application/>
+</manifest>`),
+ expectedMinSdk: 1,
+ },
+ {
+ name: "manifest with placeholder",
+ manifest: strings.NewReader(
+ `<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.default">
+ <uses-sdk android:minSdkVersion="${minSdkVersion}" />
+ <application/>
+</manifest>`),
+ expectedMinSdk: 0,
+ },
+ {
+ name: "empty manifest",
+ manifest: strings.NewReader(
+ `<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.default">
+</manifest>`),
+ expectedMinSdk: 0,
+ },
+ {
+ name: "manifest with various elements",
+ manifest: strings.NewReader(
+ `<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.default">
+ <uses-permission android:name="android.permission.INTERNET" />
+ <application android:label="@string/app_name"
+ android:name="com.default.SomeApp"
+ android:icon="@drawable/some_icon"
+ android:theme="@style/a_theme"
+ android:banner="@drawable/banner">
+ <service android:name="com.default.MyService"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="com.default.IntentFilter" />
+ </intent-filter>
+ </service>
+ </application>
+ <uses-sdk android:minSdkVersion="25" />
+</manifest>`),
+ expectedMinSdk: 25,
+ },
+ }
+ for _, tc := range tests {
+ t.Run(tc.name, func(t *testing.T) {
+ file := fakeFile{reader: tc.manifest}
+ file.reader.Seek(0, 0)
+ results := make(chan result)
+ go func(results chan result) {
+ res := extractMinSdkFromManifest(file)
+ results <- res
+ }(results)
+ result := <-results
+ if result.err != nil {
+ t.Fatalf("extractMinSdkFromManifest(%v) failed with err: %v", file, result.err)
+ }
+ if diff := cmp.Diff(tc.expectedMinSdk, result.minSdk); diff != "" {
+ t.Errorf("extractMinSdkFromManifest(%v) returned diff (-want, +got):\n%v", file, diff)
+ }
+ })
+ }
+
+}