1
1
package com .octopus ;
2
2
3
- import com .amazonaws .regions .Regions ;
4
- import com .amazonaws .services .simpleemail .AmazonSimpleEmailService ;
5
- import com .amazonaws .services .simpleemail .AmazonSimpleEmailServiceClientBuilder ;
6
- import com .amazonaws .services .simpleemail .model .*;
3
+ import com .amazonaws .services .lambda .runtime .Context ;
4
+ import com .octopus .eventhandlers .EventHandler ;
5
+ import com .octopus .eventhandlers .impl .SeqLogging ;
6
+ import com .octopus .eventhandlers .impl .SlackWebHook ;
7
+ import com .octopus .eventhandlers .impl .UploadToS3 ;
8
+ import com .octopus .utils .EnvironmentAliasesProcessor ;
9
+ import com .octopus .utils .ZipUtils ;
10
+ import com .octopus .utils .impl .AutoDeletingTempDir ;
11
+ import com .octopus .utils .impl .AutoDeletingTempFile ;
12
+ import com .octopus .utils .impl .EnvironmentAliasesProcessorImpl ;
13
+ import com .octopus .utils .impl .ZipUtilsImpl ;
14
+ import io .vavr .control .Try ;
7
15
import org .apache .commons .io .FileUtils ;
8
- import java .io .*;
16
+ import org .apache .commons .lang3 .math .NumberUtils ;
17
+
18
+ import java .io .File ;
19
+ import java .io .IOException ;
20
+ import java .io .PrintWriter ;
9
21
import java .net .MalformedURLException ;
10
22
import java .net .URL ;
11
23
import java .nio .charset .Charset ;
12
24
import java .nio .file .Files ;
13
- import java .util .zip .ZipEntry ;
14
- import java .util .zip .ZipInputStream ;
25
+ import java .util .Arrays ;
26
+ import java .util .HashMap ;
27
+
28
+ import static com .google .common .base .Preconditions .checkNotNull ;
15
29
16
30
public class LambdaEntry {
31
+ private static final EnvironmentAliasesProcessor ENVIRONMENT_ALIASES_PROCESSOR =
32
+ new EnvironmentAliasesProcessorImpl ();
33
+ private static final String RETRY_HEADER = "Test-Retry" ;
34
+ private static final String RETRY_SLEEP_HEADER = "Test-Retry-Sleep" ;
35
+ private static final ZipUtils ZIP_UTILS = new ZipUtilsImpl ();
36
+ private static final EventHandler [] EVENT_HANDLERS = new EventHandler []{
37
+ new UploadToS3 (),
38
+ new SlackWebHook (),
39
+ new SeqLogging ()
40
+ };
17
41
private static final String CHROME_HEADLESS_PACKAGE =
18
- "https ://s3.amazonaws.com/webdriver-testing-resources /stable-headless-chromium-amazonlinux-2017-03.zip" ;
42
+ "http ://bamboo-support. s3.amazonaws.com/chrome-68-stable /stable-headless-chromium-amazonlinux-2017-03.zip" ;
19
43
private static final String CHROME_DRIVER =
20
- "https ://s3.amazonaws.com/webdriver-testing-resources /chromedriver_linux64.zip" ;
44
+ "http ://bamboo-support. s3.amazonaws.com/chrome-68-stable /chromedriver_linux64.zip" ;
21
45
22
- public String runCucumber (String feature ) throws Throwable {
23
-
24
- File driverDirectory = null ;
25
- File chromeDirectory = null ;
26
- File outputFile = null ;
27
- File txtOutputFile = null ;
28
- File featureFile = null ;
29
-
30
- try {
31
- driverDirectory = downloadChromeDriver ();
32
- chromeDirectory = downloadChromeHeadless ();
33
- outputFile = Files .createTempFile ("output" , ".json" ).toFile ();
34
- txtOutputFile = Files .createTempFile ("output" , ".txt" ).toFile ();
35
- featureFile = writeFeatureToFile (feature );
46
+ public String runCucumber (final LambdaInput input , final Context context ) throws Throwable {
47
+ checkNotNull (input );
36
48
37
- io .cucumber .core .cli .Main .run (
38
- new String []{
39
- "--monochrome" ,
40
- "--glue" , "com.octopus.decoratorbase" ,
41
- "--format" , "json:" + outputFile .toString (),
42
- "--format" , "pretty:" + txtOutputFile .toString (),
43
- featureFile .getAbsolutePath ()},
44
- Thread .currentThread ().getContextClassLoader ());
49
+ System .out .println ("STARTED Cucumber Test ID " + input .getId ());
45
50
46
- sendEmail ( "admin@matthewcasperson.com" , FileUtils . readFileToString ( txtOutputFile , Charset . defaultCharset ()) );
51
+ cleanTmpFolder ( );
47
52
48
- return FileUtils .readFileToString (outputFile , Charset .defaultCharset ());
53
+ File outputFile = null ;
54
+ File txtOutputFile = null ;
55
+ File htmlOutput = null ;
56
+ File junitOutput = null ;
57
+
58
+ try (final AutoDeletingTempDir driverDirectory = new AutoDeletingTempDir (downloadChromeDriver ())) {
59
+ try (final AutoDeletingTempDir chromeDirectory = new AutoDeletingTempDir (downloadChromeHeadless ())) {
60
+ try (final AutoDeletingTempFile featureFile = new AutoDeletingTempFile (writeFeatureToFile (input .getFeature ()))) {
61
+
62
+ ENVIRONMENT_ALIASES_PROCESSOR .addHeaderVarsAsAliases (input .getHeaders ());
63
+
64
+ final int retryCount = NumberUtils .toInt (
65
+ input .getHeaders ().getOrDefault (RETRY_HEADER , "1" ),
66
+ 1 );
67
+
68
+ final int retrySleep = NumberUtils .toInt (
69
+ input .getHeaders ().getOrDefault (RETRY_SLEEP_HEADER , "60" ),
70
+ 60 );
71
+
72
+ int retValue = 0 ;
73
+
74
+ for (int x = 0 ; x < retryCount ; ++x ) {
75
+ outputFile = createCleanFile (outputFile , "output" , ".json" );
76
+ txtOutputFile = createCleanFile (txtOutputFile , "output" , ".txt" );
77
+ junitOutput = createCleanFile (junitOutput , "junit" , ".xml" );
78
+ htmlOutput = createCleanDirectory (htmlOutput , "htmloutput" );
79
+
80
+ retValue = cucumber .api .cli .Main .run (
81
+ new String []{
82
+ "--monochrome" ,
83
+ "--glue" , "com.octopus.decoratorbase" ,
84
+ "--plugin" , "json:" + outputFile .toString (),
85
+ "--plugin" , "pretty:" + txtOutputFile .toString (),
86
+ "--plugin" , "html:" + htmlOutput .toString (),
87
+ "--plugin" , "junit:" + junitOutput .toString (),
88
+ featureFile .getFile ().getAbsolutePath ()},
89
+ Thread .currentThread ().getContextClassLoader ());
90
+ if (retValue == 0 ) {
91
+ break ;
92
+ }
93
+
94
+ Try .run (() -> Thread .sleep (retrySleep ));
95
+ }
49
96
97
+ System .out .println ((retValue == 0 ? "SUCCEEDED" : "FAILED" ) + " Cucumber Test ID " + input .getId ());
98
+
99
+ final String featureFilePath = featureFile .getFile ().getAbsolutePath ();
100
+ final String htmlOutputDir = htmlOutput .getAbsolutePath ();
101
+ final boolean status = retValue == 0 ;
102
+ final String outputTextFile = FileUtils .readFileToString (txtOutputFile , Charset .defaultCharset ());
103
+ Arrays .stream (EVENT_HANDLERS ).reduce (
104
+ new HashMap <String , String >(),
105
+ (results , handler ) -> new HashMap <>(handler .finished (
106
+ input .getId (),
107
+ status ,
108
+ featureFilePath ,
109
+ outputTextFile ,
110
+ htmlOutputDir ,
111
+ input .getHeaders (),
112
+ results )),
113
+ (a , b ) -> a
114
+ );
115
+
116
+ return FileUtils .readFileToString (outputFile , Charset .defaultCharset ());
117
+ }
118
+ }
50
119
} finally {
51
- FileUtils .deleteQuietly (driverDirectory );
52
- FileUtils .deleteQuietly (chromeDirectory );
53
120
FileUtils .deleteQuietly (outputFile );
54
121
FileUtils .deleteQuietly (txtOutputFile );
55
- FileUtils .deleteQuietly (featureFile );
122
+ FileUtils .deleteQuietly (htmlOutput );
123
+ FileUtils .deleteQuietly (junitOutput );
124
+
125
+ System .out .println ("FINISHED Cucumber Test ID " + input .getId ());
56
126
}
57
127
}
58
128
129
+ private File createCleanFile (final File last , final String prefix , final String suffix ) throws IOException {
130
+ FileUtils .deleteQuietly (last );
131
+ return Files .createTempFile (prefix , suffix ).toFile ();
132
+ }
133
+
134
+ private File createCleanDirectory (final File last , final String name ) throws IOException {
135
+ FileUtils .deleteQuietly (last );
136
+ return Files .createTempDirectory (name ).toFile ();
137
+ }
138
+
59
139
private File downloadChromeDriver () throws IOException {
60
140
final File extractedDir = downloadAndExtractFile (CHROME_DRIVER , "chrome_driver" );
61
141
final String driver = extractedDir .getAbsolutePath () + "/chromedriver" ;
@@ -78,35 +158,14 @@ private File downloadAndExtractFile(final String download, final String tempDirP
78
158
downloadedFile = File .createTempFile ("download" , ".zip" );
79
159
FileUtils .copyURLToFile (new URL (download ), downloadedFile );
80
160
final File extractedDir = Files .createTempDirectory (tempDirPrefix ).toFile ();
81
- unzipFile (downloadedFile .getAbsolutePath (), extractedDir .getAbsolutePath ());
161
+ ZIP_UTILS . unzipFile (downloadedFile .getAbsolutePath (), extractedDir .getAbsolutePath ());
82
162
return extractedDir ;
83
163
} finally {
84
164
FileUtils .deleteQuietly (downloadedFile );
85
165
}
86
166
87
167
}
88
168
89
- private void unzipFile (final String fileZip , final String outputDirectory ) throws IOException {
90
-
91
- final byte [] buffer = new byte [1024 ];
92
-
93
- try (final ZipInputStream zis = new ZipInputStream (new FileInputStream (fileZip ))) {
94
- ZipEntry zipEntry = zis .getNextEntry ();
95
- while (zipEntry != null ) {
96
- final String fileName = zipEntry .getName ();
97
- final File newFile = new File (outputDirectory + "/" + fileName );
98
- try (final FileOutputStream fos = new FileOutputStream (newFile )) {
99
- int len ;
100
- while ((len = zis .read (buffer )) > 0 ) {
101
- fos .write (buffer , 0 , len );
102
- }
103
- }
104
- zipEntry = zis .getNextEntry ();
105
- }
106
- zis .closeEntry ();
107
- }
108
- }
109
-
110
169
private File writeFeatureToFile (final String feature ) throws IOException {
111
170
final File featureFile = File .createTempFile ("cucumber" , ".feature" );
112
171
try {
@@ -120,24 +179,15 @@ private File writeFeatureToFile(final String feature) throws IOException {
120
179
return featureFile ;
121
180
}
122
181
123
- private void sendEmail (final String to , final String results ) {
182
+ /**
183
+ * Before we start, try cleaning the tmp directory to remove
184
+ * any left over files.
185
+ */
186
+ private void cleanTmpFolder () {
124
187
try {
125
- final AmazonSimpleEmailService client = AmazonSimpleEmailServiceClientBuilder .standard ()
126
- .withRegion (Regions .US_EAST_1 ).build ();
127
-
128
- final SendEmailRequest request = new SendEmailRequest ()
129
- .withDestination (new Destination ()
130
- .withToAddresses (to ))
131
- .withMessage (new Message ()
132
- .withBody (new Body ()
133
- .withText (new Content ()
134
- .withCharset ("UTF-8" ).withData (results )))
135
- .withSubject (new Content ()
136
- .withCharset ("UTF-8" ).withData ("WebDriver Test Results" )))
137
- .withSource ("admin@matthewcasperson.com" );
138
- client .sendEmail (request );
139
- } catch (final Exception ex ) {
140
- System .out .println ("The email was not sent. Error message: " + ex .getMessage ());
188
+ FileUtils .cleanDirectory (new File ("/tmp" ));
189
+ } catch (IOException e ) {
190
+ // silent failure
141
191
}
142
192
}
143
193
}
0 commit comments