From f1fb226b7f6e14bee5640a6627b5e6e2e8ceb5d0 Mon Sep 17 00:00:00 2001 From: Ashish Keshan Date: Thu, 30 Nov 2023 14:37:55 -0800 Subject: [PATCH 1/2] add error as an option in status + tests --- __tests__/main.test.js | 23 +++++++++++++++++------ src/main.js | 14 +++++++------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/__tests__/main.test.js b/__tests__/main.test.js index 61094333..9f386a5d 100644 --- a/__tests__/main.test.js +++ b/__tests__/main.test.js @@ -114,9 +114,9 @@ test('test fails on non-existent executable', () => { INPUT_COMMAND: 'nonexistentcommand', }) - expect(result.status).toBe('fail') + expect(result.status).toBe('error') expect(result.tests[0].name).toBe('Test 4') - expect(result.tests[0].status).toBe('fail') + expect(result.tests[0].status).toBe('error') expect(result.tests[0].message).toContain('Unable to locate executable file: nonexistentcommand') }) @@ -127,9 +127,9 @@ test('test fails on command timeout', () => { INPUT_TIMEOUT: '0.01', // ~ 1 second }) - expect(result.status).toBe('fail') + expect(result.status).toBe('error') expect(result.tests[0].name).toBe('Timeout Test') - expect(result.tests[0].status).toBe('fail') + expect(result.tests[0].status).toBe('error') expect(result.tests[0].message).toContain('Command timed out') }) @@ -153,8 +153,19 @@ test('test fails on setup command timeout', () => { INPUT_TIMEOUT: '0.01', // ~ 1 second }) - expect(result.status).toBe('fail') + expect(result.status).toBe('error') expect(result.tests[0].name).toBe('Setup Timeout Test') - expect(result.tests[0].status).toBe('fail') + expect(result.tests[0].status).toBe('error') expect(result.tests[0].message).toContain('Command timed out') }) + +test('awards no points if test errors', () => { + const result = runTestWithEnv({ + 'INPUT_TEST-NAME': 'Test 4', + INPUT_COMMAND: 'nonexistentcommand', + 'INPUT_MAX-SCORE': '100', + }) + + expect(result.max_score).toBe(100) + expect(result.tests[0].score).toBe(0) +}) diff --git a/src/main.js b/src/main.js index a7435094..ca06ce96 100644 --- a/src/main.js +++ b/src/main.js @@ -33,17 +33,17 @@ function generateResult(status, testName, command, message, duration, maxScore) } } -function getErrorMessage(error, command) { +function getErrorMessageAndStatus(error, command) { if (error.message.includes('ETIMEDOUT')) { - return 'Command timed out' + return { status: 'error', errorMessage: 'Command timed out' } } if (error.message.includes('command not found')) { - return `Unable to locate executable file: ${command}` + return { status: 'error', errorMessage: `Unable to locate executable file: ${command}` } } if (error.message.includes('Command failed')) { - return 'failed with exit code 1' + return { status: 'fail', errorMessage: 'failed with exit code 1' } } - return error.message + return { status: 'error', errorMessage: error.message } } function run() { @@ -70,8 +70,8 @@ function run() { result = generateResult('pass', testName, command, output, endTime - startTime, maxScore) } catch (error) { endTime = new Date() - const errorMessage = getErrorMessage(error, command) - result = generateResult('fail', testName, command, errorMessage, endTime - startTime, maxScore) + const {status, errorMessage} = getErrorMessageAndStatus(error, command) + result = generateResult(status, testName, command, errorMessage, endTime - startTime, maxScore) } core.setOutput('result', btoa(JSON.stringify(result))) From 61ceebc38631c4feba42050176d4e09a9f1f6f1a Mon Sep 17 00:00:00 2001 From: Ashish Keshan Date: Thu, 30 Nov 2023 14:39:39 -0800 Subject: [PATCH 2/2] update dist/main.js --- dist/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/main.js b/dist/main.js index 52977613..4b7eabc5 100644 --- a/dist/main.js +++ b/dist/main.js @@ -55,7 +55,7 @@ ${e.format(t)} Error Message: ${n.message}`)})).result)===null||t===void 0?void 0:t.value;if(!i)throw new Error("Response json body do not have ID Token field");return i})}static getIDToken(e){return Jh(this,void 0,void 0,function*(){try{let t=A.getIDTokenUrl();if(e){let s=encodeURIComponent(e);t=`${t}&audience=${s}`}Gh.debug(`ID token url is ${t}`);let r=yield A.getCall(t);return Gh.setSecret(r),r}catch(t){throw new Error(`Error message: ${t.message}`)}})}};ur.OidcClient=Dg});var Fg=c(JA=>{"use strict";var Rg=JA&&JA.__awaiter||function(A,e,t,r){function s(i){return i instanceof t?i:new t(function(n){n(i)})}return new(t||(t=Promise))(function(i,n){function o(E){try{g(r.next(E))}catch(B){n(B)}}function Q(E){try{g(r.throw(E))}catch(B){n(B)}}function g(E){E.done?i(E.value):s(E.value).then(o,Q)}g((r=r.apply(A,e||[])).next())})};Object.defineProperty(JA,"__esModule",{value:!0});JA.summary=JA.markdownSummary=JA.SUMMARY_DOCS_URL=JA.SUMMARY_ENV_VAR=void 0;var UF=require("os"),pg=require("fs"),{access:LF,appendFile:MF,writeFile:YF}=pg.promises;JA.SUMMARY_ENV_VAR="GITHUB_STEP_SUMMARY";JA.SUMMARY_DOCS_URL="https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary";var kg=class{constructor(){this._buffer=""}filePath(){return Rg(this,void 0,void 0,function*(){if(this._filePath)return this._filePath;let e=process.env[JA.SUMMARY_ENV_VAR];if(!e)throw new Error(`Unable to find environment variable for $${JA.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`);try{yield LF(e,pg.constants.R_OK|pg.constants.W_OK)}catch{throw new Error(`Unable to access summary file: '${e}'. Check if the file has correct read/write permissions.`)}return this._filePath=e,this._filePath})}wrap(e,t,r={}){let s=Object.entries(r).map(([i,n])=>` ${i}="${n}"`).join("");return t?`<${e}${s}>${t}`:`<${e}${s}>`}write(e){return Rg(this,void 0,void 0,function*(){let t=!!e?.overwrite,r=yield this.filePath();return yield(t?YF:MF)(r,this._buffer,{encoding:"utf8"}),this.emptyBuffer()})}clear(){return Rg(this,void 0,void 0,function*(){return this.emptyBuffer().write({overwrite:!0})})}stringify(){return this._buffer}isEmptyBuffer(){return this._buffer.length===0}emptyBuffer(){return this._buffer="",this}addRaw(e,t=!1){return this._buffer+=e,t?this.addEOL():this}addEOL(){return this.addRaw(UF.EOL)}addCodeBlock(e,t){let r=Object.assign({},t&&{lang:t}),s=this.wrap("pre",this.wrap("code",e),r);return this.addRaw(s).addEOL()}addList(e,t=!1){let r=t?"ol":"ul",s=e.map(n=>this.wrap("li",n)).join(""),i=this.wrap(r,s);return this.addRaw(i).addEOL()}addTable(e){let t=e.map(s=>{let i=s.map(n=>{if(typeof n=="string")return this.wrap("td",n);let{header:o,data:Q,colspan:g,rowspan:E}=n,B=o?"th":"td",C=Object.assign(Object.assign({},g&&{colspan:g}),E&&{rowspan:E});return this.wrap(B,Q,C)}).join("");return this.wrap("tr",i)}).join(""),r=this.wrap("table",t);return this.addRaw(r).addEOL()}addDetails(e,t){let r=this.wrap("details",this.wrap("summary",e)+t);return this.addRaw(r).addEOL()}addImage(e,t,r){let{width:s,height:i}=r||{},n=Object.assign(Object.assign({},s&&{width:s}),i&&{height:i}),o=this.wrap("img",null,Object.assign({src:e,alt:t},n));return this.addRaw(o).addEOL()}addHeading(e,t){let r=`h${t}`,s=["h1","h2","h3","h4","h5","h6"].includes(r)?r:"h1",i=this.wrap(s,e);return this.addRaw(i).addEOL()}addSeparator(){let e=this.wrap("hr",null);return this.addRaw(e).addEOL()}addBreak(){let e=this.wrap("br",null);return this.addRaw(e).addEOL()}addQuote(e,t){let r=Object.assign({},t&&{cite:t}),s=this.wrap("blockquote",e,r);return this.addRaw(s).addEOL()}addLink(e,t){let r=this.wrap("a",e,{href:t});return this.addRaw(r).addEOL()}},Hh=new kg;JA.markdownSummary=Hh;JA.summary=Hh});var Vh=c(GA=>{"use strict";var JF=GA&&GA.__createBinding||(Object.create?function(A,e,t,r){r===void 0&&(r=t),Object.defineProperty(A,r,{enumerable:!0,get:function(){return e[t]}})}:function(A,e,t,r){r===void 0&&(r=t),A[r]=e[t]}),GF=GA&&GA.__setModuleDefault||(Object.create?function(A,e){Object.defineProperty(A,"default",{enumerable:!0,value:e})}:function(A,e){A.default=e}),TF=GA&&GA.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)t!=="default"&&Object.hasOwnProperty.call(A,t)&&JF(e,A,t);return GF(e,A),e};Object.defineProperty(GA,"__esModule",{value:!0});GA.toPlatformPath=GA.toWin32Path=GA.toPosixPath=void 0;var HF=TF(require("path"));function VF(A){return A.replace(/[\\]/g,"/")}GA.toPosixPath=VF;function xF(A){return A.replace(/[/]/g,"\\")}GA.toWin32Path=xF;function qF(A){return A.replace(/[/\\]/g,HF.sep)}GA.toPlatformPath=qF});var wg=c(y=>{"use strict";var vF=y&&y.__createBinding||(Object.create?function(A,e,t,r){r===void 0&&(r=t),Object.defineProperty(A,r,{enumerable:!0,get:function(){return e[t]}})}:function(A,e,t,r){r===void 0&&(r=t),A[r]=e[t]}),WF=y&&y.__setModuleDefault||(Object.create?function(A,e){Object.defineProperty(A,"default",{enumerable:!0,value:e})}:function(A,e){A.default=e}),xh=y&&y.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)t!=="default"&&Object.hasOwnProperty.call(A,t)&&vF(e,A,t);return WF(e,A),e},qh=y&&y.__awaiter||function(A,e,t,r){function s(i){return i instanceof t?i:new t(function(n){n(i)})}return new(t||(t=Promise))(function(i,n){function o(E){try{g(r.next(E))}catch(B){n(B)}}function Q(E){try{g(r.throw(E))}catch(B){n(B)}}function g(E){E.done?i(E.value):s(E.value).then(o,Q)}g((r=r.apply(A,e||[])).next())})};Object.defineProperty(y,"__esModule",{value:!0});y.getIDToken=y.getState=y.saveState=y.group=y.endGroup=y.startGroup=y.info=y.notice=y.warning=y.error=y.debug=y.isDebug=y.setFailed=y.setCommandEcho=y.setOutput=y.getBooleanInput=y.getMultilineInput=y.getInput=y.addPath=y.setSecret=y.exportVariable=y.ExitCode=void 0;var Qe=Mg(),Rt=QE(),fr=cs(),vh=xh(require("os")),OF=xh(require("path")),PF=Th(),Wh;(function(A){A[A.Success=0]="Success",A[A.Failure=1]="Failure"})(Wh=y.ExitCode||(y.ExitCode={}));function _F(A,e){let t=fr.toCommandValue(e);if(process.env[A]=t,process.env.GITHUB_ENV||"")return Rt.issueFileCommand("ENV",Rt.prepareKeyValueMessage(A,e));Qe.issueCommand("set-env",{name:A},t)}y.exportVariable=_F;function ZF(A){Qe.issueCommand("add-mask",{},A)}y.setSecret=ZF;function XF(A){process.env.GITHUB_PATH||""?Rt.issueFileCommand("PATH",A):Qe.issueCommand("add-path",{},A),process.env.PATH=`${A}${OF.delimiter}${process.env.PATH}`}y.addPath=XF;function Ng(A,e){let t=process.env[`INPUT_${A.replace(/ /g,"_").toUpperCase()}`]||"";if(e&&e.required&&!t)throw new Error(`Input required and not supplied: ${A}`);return e&&e.trimWhitespace===!1?t:t.trim()}y.getInput=Ng;function KF(A,e){let t=Ng(A,e).split(` `).filter(r=>r!=="");return e&&e.trimWhitespace===!1?t:t.map(r=>r.trim())}y.getMultilineInput=KF;function zF(A,e){let t=["true","True","TRUE"],r=["false","False","FALSE"],s=Ng(A,e);if(t.includes(s))return!0;if(r.includes(s))return!1;throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${A} -Support boolean input list: \`true | True | TRUE | false | False | FALSE\``)}y.getBooleanInput=zF;function jF(A,e){if(process.env.GITHUB_OUTPUT||"")return Rt.issueFileCommand("OUTPUT",Rt.prepareKeyValueMessage(A,e));process.stdout.write(vh.EOL),Qe.issueCommand("set-output",{name:A},fr.toCommandValue(e))}y.setOutput=jF;function $F(A){Qe.issue("echo",A?"on":"off")}y.setCommandEcho=$F;function AN(A){process.exitCode=Wh.Failure,Oh(A)}y.setFailed=AN;function eN(){return process.env.RUNNER_DEBUG==="1"}y.isDebug=eN;function tN(A){Qe.issueCommand("debug",{},A)}y.debug=tN;function Oh(A,e={}){Qe.issueCommand("error",fr.toCommandProperties(e),A instanceof Error?A.toString():A)}y.error=Oh;function rN(A,e={}){Qe.issueCommand("warning",fr.toCommandProperties(e),A instanceof Error?A.toString():A)}y.warning=rN;function sN(A,e={}){Qe.issueCommand("notice",fr.toCommandProperties(e),A instanceof Error?A.toString():A)}y.notice=sN;function iN(A){process.stdout.write(A+vh.EOL)}y.info=iN;function Ph(A){Qe.issue("group",A)}y.startGroup=Ph;function _h(){Qe.issue("endgroup")}y.endGroup=_h;function nN(A,e){return qh(this,void 0,void 0,function*(){Ph(A);let t;try{t=yield e()}finally{_h()}return t})}y.group=nN;function oN(A,e){if(process.env.GITHUB_STATE||"")return Rt.issueFileCommand("STATE",Rt.prepareKeyValueMessage(A,e));Qe.issueCommand("save-state",{name:A},fr.toCommandValue(e))}y.saveState=oN;function QN(A){return process.env[`STATE_${A}`]||""}y.getState=QN;function gN(A){return qh(this,void 0,void 0,function*(){return yield PF.OidcClient.getIDToken(A)})}y.getIDToken=gN;var EN=Fg();Object.defineProperty(y,"summary",{enumerable:!0,get:function(){return EN.summary}});var BN=Fg();Object.defineProperty(y,"markdownSummary",{enumerable:!0,get:function(){return BN.markdownSummary}});var mg=Vh();Object.defineProperty(y,"toPosixPath",{enumerable:!0,get:function(){return mg.toPosixPath}});Object.defineProperty(y,"toWin32Path",{enumerable:!0,get:function(){return mg.toWin32Path}});Object.defineProperty(y,"toPlatformPath",{enumerable:!0,get:function(){return mg.toPlatformPath}})});var dr=wg(),{execSync:Zh}=require("child_process"),CN={PATH:process.env.PATH,FORCE_COLOR:"true",DOTNET_CLI_HOME:"/tmp",DOTNET_NOLOGO:"true",HOME:process.env.HOME};function IN(A){return Buffer.from(A).toString("base64")}function Xh(A,e,t,r,s,i){return{version:1,status:A,max_score:i,tests:[{name:e,status:A,score:A==="pass"?i:0,message:r,test_code:t,filename:"",line_no:0,duration:s}]}}function aN(A,e){return A.message.includes("ETIMEDOUT")?"Command timed out":A.message.includes("command not found")?`Unable to locate executable file: ${e}`:A.message.includes("Command failed")?"failed with exit code 1":A.message}function cN(){let A=dr.getInput("test-name",{required:!0}),e=dr.getInput("setup-command"),t=dr.getInput("command",{required:!0}),r=parseFloat(dr.getInput("timeout")||10)*6e4,s=parseInt(dr.getInput("max-score")||0),i="",n,o,Q;try{e&&Zh(e,{timeout:r}),n=new Date,i=Zh(t,{timeout:r,env:CN}).toString(),o=new Date,Q=Xh("pass",A,t,i,o-n,s)}catch(g){o=new Date;let E=aN(g,t);Q=Xh("fail",A,t,E,o-n,s)}dr.setOutput("result",IN(JSON.stringify(Q)))}cN(); +Support boolean input list: \`true | True | TRUE | false | False | FALSE\``)}y.getBooleanInput=zF;function jF(A,e){if(process.env.GITHUB_OUTPUT||"")return Rt.issueFileCommand("OUTPUT",Rt.prepareKeyValueMessage(A,e));process.stdout.write(vh.EOL),Qe.issueCommand("set-output",{name:A},fr.toCommandValue(e))}y.setOutput=jF;function $F(A){Qe.issue("echo",A?"on":"off")}y.setCommandEcho=$F;function AN(A){process.exitCode=Wh.Failure,Oh(A)}y.setFailed=AN;function eN(){return process.env.RUNNER_DEBUG==="1"}y.isDebug=eN;function tN(A){Qe.issueCommand("debug",{},A)}y.debug=tN;function Oh(A,e={}){Qe.issueCommand("error",fr.toCommandProperties(e),A instanceof Error?A.toString():A)}y.error=Oh;function rN(A,e={}){Qe.issueCommand("warning",fr.toCommandProperties(e),A instanceof Error?A.toString():A)}y.warning=rN;function sN(A,e={}){Qe.issueCommand("notice",fr.toCommandProperties(e),A instanceof Error?A.toString():A)}y.notice=sN;function iN(A){process.stdout.write(A+vh.EOL)}y.info=iN;function Ph(A){Qe.issue("group",A)}y.startGroup=Ph;function _h(){Qe.issue("endgroup")}y.endGroup=_h;function nN(A,e){return qh(this,void 0,void 0,function*(){Ph(A);let t;try{t=yield e()}finally{_h()}return t})}y.group=nN;function oN(A,e){if(process.env.GITHUB_STATE||"")return Rt.issueFileCommand("STATE",Rt.prepareKeyValueMessage(A,e));Qe.issueCommand("save-state",{name:A},fr.toCommandValue(e))}y.saveState=oN;function QN(A){return process.env[`STATE_${A}`]||""}y.getState=QN;function gN(A){return qh(this,void 0,void 0,function*(){return yield PF.OidcClient.getIDToken(A)})}y.getIDToken=gN;var EN=Fg();Object.defineProperty(y,"summary",{enumerable:!0,get:function(){return EN.summary}});var BN=Fg();Object.defineProperty(y,"markdownSummary",{enumerable:!0,get:function(){return BN.markdownSummary}});var mg=Vh();Object.defineProperty(y,"toPosixPath",{enumerable:!0,get:function(){return mg.toPosixPath}});Object.defineProperty(y,"toWin32Path",{enumerable:!0,get:function(){return mg.toWin32Path}});Object.defineProperty(y,"toPlatformPath",{enumerable:!0,get:function(){return mg.toPlatformPath}})});var dr=wg(),{execSync:Zh}=require("child_process"),CN={PATH:process.env.PATH,FORCE_COLOR:"true",DOTNET_CLI_HOME:"/tmp",DOTNET_NOLOGO:"true",HOME:process.env.HOME};function IN(A){return Buffer.from(A).toString("base64")}function Xh(A,e,t,r,s,i){return{version:1,status:A,max_score:i,tests:[{name:e,status:A,score:A==="pass"?i:0,message:r,test_code:t,filename:"",line_no:0,duration:s}]}}function aN(A,e){return A.message.includes("ETIMEDOUT")?{status:"error",errorMessage:"Command timed out"}:A.message.includes("command not found")?{status:"error",errorMessage:`Unable to locate executable file: ${e}`}:A.message.includes("Command failed")?{status:"fail",errorMessage:"failed with exit code 1"}:{status:"error",errorMessage:A.message}}function cN(){let A=dr.getInput("test-name",{required:!0}),e=dr.getInput("setup-command"),t=dr.getInput("command",{required:!0}),r=parseFloat(dr.getInput("timeout")||10)*6e4,s=parseInt(dr.getInput("max-score")||0),i="",n,o,Q;try{e&&Zh(e,{timeout:r}),n=new Date,i=Zh(t,{timeout:r,env:CN}).toString(),o=new Date,Q=Xh("pass",A,t,i,o-n,s)}catch(g){o=new Date;let{status:E,errorMessage:B}=aN(g,t);Q=Xh(E,A,t,B,o-n,s)}dr.setOutput("result",IN(JSON.stringify(Q)))}cN(); /*! Bundled license information: undici/lib/fetch/body.js: