blob: 01b6b9a15efba260e856dd960c4fda5a15fd315f [file] [log] [blame]
/*
* Copyright 2013-present Facebook, Inc.
*
* 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.facebook.buck.android;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.fail;
import com.facebook.buck.io.MoreFiles;
import com.facebook.buck.io.ProjectFilesystem;
import com.facebook.buck.util.PropertyFinder;
import com.facebook.buck.util.FakePropertyFinder;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import org.easymock.EasyMockSupport;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
public class DefaultAndroidDirectoryResolverTest extends EasyMockSupport {
@Rule
public TemporaryFolder tmpDir = new TemporaryFolder();
@Test
public void testFindAndroidNdkDirEmpty() {
PropertyFinder propertyFinder = new FakePropertyFinder(
ImmutableMap.of(
"ndk.dir", Optional.<Path>absent(),
"ndk.repository", Optional.<Path>absent()));
DefaultAndroidDirectoryResolver androidDirectoryResolver =
new DefaultAndroidDirectoryResolver(
new ProjectFilesystem(tmpDir.getRoot().toPath()),
Optional.<String>absent(),
propertyFinder);
assertEquals(Optional.<Path>absent(), androidDirectoryResolver.findAndroidNdkDir());
}
@Test
public void testFindAndroidNdkDir() throws IOException {
File ndkDir = tmpDir.newFolder("ndk-dir");
File releaseFile = tmpDir.newFile("ndk-dir/RELEASE.TXT");
MoreFiles.writeLinesToFile(ImmutableList.of("r9d"), releaseFile);
PropertyFinder propertyFinder = new FakePropertyFinder(
ImmutableMap.of(
"ndk.dir", Optional.of(ndkDir.toPath()),
"ndk.repository", Optional.<Path>absent()));
DefaultAndroidDirectoryResolver androidDirectoryResolver =
new DefaultAndroidDirectoryResolver(
new ProjectFilesystem(tmpDir.getRoot().toPath()),
Optional.of("r9d"),
propertyFinder);
assertEquals(Optional.of(ndkDir.toPath()),
androidDirectoryResolver.findAndroidNdkDir());
}
@Test
public void testFindAndroidNdkDirAbsent() throws IOException {
File ndkDir = tmpDir.newFolder("ndk-dir");
File releaseFile = tmpDir.newFile("ndk-dir/RELEASE.TXT");
MoreFiles.writeLinesToFile(ImmutableList.of("r9e"), releaseFile);
PropertyFinder propertyFinder = new FakePropertyFinder(
ImmutableMap.of(
"ndk.dir", Optional.of(ndkDir.toPath()),
"ndk.repository", Optional.<Path>absent()));
DefaultAndroidDirectoryResolver androidDirectoryResolver =
new DefaultAndroidDirectoryResolver(
new ProjectFilesystem(tmpDir.getRoot().toPath()),
Optional.<String>absent(),
propertyFinder);
assertEquals(Optional.of(ndkDir.toPath()),
androidDirectoryResolver.findAndroidNdkDir());
}
@Test
public void testFindAndroidNdkDirThrowOnFailedRead() throws IOException {
File ndkDir = tmpDir.newFolder("ndk-dir");
PropertyFinder propertyFinder = new FakePropertyFinder(
ImmutableMap.of(
"ndk.dir", Optional.of(ndkDir.toPath()),
"ndk.repository", Optional.<Path>absent()));
DefaultAndroidDirectoryResolver androidDirectoryResolver =
new DefaultAndroidDirectoryResolver(
new ProjectFilesystem(tmpDir.getRoot().toPath()),
Optional.<String>absent(),
propertyFinder);
try {
androidDirectoryResolver.findAndroidNdkDir();
fail("Should have thrown an exception for malformed NDK directory.");
} catch (Exception e) {
assertEquals("Failed to read NDK version from " + ndkDir.getAbsolutePath(),
e.getMessage());
}
}
@Test
public void testFindAndroidNdkDirThrowOnUsupportedVersion() throws IOException {
File ndkDir = tmpDir.newFolder("ndk-dir");
File releaseFile = tmpDir.newFile("ndk-dir/RELEASE.TXT");
MoreFiles.writeLinesToFile(ImmutableList.of("r9q"), releaseFile);
PropertyFinder propertyFinder = new FakePropertyFinder(
ImmutableMap.of(
"ndk.dir", Optional.of(ndkDir.toPath()),
"ndk.repository", Optional.<Path>absent()));
DefaultAndroidDirectoryResolver androidDirectoryResolver =
new DefaultAndroidDirectoryResolver(
new ProjectFilesystem(tmpDir.getRoot().toPath()),
Optional.of("r9e"),
propertyFinder);
try {
androidDirectoryResolver.findAndroidNdkDir();
fail("Should have thrown an exception for malformed NDK directory.");
} catch (Exception e) {
assertEquals("Supported NDK version is r9e but Buck is configured to use r9q with ndk.dir " +
"or ANDROID_NDK",
e.getMessage());
}
}
@Test
public void testFindAndroidNdkDirScanThrowsOnFail() throws IOException {
tmpDir.newFolder("ndk-dir-r9a");
tmpDir.newFolder("ndk-dir-r9b");
tmpDir.newFolder("ndk-dir-r9c");
File releaseFile = tmpDir.newFile("ndk-dir-r9c/RELEASE.TXT");
MoreFiles.writeLinesToFile(ImmutableList.of("r9c"), releaseFile);
PropertyFinder propertyFinder = new FakePropertyFinder(
ImmutableMap.of(
"ndk.dir", Optional.<Path>absent(),
"ndk.repository", Optional.of(tmpDir.getRoot().toPath())));
DefaultAndroidDirectoryResolver androidDirectoryResolver =
new DefaultAndroidDirectoryResolver(
new ProjectFilesystem(tmpDir.getRoot().toPath()),
Optional.of("r9e"),
propertyFinder);
try {
androidDirectoryResolver.findAndroidNdkDir();
fail("Should have thrown an exception for malformed NDK directory.");
} catch (Exception e) {
assertEquals("Couldn't find a valid NDK under " + tmpDir.getRoot().getAbsolutePath(),
e.getMessage());
}
}
@Test
public void testFindAndroidNdkDirScanTakesNewest() throws IOException {
tmpDir.newFolder("ndk-dir-r9a");
tmpDir.newFolder("ndk-dir-r9b");
tmpDir.newFolder("ndk-dir-r9c");
File releaseFile = tmpDir.newFile("ndk-dir-r9a/RELEASE.TXT");
MoreFiles.writeLinesToFile(ImmutableList.of("r9a"), releaseFile);
releaseFile = tmpDir.newFile("ndk-dir-r9b/RELEASE.TXT");
MoreFiles.writeLinesToFile(ImmutableList.of("r9b"), releaseFile);
releaseFile = tmpDir.newFile("ndk-dir-r9c/RELEASE.TXT");
MoreFiles.writeLinesToFile(ImmutableList.of("r9c"), releaseFile);
PropertyFinder propertyFinder = new FakePropertyFinder(
ImmutableMap.of(
"ndk.dir", Optional.<Path>absent(),
"ndk.repository", Optional.of(tmpDir.getRoot().toPath())));
DefaultAndroidDirectoryResolver androidDirectoryResolver =
new DefaultAndroidDirectoryResolver(
new ProjectFilesystem(tmpDir.getRoot().toPath()),
Optional.<String>absent(),
propertyFinder);
assertEquals(Optional.of(releaseFile.toPath().getParent()),
androidDirectoryResolver.findAndroidNdkDir());
}
@Test
public void notEqualWhenNdkIsDifferent() throws IOException {
tmpDir.newFolder("ndk-dir-r9a");
tmpDir.newFolder("ndk-dir-r9b");
File releaseFile = tmpDir.newFile("ndk-dir-r9a/RELEASE.TXT");
MoreFiles.writeLinesToFile(ImmutableList.of("r9a"), releaseFile);
releaseFile = tmpDir.newFile("ndk-dir-r9b/RELEASE.TXT");
MoreFiles.writeLinesToFile(ImmutableList.of("r9b"), releaseFile);
PropertyFinder propertyFinder = new FakePropertyFinder(
ImmutableMap.of(
"ndk.dir", Optional.<Path>absent(),
"ndk.repository", Optional.of(tmpDir.getRoot().toPath())));
DefaultAndroidDirectoryResolver androidDirectoryResolver1 =
new DefaultAndroidDirectoryResolver(
new ProjectFilesystem(tmpDir.getRoot().toPath()),
Optional.of("r9a"),
propertyFinder);
DefaultAndroidDirectoryResolver androidDirectoryResolver2 =
new DefaultAndroidDirectoryResolver(
new ProjectFilesystem(tmpDir.getRoot().toPath()),
Optional.of("r9b"),
propertyFinder);
assertNotEquals(androidDirectoryResolver1, androidDirectoryResolver2);
}
@Test
public void testFindAndroidNdkDirScanTakesVersion() throws IOException {
tmpDir.newFolder("ndk-dir-r9a");
Path expectedPath = tmpDir.newFolder("ndk-dir-r9b").toPath();
tmpDir.newFolder("ndk-dir-r9c");
File releaseFile = tmpDir.newFile("ndk-dir-r9a/RELEASE.TXT");
MoreFiles.writeLinesToFile(ImmutableList.of("r9a"), releaseFile);
releaseFile = tmpDir.newFile("ndk-dir-r9b/RELEASE.TXT");
MoreFiles.writeLinesToFile(ImmutableList.of("r9b"), releaseFile);
releaseFile = tmpDir.newFile("ndk-dir-r9c/RELEASE.TXT");
MoreFiles.writeLinesToFile(ImmutableList.of("r9c"), releaseFile);
PropertyFinder propertyFinder = new FakePropertyFinder(
ImmutableMap.of(
"ndk.dir", Optional.<Path>absent(),
"ndk.repository", Optional.of(tmpDir.getRoot().toPath())));
DefaultAndroidDirectoryResolver androidDirectoryResolver =
new DefaultAndroidDirectoryResolver(
new ProjectFilesystem(tmpDir.getRoot().toPath()),
Optional.of("r9b"),
propertyFinder);
assertEquals(Optional.of(expectedPath),
androidDirectoryResolver.findAndroidNdkDir());
}
}