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