@@ -16,7 +16,7 @@ const fs = require('fs');
1616 * /screenshot/reports/$prNumber.
1717 * These are data for screenshot results (success or failure), GitHub PR/commit and TravisCI job information
1818 *
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
2020 * data to image files and upload to google cloud storage under location /screenshots/$prNumber
2121 * These are screenshot test result images, and difference images generated from screenshot comparison.
2222 *
@@ -48,26 +48,35 @@ const bucket = gcs.bucket(firebaseFunctions.config().firebase.storageBucket);
4848/** The Json Web Token format. The token is stored in data path. */
4949const jwtFormat = '{jwtHeader}/{jwtPayload}/{jwtSignature}' ;
5050
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 ' ;
5353
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+ */
5559const copyDataPath = `${ tempFolder } /screenshot/reports/{prNumber}/${ jwtFormat } /{dataType}` ;
5660exports . copyData = firebaseFunctions . database . ref ( copyDataPath ) . onWrite ( event => {
5761 const dataType = event . params . dataType ;
5862 if ( dataTypes . includes ( dataType ) ) {
59- return handleDataChange ( event , dataType ) ;
63+ return verifyAndCopyScreenshotResult ( event , dataType ) ;
6064 }
61- return ;
6265} ) ;
6366
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+ */
6571const copyDataResultPath = `${ tempFolder } /screenshot/reports/{prNumber}/${ jwtFormat } /results/{filename}` ;
6672exports . copyDataResult = firebaseFunctions . database . ref ( copyDataResultPath ) . onWrite ( event => {
67- return handleDataChange ( event , `results/${ event . params . filename } ` ) ;
73+ return verifyAndCopyScreenshotResult ( event , `results/${ event . params . filename } ` ) ;
6874} ) ;
6975
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+ */
7180const copyImagePath = `${ tempFolder } /screenshot/images/{prNumber}/${ jwtFormat } /{dataType}/{filename}` ;
7281exports . copyImage = firebaseFunctions . database . ref ( copyImagePath ) . onWrite ( event => {
7382 // 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
8493 return ;
8594 }
8695
87- return validateSecureToken ( secureToken , prNumber ) . then ( ( payload ) => {
96+ return verifySecureToken ( secureToken , prNumber ) . then ( ( payload ) => {
8897 const tempPath = `/tmp/${ dataType } -${ saveFilename } `
8998 const filePath = `screenshots/${ prNumber } /${ dataType } /${ saveFilename } ` ;
9099 const binaryData = new Buffer ( event . data . val ( ) , 'base64' ) . toString ( 'binary' ) ;
@@ -105,6 +114,7 @@ exports.copyImage = firebaseFunctions.database.ref(copyImagePath).onWrite(event
105114 */
106115exports . copyGoldens = firebaseFunctions . storage . bucket ( firebaseFunctions . config ( ) . firebase . storageBucket )
107116 . object ( ) . onChange ( event => {
117+ // The filePath should always l ook like "goldens/xxx.png"
108118 const filePath = event . data . name ;
109119
110120 // Get the file name.
@@ -114,7 +124,7 @@ exports.copyGoldens = firebaseFunctions.storage.bucket(firebaseFunctions.config(
114124 }
115125 const filenameKey = fileNames [ 1 ] . replace ( '.screenshot.png' , '' ) ;
116126
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.
118128 if ( event . data . resourceState === 'not_exists' ) {
119129 return firebaseAdmin . database ( ) . ref ( `screenshot/goldens/${ filenameKey } ` ) . set ( null ) ;
120130 }
@@ -132,7 +142,7 @@ exports.copyGoldens = firebaseFunctions.storage.bucket(firebaseFunctions.config(
132142 * Handle data written to temporary folder. Validate the JWT and move the data out of
133143 * temporary folder if the token is valid.
134144 */
135- function handleDataChange ( event , path ) {
145+ function verifyAndCopyScreenshotResult ( event , path ) {
136146 // Only edit data when it is first created. Exit when the data is deleted.
137147 if ( event . data . previous . exists ( ) || ! event . data . exists ( ) ) {
138148 return ;
@@ -142,7 +152,7 @@ function handleDataChange(event, path) {
142152 const secureToken = getSecureToken ( event ) ;
143153 const original = event . data . val ( ) ;
144154
145- return validateSecureToken ( secureToken , prNumber ) . then ( ( payload ) => {
155+ return verifySecureToken ( secureToken , prNumber ) . then ( ( payload ) => {
146156 return firebaseAdmin . database ( ) . ref ( ) . child ( 'screenshot/reports' )
147157 . child ( prNumber ) . child ( path ) . set ( original ) . then ( ( ) => {
148158 // Clear the data in temporary folder after processed.
@@ -163,7 +173,7 @@ function getSecureToken(event) {
163173 return `${ event . params . jwtHeader } .${ event . params . jwtPayload } .${ event . params . jwtSignature } ` ;
164174}
165175
166- function validateSecureToken ( token , prNumber ) {
176+ function verifySecureToken ( token , prNumber ) {
167177 return new Promise ( ( resolve , reject ) => {
168178 jwt . verify ( token , secret , { issuer : 'Travis CI, GmbH' } , ( err , payload ) => {
169179 if ( err ) {
0 commit comments