| /* |
| * 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); |
| } |
| } |