1 package org.apache.maven.continuum.notification.mail;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.continuum.dao.BuildDefinitionDao;
23 import org.apache.continuum.dao.BuildResultDao;
24 import org.apache.continuum.notification.mail.MockJavaMailSender;
25 import org.apache.maven.continuum.AbstractContinuumTest;
26 import org.apache.maven.continuum.model.project.BuildDefinition;
27 import org.apache.maven.continuum.model.project.BuildResult;
28 import org.apache.maven.continuum.model.project.Project;
29 import org.apache.maven.continuum.model.project.ProjectGroup;
30 import org.apache.maven.continuum.model.project.ProjectNotifier;
31 import org.apache.maven.continuum.notification.ContinuumNotificationDispatcher;
32 import org.apache.maven.continuum.notification.MessageContext;
33 import org.apache.maven.continuum.notification.Notifier;
34 import org.apache.maven.continuum.project.ContinuumProjectState;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37 import org.springframework.mail.javamail.JavaMailSender;
38
39 import java.util.ArrayList;
40 import java.util.HashMap;
41 import java.util.List;
42 import java.util.Map;
43 import javax.mail.Address;
44 import javax.mail.internet.InternetAddress;
45 import javax.mail.internet.MimeMessage;
46 import javax.mail.internet.MimeMessage.RecipientType;
47
48
49
50
51
52 public class MailContinuumNotifierTest
53 extends AbstractContinuumTest
54 {
55 protected static final Logger logger = LoggerFactory.getLogger( MailContinuumNotifierTest.class );
56
57 public void testSuccessfulBuild()
58 throws Exception
59 {
60 MailContinuumNotifier notifier = (MailContinuumNotifier) lookup( Notifier.class.getName(), "mail" );
61 String toOverride = "recipient@host.com";
62 notifier.setToOverride( toOverride );
63
64 ProjectGroup group = createStubProjectGroup( "foo.bar", "" );
65
66 BuildResultDao brDao = (BuildResultDao) lookup( BuildResultDao.class );
67 Project project = addProject( "Test Project", group );
68 BuildResult br = makeBuild( ContinuumProjectState.FAILED );
69 brDao.addBuildResult( project, br );
70
71 br = makeBuild( ContinuumProjectState.OK );
72 brDao.addBuildResult( project, br );
73
74 br = makeBuild( ContinuumProjectState.FAILED );
75 brDao.addBuildResult( project, br );
76
77 BuildResult build = makeBuild( ContinuumProjectState.OK );
78 assertEquals( ContinuumProjectState.OK, build.getState() );
79
80 project.setState( build.getState() );
81 getProjectDao().updateProject( project );
82
83 BuildDefinition buildDef = new BuildDefinition();
84 buildDef.setType( "maven2" );
85 buildDef.setBuildFile( "pom.xml" );
86 buildDef.setGoals( "clean install" );
87 buildDef.setArguments( "" );
88 BuildDefinitionDao buildDefDao = (BuildDefinitionDao) lookup( BuildDefinitionDao.class );
89 buildDef = buildDefDao.addBuildDefinition( buildDef );
90 build.setBuildDefinition( buildDef );
91 assertEquals( ContinuumProjectState.OK, build.getState() );
92
93 brDao.addBuildResult( project, build );
94 build = brDao.getLatestBuildResultForProjectWithDetails( project.getId() );
95 assertEquals( ContinuumProjectState.OK, build.getState() );
96
97 MimeMessage mailMessage = sendNotificationAndGetMessage( project, build, buildDef, "lots out build output",
98 toOverride );
99
100 assertEquals( "[continuum] BUILD SUCCESSFUL: foo.bar Test Project", mailMessage.getSubject() );
101
102 String mailContent = dumpContent( mailMessage, "recipient@host.com" );
103
104
105 assertTrue( mailContent.indexOf( "Goals: clean install" ) > 0 );
106 }
107
108 public void testFailedBuild()
109 throws Exception
110 {
111 ProjectGroup group = createStubProjectGroup( "foo.bar", "" );
112
113 Project project = addProject( "Test Project", group );
114
115 BuildResult build = makeBuild( ContinuumProjectState.FAILED );
116
117 MimeMessage mailMessage = sendNotificationAndGetMessage( project, build, null, "output", null );
118
119 assertEquals( "[continuum] BUILD FAILURE: foo.bar Test Project", mailMessage.getSubject() );
120
121 dumpContent( mailMessage );
122 }
123
124 public void testErrorenousBuild()
125 throws Exception
126 {
127 ProjectGroup group = createStubProjectGroup( "foo.bar", "" );
128
129 Project project = addProject( "Test Project", group );
130
131 BuildResult build = makeBuild( ContinuumProjectState.ERROR );
132
133 build.setError( "Big long error message" );
134
135 MimeMessage mailMessage = sendNotificationAndGetMessage( project, build, null, "lots of stack traces", null );
136
137 assertEquals( "[continuum] BUILD ERROR: foo.bar Test Project", mailMessage.getSubject() );
138
139 dumpContent( mailMessage );
140 }
141
142 private String dumpContent( MimeMessage mailMessage )
143 throws Exception
144 {
145 return dumpContent( mailMessage, null );
146 }
147
148 private String dumpContent( MimeMessage mailMessage, String toOverride )
149 throws Exception
150 {
151 Address[] tos = mailMessage.getRecipients( RecipientType.TO );
152 if ( toOverride != null )
153 {
154 assertEquals( toOverride, ( (InternetAddress) tos[0] ).getAddress() );
155 }
156 else
157 {
158 assertEquals( "foo@bar", ( (InternetAddress) tos[0] ).getAddress() );
159 }
160 assertTrue( "The template isn't loaded correctly.", ( (String) mailMessage.getContent() ).indexOf(
161 "#shellBuildResult()" ) < 0 );
162 assertTrue( "The template isn't loaded correctly.", ( (String) mailMessage.getContent() ).indexOf(
163 "Build statistics" ) > 0 );
164
165 String mailContent = (String) mailMessage.getContent();
166
167 logger.info( mailContent );
168
169 return mailContent;
170 }
171
172
173
174
175
176 private MimeMessage sendNotificationAndGetMessage( Project project, BuildResult build, BuildDefinition buildDef,
177 String buildOutput, String toOverride )
178 throws Exception
179 {
180 MessageContext context = new MessageContext();
181
182 context.setProject( project );
183
184 context.setBuildResult( build );
185
186 context.setBuildDefinition( buildDef );
187
188 ProjectNotifier projectNotifier = new ProjectNotifier();
189 projectNotifier.setType( "mail" );
190 Map<String, String> config = new HashMap<String, String>();
191 config.put( MailContinuumNotifier.ADDRESS_FIELD, "foo@bar" );
192 projectNotifier.setConfiguration( config );
193 List<ProjectNotifier> projectNotifiers = new ArrayList<ProjectNotifier>();
194 projectNotifiers.add( projectNotifier );
195 context.setNotifier( projectNotifiers );
196
197
198
199
200
201
202
203
204
205 Notifier notifier = (Notifier) lookup( Notifier.class.getName(), "mail" );
206
207 ( (MailContinuumNotifier) notifier ).setBuildHost( "foo.bar.com" );
208
209 notifier.sendMessage( ContinuumNotificationDispatcher.MESSAGE_ID_BUILD_COMPLETE, context );
210
211
212
213
214
215 MockJavaMailSender mailSender = (MockJavaMailSender) lookup( JavaMailSender.class, "continuum" );
216
217 assertEquals( 1, mailSender.getReceivedEmails().size() );
218
219 List<MimeMessage> mails = mailSender.getReceivedEmails();
220
221 MimeMessage mailMessage = mails.get( 0 );
222
223
224
225
226
227 assertEquals( "continuum@localhost", ( (InternetAddress) mailMessage.getFrom()[0] ).getAddress() );
228
229 assertEquals( "Continuum", ( (InternetAddress) mailMessage.getFrom()[0] ).getPersonal() );
230
231 Address[] tos = mailMessage.getRecipients( RecipientType.TO );
232
233 assertEquals( 1, tos.length );
234
235 assertEquals( toOverride == null ? "foo@bar" : toOverride, ( (InternetAddress) tos[0] ).getAddress() );
236
237 return mailMessage;
238 }
239
240 private BuildResult makeBuild( int state )
241 {
242 BuildResult build = new BuildResult();
243
244 build.setStartTime( System.currentTimeMillis() );
245
246 build.setEndTime( System.currentTimeMillis() + 1234567 );
247
248 build.setState( state );
249
250 build.setTrigger( ContinuumProjectState.TRIGGER_FORCED );
251
252 build.setExitCode( 10 );
253
254 return build;
255 }
256 }