content: /*
   * 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) {
      }
    }
  }
  