/*
* Copyright 2014-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.assertFalse;
import static org.junit.Assert.assertTrue;
import com.facebook.buck.testutil.integration.ProjectWorkspace;
import com.facebook.buck.testutil.integration.TemporaryPaths;
import com.facebook.buck.testutil.integration.TestDataHelper;
import com.google.common.io.CharStreams;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.junit.Rule;
import org.junit.Test;
public class GenAidlIntegrationTest {
@Rule public TemporaryPaths tmp = new TemporaryPaths();
@Rule public TemporaryPaths tmp2 = new TemporaryPaths();
@Test
public void buildingCleaningAndThenRebuildingFromCacheShouldWorkAsExpected()
throws InterruptedException, IOException {
AssumeAndroidPlatform.assumeSdkIsAvailable();
ProjectWorkspace workspace =
TestDataHelper.createProjectWorkspaceForScenario(this, "cached_build", tmp);
workspace.setUp();
workspace.enableDirCache();
// Populate the cache
ProjectWorkspace.ProcessResult result = workspace.runBuckBuild("//:android-lib");
result.assertSuccess();
result = workspace.runBuckCommand("clean");
result.assertSuccess();
// Now the cache is clean, do the build where we expect the results to come from the cache
result = workspace.runBuckBuild("//:android-lib");
result.assertSuccess();
}
@Test
public void rootDirectoryDoesntChangeBuild() throws InterruptedException, IOException {
AssumeAndroidPlatform.assumeSdkIsAvailable();
ProjectWorkspace workspace =
TestDataHelper.createProjectWorkspaceForScenario(this, "cached_build", tmp);
workspace.setUp();
Path outputOne = workspace.buildAndReturnOutput("//:AService");
ProjectWorkspace workspaceTwo =
TestDataHelper.createProjectWorkspaceForScenario(this, "cached_build", tmp2);
workspaceTwo.setUp();
Path outputTwo = workspaceTwo.buildAndReturnOutput("//:AService");
assertEquals(
workspace.getBuildLog().getRuleKey("//:AService"),
workspaceTwo.getBuildLog().getRuleKey("//:AService"));
try (ZipFile zipOne = new ZipFile(outputOne.toFile());
ZipFile zipTwo = new ZipFile(outputTwo.toFile())) {
Enumeration<? extends ZipEntry> entriesOne = zipOne.entries(), entriesTwo = zipTwo.entries();
while (entriesOne.hasMoreElements()) {
assertTrue(entriesTwo.hasMoreElements());
ZipEntry entryOne = entriesOne.nextElement(), entryTwo = entriesTwo.nextElement();
// Compare data first, otherwise crc difference will cause a failure and you don't get to
// see the actual difference.
assertEquals(zipEntryData(zipOne, entryOne), zipEntryData(zipTwo, entryTwo));
assertEquals(zipEntryDebugString(entryOne), zipEntryDebugString(entryTwo));
}
assertFalse(entriesTwo.hasMoreElements());
}
assertEquals(
new String(Files.readAllBytes(outputOne)), new String(Files.readAllBytes(outputTwo)));
}
private String zipEntryDebugString(ZipEntry entryOne) {
return "<ZE name="
+ entryOne.getName()
+ " crc="
+ entryOne.getCrc()
+ " comment="
+ entryOne.getComment()
+ " size="
+ entryOne.getSize()
+ " atime="
+ entryOne.getLastAccessTime()
+ " mtime="
+ entryOne.getLastModifiedTime()
+ " ctime="
+ entryOne.getCreationTime()
+ ">";
}
private String zipEntryData(ZipFile zip, ZipEntry entry) throws IOException {
return CharStreams.toString(new InputStreamReader(zip.getInputStream(entry)));
}
}