/*
* Copyright 2017-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.plugin.adapter;
import static org.junit.Assert.assertThat;
import com.facebook.buck.jvm.java.testutil.compiler.CompilerTreeApiTestRunner;
import com.facebook.buck.jvm.java.testutil.compiler.TestCompiler;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(CompilerTreeApiTestRunner.class)
public class BuckJavacTaskTest {
@Rule public TestCompiler testCompiler = new TestCompiler();
@Before
public void setUp() throws Exception {
testCompiler.addSourceFileContents("Foo.java", "class Foo { }");
}
@Test
public void testTaskListenersGetEventsInOrder() throws IOException {
BuckJavacTask javacTask = testCompiler.getJavacTask();
List<String> events = new ArrayList<>();
RecordingTaskListener tl1 = new RecordingTaskListener("1", events);
RecordingTaskListener tl2 = new RecordingTaskListener("2", events);
RecordingTaskListener tl3 = new RecordingTaskListener("3", events);
javacTask.setProcessors(Collections.emptyList());
TestTaskListenerAdapter.addTaskListener(javacTask, tl1);
TestTaskListenerAdapter.addTaskListener(javacTask, tl2);
TestTaskListenerAdapter.addTaskListener(javacTask, tl3);
javacTask.enter();
assertThat(
events,
Matchers.contains(
"1: started PARSE",
"2: started PARSE",
"3: started PARSE",
"1: finished PARSE",
"2: finished PARSE",
"3: finished PARSE",
"1: started ENTER",
"2: started ENTER",
"3: started ENTER",
"1: finished ENTER",
"2: finished ENTER",
"3: finished ENTER"));
}
@Test
public void testTaskListenersCanUnregister() throws IOException {
BuckJavacTask javacTask = testCompiler.getJavacTask();
List<String> events = new ArrayList<>();
RecordingTaskListener tl1 = new RecordingTaskListener("1", events);
RecordingTaskListener tl2 =
new RecordingTaskListener("2", events) {
@Override
public void finished(String event) {
super.finished(event);
TestTaskListenerAdapter.removeTaskListener(javacTask, this);
}
};
RecordingTaskListener tl3 = new RecordingTaskListener("3", events);
javacTask.setProcessors(Collections.emptyList());
TestTaskListenerAdapter.addTaskListener(javacTask, tl1);
TestTaskListenerAdapter.addTaskListener(javacTask, tl2);
TestTaskListenerAdapter.addTaskListener(javacTask, tl3);
javacTask.enter();
assertThat(
events,
Matchers.contains(
"1: started PARSE",
"2: started PARSE",
"3: started PARSE",
"1: finished PARSE",
"2: finished PARSE",
"3: finished PARSE",
"1: started ENTER",
"3: started ENTER",
"1: finished ENTER",
"3: finished ENTER"));
}
@Test
public void testSetTaskListenerDoesNotEraseAddedListeners() throws IOException {
BuckJavacTask javacTask = testCompiler.getJavacTask();
List<String> events = new ArrayList<>();
RecordingTaskListener tl1 = new RecordingTaskListener("1", events);
RecordingTaskListener tl2 = new RecordingTaskListener("2", events);
RecordingTaskListener tl3 = new RecordingTaskListener("3", events);
RecordingTaskListener tl4 = new RecordingTaskListener("4", events);
javacTask.setProcessors(Collections.emptyList());
TestTaskListenerAdapter.addTaskListener(javacTask, tl1);
TestTaskListenerAdapter.setTaskListener(javacTask, tl4);
TestTaskListenerAdapter.addTaskListener(javacTask, tl2);
TestTaskListenerAdapter.setTaskListener(javacTask, tl3);
javacTask.enter();
assertThat(
events,
Matchers.contains(
"1: started PARSE",
"2: started PARSE",
"3: started PARSE",
"1: finished PARSE",
"2: finished PARSE",
"3: finished PARSE",
"1: started ENTER",
"2: started ENTER",
"3: started ENTER",
"1: finished ENTER",
"2: finished ENTER",
"3: finished ENTER"));
}
@Test
public void testPluginsGetTheFirstEvent() throws IOException {
BuckJavacTask javacTask = testCompiler.getJavacTask();
List<String> events = new ArrayList<>();
javacTask.addPlugin(
new BuckJavacPlugin() {
@Override
public String getName() {
return "Plugin!";
}
@Override
public void init(BuckJavacTask task, String... args) {
TestTaskListenerAdapter.setTaskListener(
task, new RecordingTaskListener("Plugin", events));
}
});
javacTask.setProcessors(Collections.emptyList());
javacTask.enter();
assertThat(
events,
Matchers.contains(
"Plugin: started PARSE",
"Plugin: finished PARSE",
"Plugin: started ENTER",
"Plugin: finished ENTER"));
}
class RecordingTaskListener implements TestTaskListener {
private final String name;
private final List<String> events;
public RecordingTaskListener(String name, List<String> events) {
this.name = name;
this.events = events;
}
@Override
public void started(String event) {
events.add(String.format("%s: started %s", name, event));
}
@Override
public void finished(String event) {
events.add(String.format("%s: finished %s", name, event));
}
}
}