View Javadoc

1   package org.apache.maven.continuum.notification.mail;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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   * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
50   * @version $Id: MailContinuumNotifierTest.java 1372260 2012-08-13 04:29:09Z brett $
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         //CONTINUUM-1946
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         //context.put( ContinuumNotificationDispatcher.CONTEXT_BUILD_OUTPUT, buildOutput );
198 
199         //context.put( "buildHost", "foo.bar.com" );
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 }