| // Copyright 2018 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 com.google.devtools.build.android; | |
| import static java.nio.file.StandardOpenOption.CREATE_NEW; | |
| import com.google.common.collect.ImmutableList; | |
| import com.google.common.jimfs.Jimfs; | |
| import com.google.common.truth.Truth; | |
| import java.io.IOException; | |
| import java.nio.charset.StandardCharsets; | |
| import java.nio.file.FileSystem; | |
| import java.nio.file.Files; | |
| import java.nio.file.Path; | |
| import org.junit.Before; | |
| import org.junit.Test; | |
| import org.junit.runner.RunWith; | |
| import org.junit.runners.JUnit4; | |
| /** Tests for the AndroidManifest class */ | |
| @RunWith(JUnit4.class) | |
| public class AndroidManifestTest { | |
| private FileSystem fileSystem; | |
| @Before | |
| public void setUp() throws Exception { | |
| fileSystem = Jimfs.newFileSystem(); | |
| } | |
| @Test | |
| public void parseMinSdkAndPackageName() throws Exception { | |
| final String packageName = "com.google.wooga"; | |
| final String minSdk = "26"; | |
| final AndroidManifest androidManifest = | |
| AndroidManifest.parseFrom(manifest(packageName, minSdk).write(fileSystem.getPath("tmp"))); | |
| Truth.assertThat(androidManifest).isEqualTo(AndroidManifest.of(packageName, minSdk)); | |
| } | |
| @Test | |
| public void parseMissingMinSdk() throws Exception { | |
| final String packageName = "com.google.wooga"; | |
| final AndroidManifest androidManifest = | |
| AndroidManifest.parseFrom(manifest(packageName).write(fileSystem.getPath("tmp"))); | |
| Truth.assertThat(androidManifest).isEqualTo(AndroidManifest.of(packageName, "1")); | |
| } | |
| @Test | |
| public void writeDummyManifestWithoutPlaceholdersNoMinSdk() throws Exception { | |
| final String packageName = "${applicationId}.wooga"; | |
| final String packageForR = "com.google.android.wooga"; | |
| final AndroidManifest androidManifest = | |
| AndroidManifest.parseFrom(manifest(packageName).write(fileSystem.getPath("tmp"))); | |
| Truth.assertThat( | |
| Files.readAllLines( | |
| androidManifest.writeDummyManifestForAapt( | |
| fileSystem.getPath("dummy-manifest"), packageForR), | |
| StandardCharsets.UTF_8)) | |
| .containsExactly( | |
| "<?xml version='1.0' encoding='utf-8'?>", | |
| "<manifest xmlns:android='http://schemas.android.com/apk/res/android'", | |
| "package='com.google.android.wooga'>", | |
| "<application/>", | |
| "<uses-sdk android:minSdkVersion='1'/>", | |
| "</manifest>") | |
| .inOrder(); | |
| } | |
| @Test | |
| public void writeDummyManifestWithoutPlaceholdersAndMinSdk() throws Exception { | |
| final String packageName = "${applicationId}.wooga"; | |
| final String packageForR = "com.google.android.wooga"; | |
| final AndroidManifest androidManifest = | |
| AndroidManifest.parseFrom(manifest(packageName, "26").write(fileSystem.getPath("tmp"))); | |
| Truth.assertThat( | |
| Files.readAllLines( | |
| androidManifest.writeDummyManifestForAapt( | |
| fileSystem.getPath("dummy-manifest"), packageForR), | |
| StandardCharsets.UTF_8)) | |
| .containsExactly( | |
| "<?xml version='1.0' encoding='utf-8'?>", | |
| "<manifest xmlns:android='http://schemas.android.com/apk/res/android'", | |
| "package='com.google.android.wooga'>", | |
| "<application/>", | |
| "<uses-sdk android:minSdkVersion='26'/>", | |
| "</manifest>") | |
| .inOrder(); | |
| } | |
| private static Manifest manifest(String pkg) { | |
| return manifest(pkg, ""); | |
| } | |
| private static Manifest manifest(String pkg, String minSdk, String... lines) { | |
| return parent -> | |
| Files.write( | |
| Files.createDirectories(parent).resolve("AndroidManifest.xml"), | |
| ImmutableList.<String>builder() | |
| .add( | |
| "<?xml version='1.0' encoding='utf-8'?>", | |
| "<manifest", | |
| " xmlns:android='http://schemas.android.com/apk/res/android'", | |
| String.format(" package='%s'>", pkg), | |
| "<application>", | |
| (minSdk == null || minSdk.isEmpty()) | |
| ? "" | |
| : String.format("<uses-sdk android:minSdkVersion='%s'/>", minSdk)) | |
| .add(lines) | |
| .add("</application>", "</manifest>") | |
| .build(), | |
| CREATE_NEW); | |
| } | |
| private interface Manifest { | |
| Path write(Path parent) throws IOException; | |
| } | |
| } |