]> source.dussan.org Git - sonarqube.git/blob
8e4dc24ada81159f8929189e1fdf840f99d5cfa5
[sonarqube.git] /
1 /*
2  * SonarQube, open source software quality management tool.
3  * Copyright (C) 2008-2013 SonarSource
4  * mailto:contact AT sonarsource DOT com
5  *
6  * SonarQube is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 3 of the License, or (at your option) any later version.
10  *
11  * SonarQube is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19  */
20 package org.sonar.plugins.emailnotifications;
21
22 import org.apache.commons.mail.EmailException;
23 import org.junit.After;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.sonar.api.config.EmailSettings;
27 import org.sonar.plugins.emailnotifications.api.EmailMessage;
28 import org.subethamail.wiser.Wiser;
29 import org.subethamail.wiser.WiserMessage;
30
31 import javax.mail.internet.MimeMessage;
32
33 import java.io.IOException;
34 import java.net.ServerSocket;
35 import java.util.List;
36
37 import static org.hamcrest.Matchers.is;
38 import static org.hamcrest.Matchers.nullValue;
39 import static org.hamcrest.Matchers.startsWith;
40 import static org.junit.Assert.assertThat;
41 import static org.junit.Assert.fail;
42 import static org.mockito.Mockito.mock;
43 import static org.mockito.Mockito.when;
44
45 public class EmailNotificationChannelTest {
46
47   private int port;
48   private Wiser server;
49   private EmailSettings configuration;
50   private EmailNotificationChannel channel;
51
52   private static int getNextAvailablePort() {
53     try {
54       ServerSocket socket = new ServerSocket(0);
55       int unusedPort = socket.getLocalPort();
56       socket.close();
57       return unusedPort;
58     } catch (IOException e) {
59       throw new RuntimeException("Error getting an available port from system", e);
60     }
61   }
62
63   @Before
64   public void setUp() {
65     port = getNextAvailablePort();
66     server = new Wiser();
67     server.setPort(port);
68     server.start();
69
70     configuration = mock(EmailSettings.class);
71     channel = new EmailNotificationChannel(configuration, null, null);
72   }
73
74   @After
75   public void tearDown() {
76     server.stop();
77   }
78
79   @Test
80   public void shouldSendTestEmail() throws Exception {
81     configure();
82     channel.sendTestEmail("user@nowhere", "Test Message from Sonar", "This is a test message from Sonar.");
83
84     List<WiserMessage> messages = server.getMessages();
85     assertThat(messages.size(), is(1));
86
87     MimeMessage email = messages.get(0).getMimeMessage();
88     assertThat(email.getHeader("Content-Type", null), is("text/plain; charset=UTF-8"));
89     assertThat(email.getHeader("From", ","), is("Sonar <server@nowhere>"));
90     assertThat(email.getHeader("To", null), is("<user@nowhere>"));
91     assertThat(email.getHeader("Subject", null), is("[SONAR] Test Message from Sonar"));
92     assertThat((String) email.getContent(), startsWith("This is a test message from Sonar."));
93   }
94
95   @Test
96   public void shouldThrowAnExceptionWhenUnableToSendTestEmail() throws Exception {
97     configure();
98     server.stop();
99
100     try {
101       channel.sendTestEmail("user@nowhere", "Test Message from Sonar", "This is a test message from Sonar.");
102       fail();
103     } catch (EmailException e) {
104       // expected
105     }
106   }
107
108   @Test
109   public void shouldNotSendEmailWhenHostnameNotConfigured() throws Exception {
110     EmailMessage emailMessage = new EmailMessage()
111       .setTo("user@nowhere")
112       .setSubject("Foo")
113       .setMessage("Bar");
114     channel.deliver(emailMessage);
115     assertThat(server.getMessages().size(), is(0));
116   }
117
118   @Test
119   public void shouldSendThreadedEmail() throws Exception {
120     configure();
121     EmailMessage emailMessage = new EmailMessage()
122       .setMessageId("reviews/view/1")
123       .setFrom("Full Username")
124       .setTo("user@nowhere")
125       .setSubject("Review #3")
126       .setMessage("I'll take care of this violation.");
127     channel.deliver(emailMessage);
128
129     List<WiserMessage> messages = server.getMessages();
130     assertThat(messages.size(), is(1));
131
132     MimeMessage email = messages.get(0).getMimeMessage();
133
134     assertThat(email.getHeader("Content-Type", null), is("text/plain; charset=UTF-8"));
135
136     assertThat(email.getHeader("In-Reply-To", null), is("<reviews/view/1@nemo.sonarsource.org>"));
137     assertThat(email.getHeader("References", null), is("<reviews/view/1@nemo.sonarsource.org>"));
138
139     assertThat(email.getHeader("List-ID", null), is("Sonar <sonar.nemo.sonarsource.org>"));
140     assertThat(email.getHeader("List-Archive", null), is("http://nemo.sonarsource.org"));
141
142     assertThat(email.getHeader("From", ","), is("\"Full Username (Sonar)\" <server@nowhere>"));
143     assertThat(email.getHeader("To", null), is("<user@nowhere>"));
144     assertThat(email.getHeader("Subject", null), is("[SONAR] Review #3"));
145     assertThat((String) email.getContent(), startsWith("I'll take care of this violation."));
146   }
147
148   @Test
149   public void shouldSendNonThreadedEmail() throws Exception {
150     configure();
151     EmailMessage emailMessage = new EmailMessage()
152       .setTo("user@nowhere")
153       .setSubject("Foo")
154       .setMessage("Bar");
155     channel.deliver(emailMessage);
156
157     List<WiserMessage> messages = server.getMessages();
158     assertThat(messages.size(), is(1));
159
160     MimeMessage email = messages.get(0).getMimeMessage();
161
162     assertThat(email.getHeader("Content-Type", null), is("text/plain; charset=UTF-8"));
163
164     assertThat(email.getHeader("In-Reply-To", null), nullValue());
165     assertThat(email.getHeader("References", null), nullValue());
166
167     assertThat(email.getHeader("List-ID", null), is("Sonar <sonar.nemo.sonarsource.org>"));
168     assertThat(email.getHeader("List-Archive", null), is("http://nemo.sonarsource.org"));
169
170     assertThat(email.getHeader("From", null), is("Sonar <server@nowhere>"));
171     assertThat(email.getHeader("To", null), is("<user@nowhere>"));
172     assertThat(email.getHeader("Subject", null), is("[SONAR] Foo"));
173     assertThat((String) email.getContent(), startsWith("Bar"));
174   }
175
176   @Test
177   public void shouldNotThrowAnExceptionWhenUnableToSendEmail() throws Exception {
178     configure();
179     server.stop();
180
181     EmailMessage emailMessage = new EmailMessage()
182       .setTo("user@nowhere")
183       .setSubject("Foo")
184       .setMessage("Bar");
185     channel.deliver(emailMessage);
186   }
187
188   private void configure() {
189     when(configuration.getSmtpHost()).thenReturn("localhost");
190     when(configuration.getSmtpPort()).thenReturn(port);
191     when(configuration.getFrom()).thenReturn("server@nowhere");
192     when(configuration.getPrefix()).thenReturn("[SONAR]");
193     when(configuration.getServerBaseURL()).thenReturn("http://nemo.sonarsource.org");
194   }
195
196 }