| /* |
| * 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.GWTTestCase.TestModuleInfo; |
| |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.List; |
| |
| /** |
| * Strategy that compiles modules as tests run. Optimizes total test time. |
| */ |
| class ParallelCompileStrategy extends PreCompileStrategy { |
| |
| /** |
| * The {@link BatchingStrategy} used to compile, which is set on the first |
| * compilation and is the same across all compilations. |
| */ |
| private BatchingStrategy batchingStrategy; |
| |
| /** |
| * The list of all synthetic module names to be compiled. |
| */ |
| private List<String> modulesToCompile = new ArrayList<String>(); |
| |
| /** |
| * The {@link TreeLogger} used to compile, which is set on the first |
| * compilation and is the same across all compilations. |
| */ |
| private TreeLogger treeLogger; |
| |
| public ParallelCompileStrategy(JUnitShell junitShell) { |
| super(junitShell); |
| } |
| |
| @Override |
| public void maybeCompileAhead() throws UnableToCompleteException { |
| if (modulesToCompile.size() > 0) { |
| String nextModule = modulesToCompile.remove(0); |
| TestModuleInfo moduleInfo = GWTTestCase.getTestsForModule(nextModule); |
| String syntheticModuleName = moduleInfo.getSyntheticModuleName(); |
| maybeCompileModuleImpl(moduleInfo.getModuleName(), syntheticModuleName, |
| moduleInfo.getStrategy(), batchingStrategy, treeLogger); |
| } |
| } |
| |
| @Override |
| public ModuleDef maybeCompileModule(String moduleName, |
| String syntheticModuleName, Strategy strategy, |
| BatchingStrategy batchingStrategy, TreeLogger treeLogger) |
| throws UnableToCompleteException { |
| |
| // Initialize the map of modules. |
| if (preCompiledModuleDefs == null) { |
| this.batchingStrategy = batchingStrategy; |
| this.treeLogger = treeLogger; |
| preCompiledModuleDefs = new HashMap<String, ModuleDef>(); |
| String[] allModuleNames = GWTTestCase.getAllTestModuleNames(); |
| for (String curModuleName : allModuleNames) { |
| modulesToCompile.add(curModuleName); |
| } |
| } |
| |
| // Compile the requested module if needed. |
| ModuleDef moduleDef = preCompiledModuleDefs.get(syntheticModuleName); |
| if (moduleDef == null) { |
| moduleDef = maybeCompileModuleImpl(moduleName, syntheticModuleName, |
| strategy, batchingStrategy, treeLogger); |
| } |
| return moduleDef; |
| } |
| |
| @Override |
| protected ModuleDef maybeCompileModuleImpl(String moduleName, |
| String syntheticModuleName, Strategy strategy, |
| BatchingStrategy batchingStrategy, TreeLogger treeLogger) |
| throws UnableToCompleteException { |
| modulesToCompile.remove(syntheticModuleName); |
| ModuleDef moduleDef = super.maybeCompileModuleImpl(moduleName, |
| syntheticModuleName, strategy, batchingStrategy, treeLogger); |
| preCompiledModuleDefs.put(syntheticModuleName, moduleDef); |
| return moduleDef; |
| } |
| } |