/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.ambari.server.notifications.dispatchers; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import javax.mail.AuthenticationFailedException; import javax.mail.MessagingException; import javax.mail.Transport; import org.apache.ambari.server.notifications.DispatchCallback; import org.apache.ambari.server.notifications.DispatchFactory; import org.apache.ambari.server.notifications.Notification; import org.apache.ambari.server.notifications.NotificationDispatcher; import org.apache.ambari.server.notifications.Recipient; import org.apache.ambari.server.notifications.TargetConfigurationResult; import org.apache.ambari.server.orm.InMemoryDefaultTestModule; import org.apache.ambari.server.state.alert.TargetType; import org.easymock.EasyMock; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.google.inject.Binder; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.util.Modules; /** * */ public class EmailDispatcherTest { private Injector m_injector; private DispatchFactory m_dispatchFactory; @Before public void before() throws Exception { m_injector = Guice.createInjector(Modules.override( new InMemoryDefaultTestModule()).with(new MockModule())); m_dispatchFactory = m_injector.getInstance(DispatchFactory.class); } /** * Tests that an email without recipients causes a callback error. */ @Test public void testNoRecipients() { Notification notification = new Notification(); DispatchCallback callback = EasyMock.createMock(DispatchCallback.class); notification.Callback = callback; List<String> callbackIds = new ArrayList<>(); callbackIds.add(UUID.randomUUID().toString()); notification.CallbackIds = callbackIds; callback.onFailure(callbackIds); EasyMock.expectLastCall(); EasyMock.replay(callback); NotificationDispatcher dispatcher = m_dispatchFactory.getDispatcher(TargetType.EMAIL.name()); dispatcher.dispatch(notification); EasyMock.verify(callback); } /** * Tests that an email without properties causes a callback error. */ @Test public void testNoEmailPropeties() { Notification notification = new Notification(); DispatchCallback callback = EasyMock.createMock(DispatchCallback.class); notification.Callback = callback; notification.Recipients = new ArrayList<>(); Recipient recipient = new Recipient(); recipient.Identifier = "foo"; notification.Recipients.add(recipient); List<String> callbackIds = new ArrayList<>(); callbackIds.add(UUID.randomUUID().toString()); notification.CallbackIds = callbackIds; callback.onFailure(callbackIds); EasyMock.expectLastCall(); EasyMock.replay(callback); NotificationDispatcher dispatcher = m_dispatchFactory.getDispatcher(TargetType.EMAIL.name()); dispatcher.dispatch(notification); EasyMock.verify(callback); } @Test public void testValidateTargetConfig_invalidOnAuthenticationException() throws Exception { Map<String, Object> properties = new HashMap<>(); Transport mockedTransport = EasyMock.createNiceMock(Transport.class); EmailDispatcher dispatcher = EasyMock.createMockBuilder(EmailDispatcher.class). addMockedMethods("getMailTransport").createNiceMock(); EasyMock.expect(dispatcher.getMailTransport(properties)).andReturn(mockedTransport); mockedTransport.connect(); EasyMock.expectLastCall().andThrow(new AuthenticationFailedException()); EasyMock.replay(dispatcher, mockedTransport); TargetConfigurationResult configValidationResult = dispatcher.validateTargetConfig(properties); Assert.assertEquals(TargetConfigurationResult.Status.INVALID, configValidationResult.getStatus()); } @Test public void testValidateTargetConfig_invalidOnMessagingException() throws Exception { Map<String, Object> properties = new HashMap<>(); Transport mockedTransport = EasyMock.createNiceMock(Transport.class); EmailDispatcher dispatcher = EasyMock.createMockBuilder(EmailDispatcher.class). addMockedMethods("getMailTransport").createNiceMock(); EasyMock.expect(dispatcher.getMailTransport(properties)).andReturn(mockedTransport); mockedTransport.connect(); EasyMock.expectLastCall().andThrow(new MessagingException()); EasyMock.replay(dispatcher, mockedTransport); TargetConfigurationResult configValidationResult = dispatcher.validateTargetConfig(properties); Assert.assertEquals(TargetConfigurationResult.Status.INVALID, configValidationResult.getStatus()); } @Test public void testValidateTargetConfig_validIfNoErrors() throws Exception { Map<String, Object> properties = new HashMap<>(); Transport mockedTransport = EasyMock.createNiceMock(Transport.class); EmailDispatcher dispatcher = EasyMock.createMockBuilder(EmailDispatcher.class). addMockedMethods("getMailTransport").createNiceMock(); EasyMock.expect(dispatcher.getMailTransport(properties)).andReturn(mockedTransport); EasyMock.replay(dispatcher, mockedTransport); TargetConfigurationResult configValidationResult = dispatcher.validateTargetConfig(properties); Assert.assertEquals(TargetConfigurationResult.Status.VALID, configValidationResult.getStatus()); } /** * */ private class MockModule implements Module { /** * */ @Override public void configure(Binder binder) { } } }