/*
* Copyright (C) 2013 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.ioc.tests.extensions.client;
import java.util.ArrayList;
import java.util.List;
import org.jboss.errai.ioc.client.IOCUtil;
import org.jboss.errai.ioc.client.container.ErraiUncaughtExceptionHandler;
import org.jboss.errai.ioc.client.test.AbstractErraiIOCTest;
import org.jboss.errai.ioc.tests.extensions.client.res.DependentUncaughtExceptionHandler;
import org.jboss.errai.ioc.tests.extensions.client.res.ExceptionForAppScopedHandler;
import org.jboss.errai.ioc.tests.extensions.client.res.ExceptionForDependentHandler;
import org.jboss.errai.ioc.tests.extensions.client.res.ExceptionForPrivateHandler;
import org.jboss.errai.ioc.tests.extensions.client.res.UncaughtExceptionTestLogger;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.GWT.UncaughtExceptionHandler;
/**
* Tests support for handling uncaught exceptions.
*
* @author Christian Sadilek <csadilek@redhat.com>
* @author Max Barkley <mbarkley@redhat.com>
*/
public class UncaughtExceptionHandlingIntegrationTest extends AbstractErraiIOCTest {
private final List<Throwable> testHandlerLog = new ArrayList<>();
private final UncaughtExceptionHandler testHandler = e -> {
testHandlerLog.add(e);
};
private UncaughtExceptionTestLogger uncaughtHandlersLogger;
@Override
public String getModuleName() {
return "org.jboss.errai.ioc.tests.extensions.IOCExtensionTests";
}
@Override
protected void gwtSetUp() throws Exception {
testHandlerLog.clear();
GWT.setUncaughtExceptionHandler(testHandler);
super.gwtSetUp();
uncaughtHandlersLogger = IOCUtil.getInstance(UncaughtExceptionTestLogger.class);
}
public void testErraiUncaughtExceptionHandlerIsSet() throws Exception {
assertNotNull("Exception handler should not be null.", GWT.getUncaughtExceptionHandler());
assertEquals("Exception handler should be instance of " + ErraiUncaughtExceptionHandler.class.getSimpleName(),
ErraiUncaughtExceptionHandler.class.getName(), GWT.getUncaughtExceptionHandler().getClass().getName());
}
public void testErraiUncaughtExceptionHandlerInvokesReplacedHandler() throws Exception {
final ErraiUncaughtExceptionHandler erraiHandler = assertErraiHandlerSet();
assertTrue(testHandlerLog.isEmpty());
final Throwable t = new Throwable();
erraiHandler.onUncaughtException(t);
assertEquals(1, testHandlerLog.size());
assertSame(t, testHandlerLog.get(0));
}
public void testAppScopedExceptionHandler() throws Exception {
final ErraiUncaughtExceptionHandler erraiHandler = assertErraiHandlerSet();
assertTrue(uncaughtHandlersLogger.getLogged().isEmpty());
final ExceptionForAppScopedHandler e = new ExceptionForAppScopedHandler();
erraiHandler.onUncaughtException(e);
assertEquals(1, uncaughtHandlersLogger.getLogged().size());
assertSame(e, uncaughtHandlersLogger.getLogged().get(0));
}
public void testDependentExceptionHandler() throws Exception {
final ErraiUncaughtExceptionHandler erraiHandler = assertErraiHandlerSet();
assertTrue(uncaughtHandlersLogger.getLogged().isEmpty());
final ExceptionForDependentHandler e = new ExceptionForDependentHandler();
erraiHandler.onUncaughtException(e);
assertTrue(uncaughtHandlersLogger.getLogged().isEmpty());
final DependentUncaughtExceptionHandler handler = IOCUtil.getInstance(DependentUncaughtExceptionHandler.class);
erraiHandler.onUncaughtException(e);
assertEquals(1, uncaughtHandlersLogger.getLogged().size());
assertSame(e, uncaughtHandlersLogger.getLogged().get(0));
IOCUtil.destroy(handler);
uncaughtHandlersLogger.reset();
erraiHandler.onUncaughtException(e);
assertTrue(uncaughtHandlersLogger.getLogged().isEmpty());
}
public void testPrivateExceptionHandler() throws Exception {
final ErraiUncaughtExceptionHandler erraiHandler = assertErraiHandlerSet();
assertTrue(uncaughtHandlersLogger.getLogged().isEmpty());
final ExceptionForPrivateHandler e = new ExceptionForPrivateHandler();
erraiHandler.onUncaughtException(e);
assertEquals(1, uncaughtHandlersLogger.getLogged().size());
assertSame(e, uncaughtHandlersLogger.getLogged().get(0));
}
private ErraiUncaughtExceptionHandler assertErraiHandlerSet() throws Exception, AssertionError {
try {
testErraiUncaughtExceptionHandlerIsSet();
} catch (final AssertionError ae) {
throw new AssertionError("Precondition failed.", ae);
}
final ErraiUncaughtExceptionHandler erraiHandler = (ErraiUncaughtExceptionHandler) GWT.getUncaughtExceptionHandler();
return erraiHandler;
}
}