/*
* Copyright 2016-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.jvm.java;
import static org.junit.Assert.assertEquals;
import com.facebook.buck.io.ProjectFilesystem;
import com.facebook.buck.testutil.FakeProjectFilesystem;
import com.google.common.collect.FluentIterable;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import org.junit.Test;
public class DefaultClassUsageFileWriterTest {
private static final String OTHER_FILE_NAME = JavaFileObject.Kind.OTHER.toString();
private static final String SOURCE_FILE_NAME = JavaFileObject.Kind.SOURCE.toString();
private static final String HTML_FILE_NAME = JavaFileObject.Kind.HTML.toString();
private static final String[] FILE_NAMES = {"A", "B", "C", "D", "E", "F"};
private static final String SINGLE_NON_JAVA_FILE_NAME = "NonJava";
@Test
public void fileReadOrderDoesntAffectClassesUsedOutput() throws IOException {
ProjectFilesystem filesystem = FakeProjectFilesystem.createRealTempFilesystem();
Path testJarPath = filesystem.getPathForRelativePath("test.jar");
Path testTwoJarPath = filesystem.getPathForRelativePath("test2.jar");
Path outputOne = filesystem.getPathForRelativePath("used-classes-one.json");
Path outputTwo = filesystem.getPathForRelativePath("used-classes-two.json");
FakeStandardJavaFileManager fakeFileManager = new FakeStandardJavaFileManager();
fakeFileManager.addFile(testJarPath, OTHER_FILE_NAME, JavaFileObject.Kind.OTHER);
fakeFileManager.addFile(testJarPath, SOURCE_FILE_NAME, JavaFileObject.Kind.SOURCE);
fakeFileManager.addFile(testJarPath, HTML_FILE_NAME, JavaFileObject.Kind.HTML);
fakeFileManager.addFile(testJarPath, SINGLE_NON_JAVA_FILE_NAME, JavaFileObject.Kind.OTHER);
for (String fileName : FILE_NAMES) {
fakeFileManager.addFile(testJarPath, fileName, JavaFileObject.Kind.CLASS);
}
for (String fileName : FILE_NAMES) {
fakeFileManager.addFile(testTwoJarPath, fileName, JavaFileObject.Kind.CLASS);
}
DefaultClassUsageFileWriter writerOne = new DefaultClassUsageFileWriter(outputOne);
{
StandardJavaFileManager wrappedFileManager = writerOne.wrapFileManager(fakeFileManager);
for (JavaFileObject javaFileObject : wrappedFileManager.list(null, null, null, false)) {
javaFileObject.openInputStream();
}
}
writerOne.writeFile(filesystem);
DefaultClassUsageFileWriter writerTwo = new DefaultClassUsageFileWriter(outputTwo);
{
StandardJavaFileManager wrappedFileManager = writerTwo.wrapFileManager(fakeFileManager);
Iterable<JavaFileObject> fileObjects = wrappedFileManager.list(null, null, null, false);
for (JavaFileObject javaFileObject : FluentIterable.from(fileObjects).toList().reverse()) {
javaFileObject.openInputStream();
}
}
writerTwo.writeFile(filesystem);
assertEquals(
new String(Files.readAllBytes(outputOne)), new String(Files.readAllBytes(outputTwo)));
}
}