@@ -16,7 +16,7 @@ const fs = require('fs');
16
16
* /screenshot/reports/$prNumber.
17
17
* These are data for screenshot results (success or failure), GitHub PR/commit and TravisCI job information
18
18
*
19
- * For valid image datas written to database /$temp/screenshot/images/$prNumber/$secureToken/, save the image
19
+ * For valid image results written to database /$temp/screenshot/images/$prNumber/$secureToken/, save the image
20
20
* data to image files and upload to google cloud storage under location /screenshots/$prNumber
21
21
* These are screenshot test result images, and difference images generated from screenshot comparison.
22
22
*
@@ -48,26 +48,35 @@ const bucket = gcs.bucket(firebaseFunctions.config().firebase.storageBucket);
48
48
/** The Json Web Token format. The token is stored in data path. */
49
49
const jwtFormat = '{jwtHeader}/{jwtPayload}/{jwtSignature}' ;
50
50
51
- /** The temporary folder name */
52
- const tempFolder = '/screenshotQueue ' ;
51
+ /** The temporary folder name for screenshot data that needs to be validated via JWT. */
52
+ const tempFolder = '/untrustedInbox ' ;
53
53
54
- /** Copy valid data from /$temp/screenshot/reports/$prNumber/$secureToken/ to /screenshot/reports/$prNumber */
54
+ /**
55
+ * Copy valid data from /$temp/screenshot/reports/$prNumber/$secureToken/ to /screenshot/reports/$prNumber
56
+ * Data copied: filenames(image results names), commit(github PR info),
57
+ * sha (github PR info), result (true or false for all the tests), travis job number
58
+ */
55
59
const copyDataPath = `${ tempFolder } /screenshot/reports/{prNumber}/${ jwtFormat } /{dataType}` ;
56
60
exports . copyData = firebaseFunctions . database . ref ( copyDataPath ) . onWrite ( event => {
57
61
const dataType = event . params . dataType ;
58
62
if ( dataTypes . includes ( dataType ) ) {
59
- return handleDataChange ( event , dataType ) ;
63
+ return verifyAndCopyScreenshotResult ( event , dataType ) ;
60
64
}
61
- return ;
62
65
} ) ;
63
66
64
- /** Copy valid data from /$temp/screenshot/reports/$prNumber/$secureToken/ to /screenshot/reports/$prNumber */
67
+ /**
68
+ * Copy valid data from /$temp/screenshot/reports/$prNumber/$secureToken/ to /screenshot/reports/$prNumber
69
+ * Data copied: test result for each file/test with ${filename}. The value should be true or false.
70
+ */
65
71
const copyDataResultPath = `${ tempFolder } /screenshot/reports/{prNumber}/${ jwtFormat } /results/{filename}` ;
66
72
exports . copyDataResult = firebaseFunctions . database . ref ( copyDataResultPath ) . onWrite ( event => {
67
- return handleDataChange ( event , `results/${ event . params . filename } ` ) ;
73
+ return verifyAndCopyScreenshotResult ( event , `results/${ event . params . filename } ` ) ;
68
74
} ) ;
69
75
70
- /** Copy valid data from database /$temp/screenshot/images/$prNumber/$secureToken/ to storage /screenshots/$prNumber */
76
+ /**
77
+ * Copy valid data from database /$temp/screenshot/images/$prNumber/$secureToken/ to storage /screenshots/$prNumber
78
+ * Data copied: test result images. Convert from data to image files in storage.
79
+ */
71
80
const copyImagePath = `${ tempFolder } /screenshot/images/{prNumber}/${ jwtFormat } /{dataType}/{filename}` ;
72
81
exports . copyImage = firebaseFunctions . database . ref ( copyImagePath ) . onWrite ( event => {
73
82
// Only edit data when it is first created. Exit when the data is deleted.
@@ -84,7 +93,7 @@ exports.copyImage = firebaseFunctions.database.ref(copyImagePath).onWrite(event
84
93
return ;
85
94
}
86
95
87
- return validateSecureToken ( secureToken , prNumber ) . then ( ( payload ) => {
96
+ return verifySecureToken ( secureToken , prNumber ) . then ( ( payload ) => {
88
97
const tempPath = `/tmp/${ dataType } -${ saveFilename } `
89
98
const filePath = `screenshots/${ prNumber } /${ dataType } /${ saveFilename } ` ;
90
99
const binaryData = new Buffer ( event . data . val ( ) , 'base64' ) . toString ( 'binary' ) ;
@@ -105,6 +114,7 @@ exports.copyImage = firebaseFunctions.database.ref(copyImagePath).onWrite(event
105
114
*/
106
115
exports . copyGoldens = firebaseFunctions . storage . bucket ( firebaseFunctions . config ( ) . firebase . storageBucket )
107
116
. object ( ) . onChange ( event => {
117
+ // The filePath should always l ook like "goldens/xxx.png"
108
118
const filePath = event . data . name ;
109
119
110
120
// Get the file name.
@@ -114,7 +124,7 @@ exports.copyGoldens = firebaseFunctions.storage.bucket(firebaseFunctions.config(
114
124
}
115
125
const filenameKey = fileNames [ 1 ] . replace ( '.screenshot.png' , '' ) ;
116
126
117
- // When delete a file, remove the file in database
127
+ // When a gold image is deleted, also delete the corresponding record in the firebase database.
118
128
if ( event . data . resourceState === 'not_exists' ) {
119
129
return firebaseAdmin . database ( ) . ref ( `screenshot/goldens/${ filenameKey } ` ) . set ( null ) ;
120
130
}
@@ -132,7 +142,7 @@ exports.copyGoldens = firebaseFunctions.storage.bucket(firebaseFunctions.config(
132
142
* Handle data written to temporary folder. Validate the JWT and move the data out of
133
143
* temporary folder if the token is valid.
134
144
*/
135
- function handleDataChange ( event , path ) {
145
+ function verifyAndCopyScreenshotResult ( event , path ) {
136
146
// Only edit data when it is first created. Exit when the data is deleted.
137
147
if ( event . data . previous . exists ( ) || ! event . data . exists ( ) ) {
138
148
return ;
@@ -142,7 +152,7 @@ function handleDataChange(event, path) {
142
152
const secureToken = getSecureToken ( event ) ;
143
153
const original = event . data . val ( ) ;
144
154
145
- return validateSecureToken ( secureToken , prNumber ) . then ( ( payload ) => {
155
+ return verifySecureToken ( secureToken , prNumber ) . then ( ( payload ) => {
146
156
return firebaseAdmin . database ( ) . ref ( ) . child ( 'screenshot/reports' )
147
157
. child ( prNumber ) . child ( path ) . set ( original ) . then ( ( ) => {
148
158
// Clear the data in temporary folder after processed.
@@ -163,7 +173,7 @@ function getSecureToken(event) {
163
173
return `${ event . params . jwtHeader } .${ event . params . jwtPayload } .${ event . params . jwtSignature } ` ;
164
174
}
165
175
166
- function validateSecureToken ( token , prNumber ) {
176
+ function verifySecureToken ( token , prNumber ) {
167
177
return new Promise ( ( resolve , reject ) => {
168
178
jwt . verify ( token , secret , { issuer : 'Travis CI, GmbH' } , ( err , payload ) => {
169
179
if ( err ) {
0 commit comments