/*
* Copyright (C) 2015 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.ui.test.error.client;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import org.jboss.errai.enterprise.client.cdi.AbstractErraiCDITest;
import org.jboss.errai.ioc.client.container.IOC;
import org.jboss.errai.ui.shared.TemplateUtil;
import org.jboss.errai.ui.test.error.client.res.MissingPackagePrivateFieldInTemplate;
import org.jboss.errai.ui.test.error.client.res.MissingPackagePrivateSubclass;
import org.jboss.errai.ui.test.error.client.res.MissingPrivateFieldInTemplate;
import org.jboss.errai.ui.test.error.client.res.MissingPrivateSubclass;
import org.jboss.errai.ui.test.error.client.res.MissingProtectedFieldInTemplate;
import org.jboss.errai.ui.test.error.client.res.MissingProtectedSubclass;
import org.jboss.errai.ui.test.error.client.res.MissingPublicFieldInTemplate;
import org.jboss.errai.ui.test.error.client.res.MissingPublicSubclass;
import org.jboss.errai.ui.test.error.client.res.Subclass;
import org.jboss.errai.ui.test.error.client.res.SubclassMissingField;
import org.jboss.errai.ui.test.error.client.res.SubclassOfAbstractWithTemplateMissingPackagePrivateField;
import org.jboss.errai.ui.test.error.client.res.SubclassOfAbstractWithTemplateMissingPrivateField;
import org.jboss.errai.ui.test.error.client.res.SubclassOfAbstractWithTemplateMissingProtectedField;
import org.jboss.errai.ui.test.error.client.res.SubclassOfAbstractWithTemplateMissingPublicField;
import org.jboss.errai.ui.test.error.client.res.SubclassWithTemplateMissingPackagePrivateField;
import org.jboss.errai.ui.test.error.client.res.SubclassWithTemplateMissingPrivateField;
import org.jboss.errai.ui.test.error.client.res.SubclassWithTemplateMissingProtectedField;
import org.jboss.errai.ui.test.error.client.res.SubclassWithTemplateMissingPublicField;
import org.jboss.errai.ui.test.error.client.res.TemplateWithDifferentDataFieldElementKind;
import org.jboss.errai.ui.test.error.client.res.TemplateWithNullDataField;
public class TemplateErrorTest extends AbstractErraiCDITest {
private Subclass anno = new Subclass() {
@Override
public Class<? extends Annotation> annotationType() {
return Subclass.class;
}
};
@Override
public String getModuleName() {
return getClass().getName().replaceAll("client.*$", "Test");
}
public void testMissingPrivateDataField() throws Exception {
try {
IOC.getBeanManager().lookupBean(MissingPrivateFieldInTemplate.class).getInstance();
fail("No error was thrown for missing data-field.");
} catch (AssertionError ae) {
throw ae;
} catch (Throwable t) {
assertTrue("Unexpected error message: " + t.getMessage(), t.getMessage().contains("did not contain data-field"));
assertTrue("Message did not reference the unsatisfied data-field: " + t.getMessage(),
t.getMessage().contains(MissingPrivateFieldInTemplate.class.getSimpleName() + ".field"));
}
}
public void testMissingPackagePrivateDataField() throws Exception {
try {
IOC.getBeanManager().lookupBean(MissingPackagePrivateFieldInTemplate.class).getInstance();
fail("No error was thrown for missing data-field.");
} catch (AssertionError ae) {
throw ae;
} catch (Throwable t) {
assertTrue("Unexpected error message: " + t.getMessage(), t.getMessage().contains("did not contain data-field"));
assertTrue("Message did not reference the unsatisfied data-field: " + t.getMessage(),
t.getMessage().contains(MissingPackagePrivateFieldInTemplate.class.getSimpleName() + ".field"));
}
}
public void testMissingPublicDataField() throws Exception {
try {
IOC.getBeanManager().lookupBean(MissingPublicFieldInTemplate.class).getInstance();
fail("No error was thrown for missing data-field.");
} catch (AssertionError ae) {
throw ae;
} catch (Throwable t) {
assertTrue("Unexpected error message: " + t.getMessage(), t.getMessage().contains("did not contain data-field"));
assertTrue("Message did not reference the unsatisfied data-field: " + t.getMessage(),
t.getMessage().contains(MissingPublicFieldInTemplate.class.getSimpleName() + ".field"));
}
}
public void testMissingProtectedDataField() throws Exception {
try {
IOC.getBeanManager().lookupBean(MissingProtectedFieldInTemplate.class).getInstance();
fail("No error was thrown for missing data-field.");
} catch (AssertionError ae) {
throw ae;
} catch (Throwable t) {
assertTrue("Unexpected error message: " + t.getMessage(), t.getMessage().contains("did not contain data-field"));
assertTrue("Message did not reference the unsatisfied data-field: " + t.getMessage(),
t.getMessage().contains(MissingProtectedFieldInTemplate.class.getSimpleName() + ".field"));
}
}
public void testSubclassWithSameTemplateMissingProtectedDataField() throws Exception {
try {
IOC.getBeanManager().lookupBean(MissingProtectedSubclass.class, anno).getInstance();
fail("No error was thrown for missing data-field.");
} catch (AssertionError ae) {
throw ae;
} catch (Throwable t) {
assertTrue("Unexpected error message: " + t.getMessage(), t.getMessage().contains("did not contain data-field"));
assertTrue("Message did not reference the unsatisfied data-field: " + t.getMessage(),
t.getMessage().contains(MissingProtectedSubclass.class.getSimpleName() + ".field"));
}
}
public void testSubclassWithSameTemplateMissingPrivateDataField() throws Exception {
try {
IOC.getBeanManager().lookupBean(MissingPrivateSubclass.class, anno).getInstance();
fail("No error was thrown for missing data-field.");
} catch (AssertionError ae) {
throw ae;
} catch (Throwable t) {
assertTrue("Unexpected error message: " + t.getMessage(), t.getMessage().contains("did not contain data-field"));
assertTrue("Message did not reference the unsatisfied data-field: " + t.getMessage(),
t.getMessage().contains(MissingPrivateSubclass.class.getSimpleName() + ".field"));
}
}
public void testSubclassWithSameTemplateMissingPackagePrivateDataField() throws Exception {
try {
IOC.getBeanManager().lookupBean(MissingPackagePrivateSubclass.class, anno).getInstance();
fail("No error was thrown for missing data-field.");
} catch (AssertionError ae) {
throw ae;
} catch (Throwable t) {
assertTrue("Unexpected error message: " + t.getMessage(), t.getMessage().contains("did not contain data-field"));
assertTrue("Message did not reference the unsatisfied data-field: " + t.getMessage(),
t.getMessage().contains(MissingPackagePrivateSubclass.class.getSimpleName() + ".field"));
}
}
public void testSubclassWithSameTemplateMissingPublicDataField() throws Exception {
try {
IOC.getBeanManager().lookupBean(MissingPublicSubclass.class, anno).getInstance();
fail("No error was thrown for missing data-field.");
} catch (AssertionError ae) {
throw ae;
} catch (Throwable t) {
assertTrue("Unexpected error message: " + t.getMessage(), t.getMessage().contains("did not contain data-field"));
assertTrue("Message did not reference the unsatisfied data-field: " + t.getMessage(),
t.getMessage().contains(MissingPublicSubclass.class.getSimpleName() + ".field"));
}
}
public void testSubclassWithDifferentTemplateMissingPublicField() throws Exception {
try {
IOC.getBeanManager().lookupBean(SubclassWithTemplateMissingPublicField.class, anno).getInstance();
fail("No error was thrown for missing data-field.");
} catch (AssertionError ae) {
throw ae;
} catch (Throwable t) {
assertTrue("Unexpected error message: " + t.getMessage(), t.getMessage().contains("did not contain data-field"));
assertTrue("Message did not reference the unsatisfied data-field: " + t.getMessage(),
t.getMessage().contains(SubclassWithTemplateMissingPublicField.class.getSimpleName() + ".field"));
}
}
public void testSubclassWithDifferentTemplateMissingPrivateField() throws Exception {
try {
IOC.getBeanManager().lookupBean(SubclassWithTemplateMissingPrivateField.class, anno).getInstance();
fail("No error was thrown for missing data-field.");
} catch (AssertionError ae) {
throw ae;
} catch (Throwable t) {
assertTrue("Unexpected error message: " + t.getMessage(), t.getMessage().contains("did not contain data-field"));
assertTrue("Message did not reference the unsatisfied data-field: " + t.getMessage(),
t.getMessage().contains(SubclassWithTemplateMissingPrivateField.class.getSimpleName() + ".field"));
}
}
public void testSubclassWithDifferentTemplateMissingPackagePrivateField() throws Exception {
try {
IOC.getBeanManager().lookupBean(SubclassWithTemplateMissingPackagePrivateField.class, anno).getInstance();
fail("No error was thrown for missing data-field.");
} catch (AssertionError ae) {
throw ae;
} catch (Throwable t) {
assertTrue("Unexpected error message: " + t.getMessage(), t.getMessage().contains("did not contain data-field"));
assertTrue("Message did not reference the unsatisfied data-field: " + t.getMessage(),
t.getMessage().contains(SubclassWithTemplateMissingPackagePrivateField.class.getSimpleName() + ".field"));
}
}
public void testSubclassWithDifferentTemplateMissingProtectedField() throws Exception {
try {
IOC.getBeanManager().lookupBean(SubclassWithTemplateMissingProtectedField.class, anno).getInstance();
fail("No error was thrown for missing data-field.");
} catch (AssertionError ae) {
throw ae;
} catch (Throwable t) {
assertTrue("Unexpected error message: " + t.getMessage(), t.getMessage().contains("did not contain data-field"));
assertTrue("Message did not reference the unsatisfied data-field: " + t.getMessage(),
t.getMessage().contains(SubclassWithTemplateMissingProtectedField.class.getSimpleName() + ".field"));
}
}
public void testSubclassOfAbstractWithDifferentTemplateMissingPublicField() throws Exception {
try {
IOC.getBeanManager().lookupBean(SubclassOfAbstractWithTemplateMissingPublicField.class, anno).getInstance();
fail("No error was thrown for missing data-field.");
} catch (AssertionError ae) {
throw ae;
} catch (Throwable t) {
assertTrue("Unexpected error message: " + t.getMessage(), t.getMessage().contains("did not contain data-field"));
assertTrue("Message did not reference the unsatisfied data-field: " + t.getMessage(),
t.getMessage().contains(SubclassOfAbstractWithTemplateMissingPublicField.class.getSimpleName() + ".field"));
}
}
public void testSubclassOfAbstractWithDifferentTemplateMissingPrivateField() throws Exception {
try {
IOC.getBeanManager().lookupBean(SubclassOfAbstractWithTemplateMissingPrivateField.class, anno).getInstance();
fail("No error was thrown for missing data-field.");
} catch (AssertionError ae) {
throw ae;
} catch (Throwable t) {
assertTrue("Unexpected error message: " + t.getMessage(), t.getMessage().contains("did not contain data-field"));
assertTrue("Message did not reference the unsatisfied data-field: " + t.getMessage(),
t.getMessage().contains(SubclassOfAbstractWithTemplateMissingPrivateField.class.getSimpleName() + ".field"));
}
}
public void testSubclassOfAbstractWithDifferentTemplateMissingPackagePrivateField() throws Exception {
try {
IOC.getBeanManager().lookupBean(SubclassOfAbstractWithTemplateMissingPackagePrivateField.class, anno).getInstance();
fail("No error was thrown for missing data-field.");
} catch (AssertionError ae) {
throw ae;
} catch (Throwable t) {
assertTrue("Unexpected error message: " + t.getMessage(), t.getMessage().contains("did not contain data-field"));
assertTrue("Message did not reference the unsatisfied data-field: " + t.getMessage(),
t.getMessage().contains(SubclassOfAbstractWithTemplateMissingPackagePrivateField.class.getSimpleName() + ".field"));
}
}
public void testSubclassOfAbstractWithDifferentTemplateMissingProtectedField() throws Exception {
try {
IOC.getBeanManager().lookupBean(SubclassOfAbstractWithTemplateMissingProtectedField.class, anno).getInstance();
fail("No error was thrown for missing data-field.");
} catch (AssertionError ae) {
throw ae;
} catch (Throwable t) {
assertTrue("Unexpected error message: " + t.getMessage(), t.getMessage().contains("did not contain data-field"));
assertTrue("Message did not reference the unsatisfied data-field: " + t.getMessage(),
t.getMessage().contains(SubclassOfAbstractWithTemplateMissingProtectedField.class.getSimpleName() + ".field"));
}
}
public void testDefaultHTMLFileNamesForSubclassOfAbstractWithDifferentTemplateMissingField() throws Exception {
try {
IOC.getBeanManager().lookupBean(SubclassMissingField.class).getInstance();
fail("No error was thrown for missing data-field.");
} catch (AssertionError ae) {
throw ae;
} catch (Throwable t) {
assertTrue("Unexpected error message: " + t.getMessage(), t.getMessage().contains("did not contain data-field"));
assertTrue("Message did not reference the unsatisfied data-field: " + t.getMessage(),
t.getMessage().contains(SubclassMissingField.class.getSimpleName() + ".field"));
}
}
public void testNullDataFieldReferencesDataFieldAndTemplatedBeanNames() throws Exception {
try {
IOC.getBeanManager().lookupBean(TemplateWithNullDataField.class).getInstance();
fail("No error was thrown for a template with a null @DataField.");
} catch (AssertionError ae) {
throw ae;
} catch (Throwable t) {
assertTrue("Error message does not contain name of the @Templated type: " + t.getMessage(),
t.getMessage().contains(TemplateWithNullDataField.class.getName()));
assertTrue("Error message does not the name of the @DataField: " + t.getMessage(),
t.getMessage().contains("field"));
}
}
public void testElementConversionWarningReferencesDataFieldAndTemplatedBeanNames() throws Exception {
// Setup log handler to capture warning message.
final Logger rootLogger = Logger.getLogger("");
final List<LogRecord> logRecords = new ArrayList<>();
rootLogger.addHandler(new Handler() {
@Override
public void publish(final LogRecord record) {
if (record.getLoggerName().contains(TemplateUtil.class.getSimpleName()) && record.getLevel().equals(Level.WARNING)) {
logRecords.add(record);
}
}
@Override public void flush() {}
@Override public void close() {}
});
IOC.getBeanManager().lookupBean(TemplateWithDifferentDataFieldElementKind.class).getInstance();
assertFalse("No warnings captured from TemplateUtil. Please ensure logging is enabled for this test.", logRecords.isEmpty());
assertEquals("There should only be a single warning logged from TemplateUtil.", 1, logRecords.size());
final String logMessage = logRecords.get(0).getMessage();
assertTrue("Log message did not reference the @Templated bean type: " + logMessage,
logMessage.contains(TemplateWithDifferentDataFieldElementKind.class.getSimpleName()));
assertTrue("Log message did not reference the field name for the @DataField: " + logMessage, logMessage.contains("field"));
}
}