View Javadoc
1   /**
2    * Copyright (c) 2012-2014, jcabi.com
3    * All rights reserved.
4    *
5    * Redistribution and use in source and binary forms, with or without
6    * modification, are permitted provided that the following conditions
7    * are met: 1) Redistributions of source code must retain the above
8    * copyright notice, this list of conditions and the following
9    * disclaimer. 2) Redistributions in binary form must reproduce the above
10   * copyright notice, this list of conditions and the following
11   * disclaimer in the documentation and/or other materials provided
12   * with the distribution. 3) Neither the name of the jcabi.com nor
13   * the names of its contributors may be used to endorse or promote
14   * products derived from this software without specific prior written
15   * permission.
16   *
17   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
19   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21   * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
22   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28   * OF THE POSSIBILITY OF SUCH DAMAGE.
29   */
30  package com.jcabi.beanstalk.maven.plugin;
31  
32  import com.amazonaws.auth.AWSCredentials;
33  import com.amazonaws.auth.BasicAWSCredentials;
34  import com.amazonaws.services.elasticbeanstalk.AWSElasticBeanstalk;
35  import com.amazonaws.services.elasticbeanstalk.AWSElasticBeanstalkClient;
36  import com.amazonaws.services.elasticbeanstalk.model.CheckDNSAvailabilityRequest;
37  import com.amazonaws.services.elasticbeanstalk.model.CheckDNSAvailabilityResult;
38  import com.amazonaws.services.elasticbeanstalk.model.ConfigurationSettingsDescription;
39  import com.amazonaws.services.elasticbeanstalk.model.CreateEnvironmentRequest;
40  import com.amazonaws.services.elasticbeanstalk.model.CreateEnvironmentResult;
41  import com.amazonaws.services.elasticbeanstalk.model.DescribeConfigurationSettingsRequest;
42  import com.amazonaws.services.elasticbeanstalk.model.DescribeConfigurationSettingsResult;
43  import com.amazonaws.services.elasticbeanstalk.model.DescribeEnvironmentsRequest;
44  import com.amazonaws.services.elasticbeanstalk.model.DescribeEnvironmentsResult;
45  import com.amazonaws.services.elasticbeanstalk.model.EnvironmentDescription;
46  import com.amazonaws.services.elasticbeanstalk.model.TerminateEnvironmentRequest;
47  import com.amazonaws.services.elasticbeanstalk.model.TerminateEnvironmentResult;
48  import com.amazonaws.services.s3.AmazonS3Client;
49  import com.jcabi.log.Logger;
50  import java.io.File;
51  import java.util.ArrayList;
52  import java.util.Arrays;
53  import org.apache.commons.io.FileUtils;
54  import org.hamcrest.MatcherAssert;
55  import org.hamcrest.Matchers;
56  import org.junit.Assume;
57  import org.junit.Rule;
58  import org.junit.Test;
59  import org.junit.rules.TemporaryFolder;
60  import org.mockito.Mockito;
61  
62  /**
63   * Test case for {@link Application}.
64   * @author Yegor Bugayenko (yegor@tpc2.com)
65   * @version $Id$
66   * @checkstyle ClassDataAbstractionCoupling (500 lines)
67   */
68  @SuppressWarnings("PMD.ExcessiveImports")
69  public final class ApplicationTest {
70  
71      /**
72       * AWS key, if provided in command line.
73       */
74      private static final String AWS_KEY = System.getProperty("aws.key");
75  
76      /**
77       * AWS secret, if provided in command line.
78       */
79      private static final String AWS_SECRET = System.getProperty("aws.secret");
80  
81      /**
82       * Temporary folder.
83       * @checkstyle VisibilityModifier (3 lines)
84       */
85      @Rule
86      public transient TemporaryFolder temp = new TemporaryFolder();
87  
88      /**
89       * Application can create a new environment.
90       * @throws Exception If something is wrong
91       */
92      @Test
93      public void createsNewEnvironment() throws Exception {
94          final String name = "some-app-name";
95          final String template = "some-template";
96          final Version version = Mockito.mock(Version.class);
97          final AWSElasticBeanstalk ebt = Mockito.mock(AWSElasticBeanstalk.class);
98          Mockito.doReturn(
99              new CheckDNSAvailabilityResult().withAvailable(true)
100         ).when(ebt)
101             .checkDNSAvailability(
102                 Mockito.any(CheckDNSAvailabilityRequest.class)
103             );
104         Mockito.doReturn(
105             new CreateEnvironmentResult()
106                 .withApplicationName(name)
107                 .withEnvironmentId("f4g5h6j7")
108                 .withEnvironmentName(name)
109         ).when(ebt)
110             .createEnvironment(
111                 Mockito.any(CreateEnvironmentRequest.class)
112             );
113         Mockito.doReturn(
114             new DescribeConfigurationSettingsResult().withConfigurationSettings(
115                 new ArrayList<ConfigurationSettingsDescription>(0)
116             )
117         ).when(ebt)
118             .describeConfigurationSettings(
119                 Mockito.any(DescribeConfigurationSettingsRequest.class)
120             );
121         Mockito.doReturn(
122             new DescribeEnvironmentsResult().withEnvironments(
123                 Arrays.asList(
124                     new EnvironmentDescription()
125                         .withCNAME("")
126                         .withEnvironmentName("some-env")
127                         .withEnvironmentId("a1b2c3d4")
128                         .withStatus("Ready")
129                 )
130             )
131         ).when(ebt)
132             .describeEnvironments(
133                 Mockito.any(DescribeEnvironmentsRequest.class)
134             );
135         Mockito.doReturn(new TerminateEnvironmentResult())
136             .when(ebt)
137             .terminateEnvironment(
138                 Mockito.any(TerminateEnvironmentRequest.class)
139             );
140         final Application app = new Application(ebt, name);
141         app.clean(false);
142         MatcherAssert.assertThat(
143             app.candidate(version, template),
144             Matchers.notNullValue()
145         );
146     }
147 
148     /**
149      * Environment can deploy and reverse with a broken WAR file. This test
150      * has to be executed only if you have full access to AWS S3 bucket, and
151      * AWS EBT for deployment. The test runs full cycle of deployment and then
152      * destroying of a new environment. It won't hurt anything, but will
153      * consume some EBT resources. Be careful.
154      *
155      * @throws Exception If something is wrong
156      */
157     @Test
158     public void deploysAndReversesWithLiveAccount() throws Exception {
159         Assume.assumeThat(ApplicationTest.AWS_KEY, Matchers.notNullValue());
160         final AWSCredentials creds = new BasicAWSCredentials(
161             ApplicationTest.AWS_KEY,
162             ApplicationTest.AWS_SECRET
163         );
164         final AWSElasticBeanstalk ebt = new AWSElasticBeanstalkClient(creds);
165         final String name = "netbout";
166         final Application app = new Application(ebt, name);
167         final File war = this.temp.newFile("temp.war");
168         FileUtils.writeStringToFile(war, "broken JAR file content");
169         final Environment candidate = app.candidate(
170             new OverridingVersion(
171                 ebt,
172                 name,
173                 new OverridingBundle(
174                     new AmazonS3Client(creds),
175                     "webapps.netbout.com",
176                     war.getName(),
177                     war
178                 )
179             ),
180             name
181         );
182         MatcherAssert.assertThat(candidate.green(), Matchers.equalTo(false));
183         Logger.info(this, "tail report:\n%s", candidate.tail());
184         candidate.terminate();
185     }
186 
187 }