/*
* Copyright (C) 2014 Red Hat, Inc. and/or its affiliates.
*
* 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 org.jboss.errai.forge.facet.module;
import org.apache.maven.model.Model;
import org.jboss.errai.forge.config.ProjectConfig;
import org.jboss.errai.forge.config.ProjectProperty;
import org.jboss.errai.forge.constant.ModuleVault;
import org.jboss.errai.forge.constant.ModuleVault.Module;
import org.jboss.errai.forge.test.base.ForgeTest;
import org.jboss.forge.addon.maven.projects.MavenFacet;
import org.jboss.forge.addon.projects.Project;
import org.jboss.forge.addon.projects.ProjectFacet;
import org.junit.Test;
import javax.enterprise.context.Dependent;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static org.junit.Assert.*;
public class ModuleFacetTest extends ForgeTest {
@Dependent
public static class SimpleModuleFacet extends AbstractModuleFacet {
public SimpleModuleFacet() {
modules = Arrays.asList(new ModuleVault.Module[] { Module.GwtUser, Module.ErraiCommon });
}
}
@Test
public void testEmptyModuleInstall() throws Exception {
final Project project = initializeJavaProject();
final File moduleFile = makeBlankModuleFile(project, ModuleCoreFacet.emptyModuleContents);
final ProjectConfig config = facetFactory.install(project, ProjectConfig.class);
config.setProjectProperty(ProjectProperty.MODULE_FILE, moduleFile);
facetFactory.install(project, SimpleModuleFacet.class);
final String moduleContent = getFileContentAsString(moduleFile);
assertTrue(moduleContent, moduleContent.contains("<inherits name=\"org.jboss.errai.common.ErraiCommon\"/>"));
assertTrue(moduleContent, moduleContent.contains("<inherits name=\"com.google.gwt.user.User\"/>"));
assertEquals(2, countMatches("<inherits name=\"[^\"]*\"/>", moduleContent));
}
@Test
public void testNonEmptyModuleInstall() throws Exception {
final Project project = initializeJavaProject();
final String body = ModuleCoreFacet.emptyModuleContents.replace("</module>",
"<inherits name=\"org.jboss.errai.common.Logging\"/></module>");
final File moduleFile = makeBlankModuleFile(project, body);
final ProjectConfig config = facetFactory.install(project, ProjectConfig.class);
config.setProjectProperty(ProjectProperty.MODULE_FILE, moduleFile);
facetFactory.install(project, SimpleModuleFacet.class);
final String moduleContent = getFileContentAsString(moduleFile);
assertTrue(moduleContent, moduleContent.contains("<inherits name=\"org.jboss.errai.common.Logging\"/>"));
assertTrue(moduleContent, moduleContent.contains("<inherits name=\"org.jboss.errai.common.ErraiCommon\"/>"));
assertTrue(moduleContent, moduleContent.contains("<inherits name=\"com.google.gwt.user.User\"/>"));
assertEquals(3, countMatches("<inherits name=\"[^\"]*\"/>", moduleContent));
}
@Test
public void testModuleCoreFacetWithModule() throws Exception {
final Project project = initializeJavaProject();
final File moduleFile = makeBlankModuleFile(project, ModuleCoreFacet.emptyModuleContents);
final ProjectConfig config = facetFactory.install(project, ProjectConfig.class);
config.setProjectProperty(ProjectProperty.MODULE_FILE, moduleFile);
// Forge bug: this does not actually invoke ModuleCoreFacet#install when all tests are run
// facetFactory.install(project, ModuleCoreFacet.class);
final ModuleCoreFacet facet = facetFactory.create(project, ModuleCoreFacet.class);
facet.install();
final String moduleContent = getFileContentAsString(moduleFile);
assertTrue(moduleContent, moduleContent.contains("<inherits name=\"com.google.gwt.user.User\"/>"));
assertEquals(1, countMatches("<inherits name=\"[^\"]*\"/>", moduleContent));
}
@Test
public void testModuleCoreFacetWithoutModule() throws Exception {
final Project project = initializeJavaProject();
final File moduleFile = makeBlankModuleFile(project, ModuleCoreFacet.emptyModuleContents);
moduleFile.delete();
final ProjectConfig config = facetFactory.install(project, ProjectConfig.class);
config.setProjectProperty(ProjectProperty.MODULE_FILE, moduleFile);
// Forge bug: this does not actually invoke ModuleCoreFacet#install when all tests are run
// facetFactory.install(project, ModuleCoreFacet.class);
final ModuleCoreFacet facet = facetFactory.create(project, ModuleCoreFacet.class);
facet.install();
final String moduleContent = getFileContentAsString(moduleFile);
assertTrue(moduleContent, moduleContent.contains("<inherits name=\"com.google.gwt.user.User\"/>"));
assertEquals(1, countMatches("<inherits name=\"[^\"]*\"/>", moduleContent));
}
@Test
public void testAbstractModuleFacetIsInstalled() throws Exception {
final Project project = initializeJavaProject();
String body = ModuleCoreFacet.emptyModuleContents.replace("</module>",
"<inherits name='org.jboss.errai.common.ErraiCommon'/>\n" + "<inherits name='com.google.gwt.user.User'/>\n"
+ "</module>");
final File moduleFile = makeBlankModuleFile(project, body);
final ProjectConfig config = facetFactory.install(project, ProjectConfig.class);
final ProjectFacet facet = facetFactory.create(project, SimpleModuleFacet.class);
config.setProjectProperty(ProjectProperty.MODULE_FILE, moduleFile);
assertTrue(facet.isInstalled());
}
@Test
public void testAbstractModuleFacetIsInstalledNegative()
throws Exception {
final Project project = initializeJavaProject();
String body = ModuleCoreFacet.emptyModuleContents;
final File moduleFile = makeBlankModuleFile(project, body);
final ProjectConfig config = facetFactory.install(project, ProjectConfig.class);
final ProjectFacet facet = facetFactory.create(project, SimpleModuleFacet.class);
config.setProjectProperty(ProjectProperty.MODULE_FILE, moduleFile);
assertFalse(facet.isInstalled());
}
@Test
public void testAbstractModuleFacetUninstall() throws Exception {
final Project project = initializeJavaProject();
String body = ModuleCoreFacet.emptyModuleContents.replace("</module>",
"<inherits name='org.jboss.errai.common.ErraiCommon'/>\n" + "<inherits name='com.google.gwt.user.User'/>\n"
+ "</module>");
final File moduleFile = makeBlankModuleFile(project, body);
final ProjectConfig config = facetFactory.install(project, ProjectConfig.class);
final ProjectFacet facet = facetFactory.create(project, SimpleModuleFacet.class);
config.setProjectProperty(ProjectProperty.MODULE_FILE, moduleFile);
boolean res = facet.uninstall();
assertTrue(res);
assertEquals(0, countMatches("<inherits name=\"[^\"]*\"/>", getFileContentAsString(moduleFile)));
}
private int countMatches(final String regex, final String content) {
final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(content);
int count = 0;
while (matcher.find())
count++;
return count;
}
private File makeBlankModuleFile(final Project project, final String body) throws IOException {
final String sourcePath;
final MavenFacet mavenFacet = project.getFacet(MavenFacet.class);
final Model model = mavenFacet.getModel();
if (model.getBuild() != null && model.getBuild().getSourceDirectory() != null) {
sourcePath = model.getBuild().getSourceDirectory();
}
else {
sourcePath = "src/main/java";
}
final File moduleFile = new File(new File(project.getRootDirectory().getUnderlyingResourceObject(), sourcePath),
"org/jboss/errai/Test.gwt.xml");
moduleFile.getParentFile().mkdirs();
moduleFile.createNewFile();
final FileWriter writer = new FileWriter(moduleFile);
writer.append(body);
writer.close();
return moduleFile;
}
private String getFileContentAsString(File f) throws IOException {
final StringBuilder builder = new StringBuilder();
final FileReader reader = new FileReader(f);
char[] buf = new char[256];
int amt;
do {
amt = reader.read(buf);
if (amt > -1)
builder.append(buf, 0, amt);
else
break;
}
while (true);
reader.close();
return builder.toString();
}
}