blob: 879294090901baf24ee8ff359484c7320c1edfe0 [file] [log] [blame]
/*
* Copyright 2009 Google 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.google.gwt.junit;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.dev.cfg.ModuleDef;
import com.google.gwt.junit.JUnitShell.Strategy;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.junit.client.impl.JUnitHost.TestInfo;
import junit.framework.TestCase;
import java.util.ArrayList;
import java.util.List;
/**
* Tests of {@link BatchingStrategy}. This test must run after a
* {@link GWTTestCase} to ensure that JUnitShell is already initialized.
*/
public class CompileStrategyTest extends TestCase {
/**
* A mock {@link CompileStrategy} used for testing.
*/
private static class MockCompileStrategy extends CompileStrategy {
private MockJUnitMessageQueue messageQueue = new MockJUnitMessageQueue();
/**
* The number of modules to mock.
*/
private int mockModuleCount;
/**
* Construct a new {@link MockCompileStrategy}.
*
* @param mockModuleCount the number of modules
*/
public MockCompileStrategy(int mockModuleCount) {
super(null);
this.mockModuleCount = mockModuleCount;
}
@Override
public ModuleDef maybeCompileModule(String moduleName,
String syntheticModuleName, Strategy strategy,
BatchingStrategy batchingStrategy, TreeLogger treeLogger) {
fail("This method should not be called.");
return null;
}
@Override
MockJUnitMessageQueue getMessageQueue() {
return messageQueue;
}
@Override
int getModuleCount() {
return mockModuleCount;
}
@Override
ModuleDef maybeCompileModuleImpl2(String moduleName,
String syntheticModuleName, Strategy strategy, TreeLogger treeLogger) {
return null;
}
}
/**
* A mock test case used for testing.
*/
private static class MockGWTTestCase extends GWTTestCase {
@Override
public String getModuleName() {
return "com.google.gwt.junit.JUnit";
}
@Override
public String getName() {
return "testMethod1";
}
public void testMethod0() {
}
public void testMethod1() {
}
public void testMethod2() {
}
}
/**
* A mock {@link JUnitMessageQueue} used for testing.
*/
private static class MockJUnitMessageQueue extends JUnitMessageQueue {
/**
* Indicates that this is the last test block.
*/
private boolean isLastBlock;
/**
* The test blocks added to the queue.
*/
private List<TestInfo[]> testBlocks;
public MockJUnitMessageQueue() {
super(1);
}
@Override
void addTestBlocks(List<TestInfo[]> newTestBlocks, boolean isLastBlock) {
assertNull(testBlocks);
this.testBlocks = newTestBlocks;
this.isLastBlock = isLastBlock;
}
void assertIsLastBlock(boolean expected) {
assertEquals(expected, isLastBlock);
}
void assertTestBlocks(List<TestInfo[]> expected) {
if (expected == null || testBlocks == null) {
assertEquals(expected, testBlocks);
return;
}
assertEquals(expected.size(), testBlocks.size());
for (int i = 0; i < testBlocks.size(); i++) {
TestInfo[] actualBlock = testBlocks.get(i);
TestInfo[] expectedBlock = expected.get(i);
assertEquals(expectedBlock.length, actualBlock.length);
for (int j = 0; j < expectedBlock.length; j++) {
assertEquals(expectedBlock[j], actualBlock[j]);
}
}
}
}
public void testMaybeAddTestBlockForCurrentTestWithBatching() {
BatchingStrategy batchingStrategy = new ModuleBatchingStrategy();
assertFalse(batchingStrategy.isSingleTestOnly());
// Maybe add the current test.
GWTTestCase testCase = new MockGWTTestCase();
MockCompileStrategy strategy = new MockCompileStrategy(-1);
strategy.maybeAddTestBlockForCurrentTest(testCase, batchingStrategy);
// Verify the test is not added to the queue.
strategy.getMessageQueue().assertTestBlocks(null);
}
public void testMaybeAddTestBlockForCurrentTestWithoutBatching() {
BatchingStrategy batchingStrategy = new NoBatchingStrategy();
assertTrue(batchingStrategy.isSingleTestOnly());
// Maybe add the current test.
GWTTestCase testCase = new MockGWTTestCase();
MockCompileStrategy strategy = new MockCompileStrategy(-1);
strategy.maybeAddTestBlockForCurrentTest(testCase, batchingStrategy);
// Generate the expected blocks.
TestInfo testInfo = new TestInfo(testCase.getSyntheticModuleName(),
testCase.getClass().getName(), testCase.getName());
List<TestInfo[]> testBlocks = new ArrayList<TestInfo[]>();
testBlocks.add(new TestInfo[] {testInfo});
// Verify the test is added to the queue.
strategy.getMessageQueue().assertIsLastBlock(false);
strategy.getMessageQueue().assertTestBlocks(testBlocks);
}
public void testMaybeCompileModuleImplWithBatchingLastModule() {
BatchingStrategy batchingStrategy = new ModuleBatchingStrategy();
assertFalse(batchingStrategy.isSingleTestOnly());
// Maybe add the current test.
GWTTestCase testCase = new MockGWTTestCase();
MockCompileStrategy strategy = new MockCompileStrategy(-1);
try {
strategy.maybeCompileModuleImpl(testCase.getModuleName(),
testCase.getSyntheticModuleName(), testCase.getStrategy(),
batchingStrategy, TreeLogger.NULL);
} catch (UnableToCompleteException e) {
fail("Unexpected UnableToCompleteException: " + e.getMessage());
}
// Verify the test block is added to the queue.
strategy.getMessageQueue().assertIsLastBlock(true);
strategy.getMessageQueue().assertTestBlocks(
batchingStrategy.getTestBlocks(testCase.getSyntheticModuleName()));
}
public void testMaybeCompileModuleImplWithBatchingNotLastModule() {
BatchingStrategy batchingStrategy = new ClassBatchingStrategy();
assertFalse(batchingStrategy.isSingleTestOnly());
// Maybe add the current test.
GWTTestCase testCase = new MockGWTTestCase();
MockCompileStrategy strategy = new MockCompileStrategy(1000);
try {
strategy.maybeCompileModuleImpl(testCase.getModuleName(),
testCase.getSyntheticModuleName(), testCase.getStrategy(),
batchingStrategy, TreeLogger.NULL);
} catch (UnableToCompleteException e) {
fail("Unexpected UnableToCompleteException: " + e.getMessage());
}
// Verify the test block is added to the queue.
strategy.getMessageQueue().assertIsLastBlock(false);
strategy.getMessageQueue().assertTestBlocks(
batchingStrategy.getTestBlocks(testCase.getSyntheticModuleName()));
}
public void testMaybeCompileModuleImplWithoutBatching() {
BatchingStrategy batchingStrategy = new NoBatchingStrategy();
assertTrue(batchingStrategy.isSingleTestOnly());
// Maybe add the current test.
GWTTestCase testCase = new MockGWTTestCase();
MockCompileStrategy strategy = new MockCompileStrategy(-1);
try {
strategy.maybeCompileModuleImpl(testCase.getModuleName(),
testCase.getSyntheticModuleName(), testCase.getStrategy(),
batchingStrategy, TreeLogger.NULL);
} catch (UnableToCompleteException e) {
fail("Unexpected UnableToCompleteException: " + e.getMessage());
}
// Verify the test block is not added to the queue.
strategy.getMessageQueue().assertTestBlocks(null);
}
}