/*
* Copyright 2015-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.tracing;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import com.google.common.collect.ImmutableList;
import org.easymock.EasyMockRunner;
import org.easymock.Mock;
import org.easymock.MockType;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(EasyMockRunner.class)
public class TranslatingJavacPhaseTracerTest {
@Mock(type = MockType.STRICT)
private JavacPhaseEventLogger mockLogger;
private TranslatingJavacPhaseTracer tracer;
@Before
public void setUp() {
tracer = new TranslatingJavacPhaseTracer(mockLogger);
}
@Test
public void testNormalCompilation() {
mockLogger.beginParse("file1");
mockLogger.endParse();
mockLogger.beginParse("file2");
mockLogger.endParse();
mockLogger.beginEnter();
mockLogger.endEnter(ImmutableList.of("file1", "file2"));
mockLogger.beginAnalyze("file1", "type1");
mockLogger.endAnalyze();
mockLogger.beginGenerate("file1", "type1");
mockLogger.endGenerate();
mockLogger.beginAnalyze("file2", "type2");
mockLogger.endAnalyze();
mockLogger.beginGenerate("file2", "type2");
mockLogger.endGenerate();
replay(mockLogger);
tracer.beginParse("file1");
tracer.endParse();
tracer.beginParse("file2");
tracer.endParse();
tracer.beginEnter();
tracer.endEnter(ImmutableList.of("file1", "file2"));
tracer.beginAnalyze("file1", "type1");
tracer.endAnalyze();
tracer.beginGenerate("file1", "type1");
tracer.endGenerate();
tracer.beginAnalyze("file2", "type2");
tracer.endAnalyze();
tracer.beginGenerate("file2", "type2");
tracer.endGenerate();
tracer.close();
verify(mockLogger);
}
@Test
public void testAnnotationProcessingCompilation() {
mockLogger.beginParse("file1");
mockLogger.endParse();
mockLogger.beginParse("file2");
mockLogger.endParse();
mockLogger.beginEnter();
mockLogger.endEnter(ImmutableList.of("file1", "file2"));
mockLogger.beginAnnotationProcessing();
mockLogger.beginAnnotationProcessingRound(1);
mockLogger.beginRunAnnotationProcessors();
mockLogger.endRunAnnotationProcessors();
mockLogger.beginParse("generatedFile1");
mockLogger.endParse();
mockLogger.beginEnter();
mockLogger.endEnter(ImmutableList.of("file1", "file2", "generatedFile1"));
mockLogger.endAnnotationProcessingRound(false);
mockLogger.beginAnnotationProcessingRound(2);
mockLogger.beginRunAnnotationProcessors();
mockLogger.endRunAnnotationProcessors();
mockLogger.beginEnter();
mockLogger.endEnter(ImmutableList.of("file1", "file2", "generatedFile1"));
mockLogger.endAnnotationProcessingRound(true);
mockLogger.endAnnotationProcessing();
mockLogger.beginAnalyze("file1", "type1");
mockLogger.endAnalyze();
mockLogger.beginGenerate("file1", "type1");
mockLogger.endGenerate();
mockLogger.beginAnalyze("file2", "type2");
mockLogger.endAnalyze();
mockLogger.beginGenerate("file2", "type2");
mockLogger.endGenerate();
mockLogger.beginAnalyze("generatedFile1", "generatedType1");
mockLogger.endAnalyze();
mockLogger.beginGenerate("generatedFile1", "generatedType1");
mockLogger.endGenerate();
replay(mockLogger);
tracer.beginParse("file1");
tracer.endParse();
tracer.beginParse("file2");
tracer.endParse();
tracer.beginEnter();
tracer.endEnter(ImmutableList.of("file1", "file2"));
tracer.beginAnnotationProcessingRound();
tracer.endAnnotationProcessingRound();
tracer.beginParse("generatedFile1");
tracer.endParse();
tracer.beginEnter();
tracer.endEnter(ImmutableList.of("file1", "file2", "generatedFile1"));
tracer.beginAnnotationProcessingRound();
tracer.endAnnotationProcessingRound();
tracer.beginEnter();
tracer.endEnter(ImmutableList.of("file1", "file2", "generatedFile1"));
tracer.beginAnalyze("file1", "type1");
tracer.endAnalyze();
tracer.beginGenerate("file1", "type1");
tracer.endGenerate();
tracer.beginAnalyze("file2", "type2");
tracer.endAnalyze();
tracer.beginGenerate("file2", "type2");
tracer.endGenerate();
tracer.beginAnalyze("generatedFile1", "generatedType1");
tracer.endAnalyze();
tracer.beginGenerate("generatedFile1", "generatedType1");
tracer.endGenerate();
tracer.close();
verify(mockLogger);
}
/** Tests the event stream as it would be for compilation with the -proc:only option. */
@Test
public void testProcOnlyCompilation() {
logDesiredEventStreamForProcOnly(mockLogger);
replay(mockLogger);
traceProcOnlyEvents(tracer);
verify(mockLogger);
}
/** Tests the event stream as it would be for compilation with the -proc:only option. */
@Test
public void testProcOnlyCompilationDoubleClose() {
logDesiredEventStreamForProcOnly(mockLogger);
replay(mockLogger);
traceProcOnlyEvents(tracer);
tracer.close();
verify(mockLogger);
}
private void traceProcOnlyEvents(final TranslatingJavacPhaseTracer tracer) {
tracer.beginParse("file1");
tracer.endParse();
tracer.beginParse("file2");
tracer.endParse();
tracer.beginEnter();
tracer.endEnter(ImmutableList.of("file1", "file2"));
tracer.beginAnnotationProcessingRound();
tracer.endAnnotationProcessingRound();
tracer.beginParse("generatedFile1");
tracer.endParse();
tracer.beginEnter();
tracer.endEnter(ImmutableList.of("file1", "file2", "generatedFile1"));
tracer.beginAnnotationProcessingRound();
tracer.endAnnotationProcessingRound();
tracer.close();
}
private void logDesiredEventStreamForProcOnly(final JavacPhaseEventLogger logger) {
logger.beginParse("file1");
logger.endParse();
logger.beginParse("file2");
logger.endParse();
logger.beginEnter();
logger.endEnter(ImmutableList.of("file1", "file2"));
logger.beginAnnotationProcessing();
logger.beginAnnotationProcessingRound(1);
logger.beginRunAnnotationProcessors();
logger.endRunAnnotationProcessors();
logger.beginParse("generatedFile1");
logger.endParse();
logger.beginEnter();
logger.endEnter(ImmutableList.of("file1", "file2", "generatedFile1"));
logger.endAnnotationProcessingRound(false);
logger.beginAnnotationProcessingRound(2);
logger.beginRunAnnotationProcessors();
logger.endRunAnnotationProcessors();
logger.endAnnotationProcessingRound(true);
logger.endAnnotationProcessing();
}
}