diff --git a/__tests__/__resources__/properties/default_properties.yaml b/__tests__/__resources__/properties/default_properties.yaml index 9e3c215a5e..21fc02313f 100644 --- a/__tests__/__resources__/properties/default_properties.yaml +++ b/__tests__/__resources__/properties/default_properties.yaml @@ -104,6 +104,8 @@ zosjobs: modifiedJobclass: B # System affinity sysaff: zosjobs-sysaff + # CIM Support + skipCIM: false #-----------------------------------------------------------------------------# # Set of properties for testing provisioning # #-----------------------------------------------------------------------------# diff --git a/__tests__/__src__/properties/ITestZosJobsSchema.ts b/__tests__/__src__/properties/ITestZosJobsSchema.ts index ba6685b85d..cb18e46020 100644 --- a/__tests__/__src__/properties/ITestZosJobsSchema.ts +++ b/__tests__/__src__/properties/ITestZosJobsSchema.ts @@ -16,4 +16,5 @@ export interface ITestZosJobsSchema { jobclass: string; modifiedJobclass: string; sysaff: string; + skipCIM?: boolean; } diff --git a/jest.config.js b/jest.config.js index c3077263a8..0e05bcca5d 100644 --- a/jest.config.js +++ b/jest.config.js @@ -133,14 +133,11 @@ module.exports = { ...projectConfig, "reporters": [ "default", + "jest-stare", ["jest-junit", { "outputDirectory": "__tests__/__results__", "reportTestSuiteErrors": true }], - ["jest-stare", { - "coverageLink": "../unit/coverage/lcov-report/index.html", - "resultDir": "__tests__/__results__/jest-stare" - }], ["github-actions", { "silent": false } ] ], "testResultsProcessor": "jest-sonar-reporter", diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 8ccefc3c96..b2ca1af38b 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -37,7 +37,7 @@ "jest-html-reporter": "^3.6.0", "jest-junit": "^12.0.0", "jest-sonar-reporter": "^2.0.0", - "jest-stare": "^2.2.0", + "jest-stare": "^2.5.2", "js-yaml": "^4.1.0", "jsonfile": "^4.0.0", "madge": "^4.0.1", diff --git a/package.json b/package.json index 0ff177482d..1054d75d54 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,6 @@ "prepare": "husky install && npm run bundle:webHelp", "package": "lerna run prepublishOnly && node scripts/bundleCliTgz.js" }, - "dependencies": {}, "devDependencies": { "@lerna-lite/changed": "^3.3.0", "@lerna-lite/cli": "^3.3.0", @@ -69,7 +68,7 @@ "jest-html-reporter": "^3.6.0", "jest-junit": "^12.0.0", "jest-sonar-reporter": "^2.0.0", - "jest-stare": "^2.2.0", + "jest-stare": "^2.5.2", "js-yaml": "^4.1.0", "jsonfile": "^4.0.0", "madge": "^4.0.1", @@ -85,5 +84,13 @@ }, "jestSonar": { "reportPath": "__tests__/__results__/jest-sonar" + }, + "jest-stare": { + "additionalResultsProcessors": [ + "jest-junit", + "jest-sonar-reporter" + ], + "coverageLink": "../unit/coverage/lcov-report/index.html", + "resultDir": "__tests__/__results__/jest-stare" } } diff --git a/packages/cli/__tests__/auth/__system__/__scripts__/auth_login_apiml_show_token.sh b/packages/cli/__tests__/auth/__system__/__scripts__/auth_login_apiml_show_token.sh index bb1c005b18..5b29388f39 100755 --- a/packages/cli/__tests__/auth/__system__/__scripts__/auth_login_apiml_show_token.sh +++ b/packages/cli/__tests__/auth/__system__/__scripts__/auth_login_apiml_show_token.sh @@ -1,3 +1,4 @@ +#!/bin/bash set -e HOST=$1 diff --git a/packages/cli/__tests__/auth/__system__/__scripts__/auth_login_apiml_show_token_rfj.sh b/packages/cli/__tests__/auth/__system__/__scripts__/auth_login_apiml_show_token_rfj.sh index e45ddbe86b..0039cbfc6f 100755 --- a/packages/cli/__tests__/auth/__system__/__scripts__/auth_login_apiml_show_token_rfj.sh +++ b/packages/cli/__tests__/auth/__system__/__scripts__/auth_login_apiml_show_token_rfj.sh @@ -1,3 +1,4 @@ +#!/bin/bash set -e HOST=$1 diff --git a/packages/cli/__tests__/auth/__system__/__scripts__/auth_logout_apiml_show_token.sh b/packages/cli/__tests__/auth/__system__/__scripts__/auth_logout_apiml_show_token.sh index 0f6490c87a..8340fef941 100755 --- a/packages/cli/__tests__/auth/__system__/__scripts__/auth_logout_apiml_show_token.sh +++ b/packages/cli/__tests__/auth/__system__/__scripts__/auth_logout_apiml_show_token.sh @@ -1,3 +1,4 @@ +#!/bin/bash set -e HOST=$1 diff --git a/packages/cli/__tests__/config/auto-init/__system__/__scripts__/config_auto_init.sh b/packages/cli/__tests__/config/auto-init/__system__/__scripts__/config_auto_init.sh index 6328d7d363..dd62bf40a8 100755 --- a/packages/cli/__tests__/config/auto-init/__system__/__scripts__/config_auto_init.sh +++ b/packages/cli/__tests__/config/auto-init/__system__/__scripts__/config_auto_init.sh @@ -1,3 +1,4 @@ +#!/bin/bash set -e HOST=$1 diff --git a/packages/cli/__tests__/config/auto-init/__system__/__scripts__/config_auto_init_cert.sh b/packages/cli/__tests__/config/auto-init/__system__/__scripts__/config_auto_init_cert.sh index 88d6e63d2c..d1478052f2 100755 --- a/packages/cli/__tests__/config/auto-init/__system__/__scripts__/config_auto_init_cert.sh +++ b/packages/cli/__tests__/config/auto-init/__system__/__scripts__/config_auto_init_cert.sh @@ -1,3 +1,4 @@ +#!/bin/bash set -e HOST=$1 diff --git a/packages/cli/__tests__/config/auto-init/__system__/__scripts__/config_auto_init_profile.sh b/packages/cli/__tests__/config/auto-init/__system__/__scripts__/config_auto_init_profile.sh index 1b39110909..a0ed357b6a 100755 --- a/packages/cli/__tests__/config/auto-init/__system__/__scripts__/config_auto_init_profile.sh +++ b/packages/cli/__tests__/config/auto-init/__system__/__scripts__/config_auto_init_profile.sh @@ -1,3 +1,4 @@ +#!/bin/bash set -e zowe config auto-init diff --git a/packages/cli/__tests__/config/auto-init/__system__/cli.config.auto-init.system.test.ts b/packages/cli/__tests__/config/auto-init/__system__/cli.config.auto-init.system.test.ts index b8c60c666c..6bba223dfb 100644 --- a/packages/cli/__tests__/config/auto-init/__system__/cli.config.auto-init.system.test.ts +++ b/packages/cli/__tests__/config/auto-init/__system__/cli.config.auto-init.system.test.ts @@ -45,6 +45,7 @@ describe("config auto-init without profile", () => { base.rejectUnauthorized ] ); + expect(response.status).toEqual(0); const config = fs.readFileSync(path.join(TEST_ENVIRONMENT.workingDir, "zowe.config.json")).toString(); const profiles = JSONC.parse(config).profiles; @@ -105,6 +106,7 @@ describe("config auto-init without profile", () => { base.rejectUnauthorized ] ); + expect(response.status).toEqual(0); config = fs.readFileSync(path.join(TEST_ENVIRONMENT.workingDir, "zowe.config.json")).toString(); const profiles = JSONC.parse(config).profiles; @@ -183,6 +185,7 @@ describe("config auto-init without profile and with certificates", () => { base.rejectUnauthorized ] ); + expect(response.status).toEqual(0); const config = fs.readFileSync(path.join(TEST_ENVIRONMENT.workingDir, "zowe.config.json")).toString(); const profiles = JSONC.parse(config).profiles; @@ -249,6 +252,7 @@ describe("config auto-init without profile and with certificates", () => { base.rejectUnauthorized ] ); + expect(response.status).toEqual(0); config = fs.readFileSync(path.join(TEST_ENVIRONMENT.workingDir, "zowe.config.json")).toString(); const profiles = JSONC.parse(config).profiles; @@ -313,7 +317,7 @@ describe("config auto-init with profile", () => { it("should successfully issue the auto-init command", () => { const response = runCliScript(__dirname + "/__scripts__/config_auto_init_profile.sh", TEST_ENVIRONMENT); - + expect(response.status).toEqual(0); const config = fs.readFileSync(path.join(TEST_ENVIRONMENT.workingDir, "zowe.config.json")).toString(); const profiles = JSONC.parse(config).profiles; let zosmfExists = false; @@ -372,7 +376,7 @@ describe("config auto-init with profile and certificates", () => { it("should successfully issue the auto-init command", () => { const response = runCliScript(__dirname + "/__scripts__/config_auto_init_profile.sh", TEST_ENVIRONMENT); - + expect(response.status).toEqual(0); const config = fs.readFileSync(path.join(TEST_ENVIRONMENT.workingDir, "zowe.config.json")).toString(); const profiles = JSONC.parse(config).profiles; let zosmfExists = false; diff --git a/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job.sh b/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job.sh index d3632092d7..9e11ffd46b 100755 --- a/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job.sh +++ b/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job.sh @@ -16,6 +16,8 @@ then exit $RC fi +sleep 1 + # Cancel the job zowe jobs cancel job $JOBID RC=$? diff --git a/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job_fully_qualified.sh b/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job_fully_qualified.sh index a192432415..66e33b592f 100755 --- a/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job_fully_qualified.sh +++ b/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job_fully_qualified.sh @@ -22,6 +22,8 @@ then exit $RC fi +sleep 1 + # Cancel the job zowe jobs cancel job $JOBID --host $HOST --port $PORT --user $USER --password $PASS --ru=false RC=$? diff --git a/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job_v1.sh b/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job_v1.sh index 3c21f25e03..1f08c8455b 100755 --- a/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job_v1.sh +++ b/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job_v1.sh @@ -16,6 +16,8 @@ then exit $RC fi +sleep 1 + # Cancel the job 1 zowe jobs cancel job $JOBID --modify-version 1.0 RC=$? diff --git a/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job_v2.sh b/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job_v2.sh index d5abaaaee2..0c1170f4fe 100755 --- a/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job_v2.sh +++ b/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job_v2.sh @@ -16,6 +16,8 @@ then exit $RC fi +sleep 1 + # Cancel the job 1 zowe jobs cancel job $JOBID --modify-version 2.0 RC=$? diff --git a/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job_v2_bad.sh b/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job_v2_bad.sh index c3165a9047..c87f49179f 100755 --- a/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job_v2_bad.sh +++ b/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job_v2_bad.sh @@ -16,6 +16,8 @@ then exit $RC fi +sleep 1 + # Cancel the job 1 zowe jobs cancel job $JOBID --modify-version 2.0 RC=$? @@ -26,6 +28,8 @@ then exit $RC fi +sleep 1 + # Cancel the job 2 zowe jobs cancel job $JOBID --modify-version 2.0 RC=$? diff --git a/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job_v2_fully_qualified.sh b/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job_v2_fully_qualified.sh index 3a0d1b7177..5f1f40917d 100755 --- a/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job_v2_fully_qualified.sh +++ b/packages/cli/__tests__/zosjobs/__system__/cancel/__scripts__/job/cancel_job_v2_fully_qualified.sh @@ -22,6 +22,8 @@ then exit $RC fi +sleep 1 + # Cancel the job zowe jobs cancel job $JOBID --host $HOST --port $PORT --user $USER --password $PASS --ru=false --modify-version 2.0 RC=$? diff --git a/packages/cli/__tests__/zosjobs/__system__/cancel/cli.zos-jobs.cancel.job.system.test.ts b/packages/cli/__tests__/zosjobs/__system__/cancel/cli.zos-jobs.cancel.job.system.test.ts index c2366ea4f9..11cce2d610 100644 --- a/packages/cli/__tests__/zosjobs/__system__/cancel/cli.zos-jobs.cancel.job.system.test.ts +++ b/packages/cli/__tests__/zosjobs/__system__/cancel/cli.zos-jobs.cancel.job.system.test.ts @@ -14,10 +14,16 @@ import { TestEnvironment } from "../../../../../../__tests__/__src__/environment import { ITestPropertiesSchema } from "../../../../../../__tests__/__src__/properties/ITestPropertiesSchema"; import { JobTestsUtils } from "../../../../../zosjobs/__tests__/__system__/JobTestsUtils"; import { IO } from "@zowe/imperative"; +import { DeleteJobs, IJob } from "@zowe/zos-jobs-for-zowe-sdk"; +import { Session } from "@zowe/imperative"; // Test Environment populated in the beforeAll(); +let REAL_SESSION: Session; let TEST_ENVIRONMENT: ITestEnvironment; const LOCAL_JCL_FILE: string = __dirname + "/" + "testFileOfLocalJCL.txt"; +const jobsToDelete = new Map(); +const jobDataRegexV1 = /Successfully submitted request to cancel job (\w+) \((JOB\d+)\)/; +const jobNameRegexV1 = /job (\w+)/i; describe("zos-jobs cancel job command", () => { // Create the unique test environment @@ -28,6 +34,8 @@ describe("zos-jobs cancel job command", () => { }); const systemProps = TEST_ENVIRONMENT.systemTestProperties; + REAL_SESSION = TestEnvironment.createZosmfSession(TEST_ENVIRONMENT); + const jcl = JobTestsUtils.getSleepJCL(systemProps.zosmf.user, systemProps.tso.account, systemProps.zosjobs.jobclass); const bufferJCL: Buffer = Buffer.from(jcl); IO.createFileSync(LOCAL_JCL_FILE); @@ -36,6 +44,9 @@ describe("zos-jobs cancel job command", () => { afterAll(async () => { IO.deleteFile(LOCAL_JCL_FILE); + for (const [jobname, jobid] of jobsToDelete) { + await DeleteJobs.deleteJob(REAL_SESSION, jobname, jobid); + } }); describe("error handling", () => { @@ -67,10 +78,20 @@ describe("zos-jobs cancel job command", () => { describe("successful scenario", () => { it("should cancel a job v1", () => { - const response = runCliScript(__dirname + "/__scripts__/job/cancel_job_v1.sh", TEST_ENVIRONMENT, [LOCAL_JCL_FILE]); - expect(response.stderr.toString()).toBe(""); - expect(response.status).toBe(0); - expect(response.stdout.toString()).toContain("Successfully submitted request to cancel job"); + if (TEST_ENVIRONMENT.systemTestProperties.zosjobs.skipCIM) { + process.stdout.write("Skipping test because skipCIM is set."); + } else { + const response = runCliScript(__dirname + "/__scripts__/job/cancel_job_v1.sh", TEST_ENVIRONMENT, [LOCAL_JCL_FILE]); + + expect(response.stderr.toString()).toBe(""); + expect(response.status).toBe(0); + expect(response.stdout.toString()).toContain("Successfully submitted request to cancel job"); + + const jobname = response.stdout.toString().match(jobNameRegexV1).pop(); + const jobid = response.stdout.toString().match(jobDataRegexV1).pop(); + + jobsToDelete.set(jobname, jobid); + } }); it("should cancel a job v2", () => { @@ -108,18 +129,27 @@ describe("zos-jobs cancel job command", () => { }); it("cancel a job without a profile 1.0", async () => { - const response = runCliScript(__dirname + "/__scripts__/job/cancel_job_v1_fully_qualified.sh", - TEST_ENVIRONMENT_NO_PROF, - [ - LOCAL_JCL_FILE, - DEFAULT_SYSTEM_PROPS.zosmf.host, - DEFAULT_SYSTEM_PROPS.zosmf.port, - DEFAULT_SYSTEM_PROPS.zosmf.user, - DEFAULT_SYSTEM_PROPS.zosmf.password, - ]); - expect(response.stderr.toString()).toBe(""); - expect(response.status).toBe(0); - expect(response.stdout.toString()).toContain("Successfully submitted request to cancel job"); + if (TEST_ENVIRONMENT.systemTestProperties.zosjobs.skipCIM) { + process.stdout.write("Skipping test because skipCIM is set."); + } else { + const response = runCliScript(__dirname + "/__scripts__/job/cancel_job_v1_fully_qualified.sh", + TEST_ENVIRONMENT_NO_PROF, + [ + LOCAL_JCL_FILE, + DEFAULT_SYSTEM_PROPS.zosmf.host, + DEFAULT_SYSTEM_PROPS.zosmf.port, + DEFAULT_SYSTEM_PROPS.zosmf.user, + DEFAULT_SYSTEM_PROPS.zosmf.password, + ]); + expect(response.stderr.toString()).toBe(""); + expect(response.status).toBe(0); + expect(response.stdout.toString()).toContain("Successfully submitted request to cancel job"); + + const jobname = response.stdout.toString().match(jobNameRegexV1).pop(); + const jobid = response.stdout.toString().match(jobDataRegexV1).pop(); + + jobsToDelete.set(jobname, jobid); + } }); it("cancel a job without a profile 2.0", async () => { diff --git a/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job.sh b/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job.sh index e560bfdadf..a8d234d19d 100755 --- a/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job.sh +++ b/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job.sh @@ -17,7 +17,7 @@ then fi # Loop until the job goes to the output queue -until [ $ATTEMPTS -gt 0 ] +until [ $ATTEMPTS -lt 1 ] do STATUS=`zowe jobs view job-status-by-jobid $JOBID --rff status --rft string` RC=$? diff --git a/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job_fully_qualified.sh b/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job_fully_qualified.sh index 2642614827..40477cafd7 100755 --- a/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job_fully_qualified.sh +++ b/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job_fully_qualified.sh @@ -23,7 +23,7 @@ then fi # Loop until the job goes to the output queue -until [ $ATTEMPTS -gt 0 ] +until [ $ATTEMPTS -lt 1 ] do STATUS=`zowe jobs view job-status-by-jobid $JOBID --host $HOST --port $PORT --user $USER --password $PASS --ru=false --rff status --rft string` RC=$? diff --git a/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job_v1.sh b/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job_v1.sh index 5142e33080..9fad992df1 100755 --- a/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job_v1.sh +++ b/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job_v1.sh @@ -17,7 +17,7 @@ then fi # Loop until the job goes to the output queue -until [ $ATTEMPTS -gt 0 ] +until [ $ATTEMPTS -lt 1 ] do STATUS=`zowe jobs view job-status-by-jobid $JOBID --rff status --rft string` RC=$? diff --git a/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job_v1_fully_qualified.sh b/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job_v1_fully_qualified.sh index ddb46643a3..5041a60c53 100755 --- a/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job_v1_fully_qualified.sh +++ b/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job_v1_fully_qualified.sh @@ -23,7 +23,7 @@ then fi # Loop until the job goes to the output queue -until [ $ATTEMPTS -gt 0 ] +until [ $ATTEMPTS -lt 1 ] do STATUS=`zowe jobs view job-status-by-jobid $JOBID --host $HOST --port $PORT --user $USER --password $PASS --ru=false --rff status --rft string` RC=$? diff --git a/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job_v2.sh b/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job_v2.sh index b8a80a8af4..0887eab49a 100755 --- a/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job_v2.sh +++ b/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job_v2.sh @@ -17,7 +17,7 @@ then fi # Loop until the job goes to the output queue -until [ $ATTEMPTS -gt 0 ] +until [ $ATTEMPTS -lt 1 ] do STATUS=`zowe jobs view job-status-by-jobid $JOBID --rff status --rft string` RC=$? diff --git a/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job_v2_fully_qualified.sh b/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job_v2_fully_qualified.sh index e8f114b68c..f10be13a6f 100755 --- a/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job_v2_fully_qualified.sh +++ b/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/job/delete_job_v2_fully_qualified.sh @@ -23,7 +23,7 @@ then fi # Loop until the job goes to the output queue -until [ $ATTEMPTS -gt 0 ] +until [ $ATTEMPTS -lt 1 ] do STATUS=`zowe jobs view job-status-by-jobid $JOBID --host $HOST --port $PORT --user $USER --password $PASS --ru=false --rff status --rft string` RC=$? diff --git a/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/old-jobs/delete_old_jobs.sh b/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/old-jobs/delete_old_jobs.sh index 6946cc549d..e165a2fb02 100755 --- a/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/old-jobs/delete_old_jobs.sh +++ b/packages/cli/__tests__/zosjobs/__system__/delete/__scripts__/old-jobs/delete_old_jobs.sh @@ -18,7 +18,7 @@ then fi # Loop until the job goes to the output queue -until [ $ATTEMPTS -gt 0 ] +until [ $ATTEMPTS -lt 1 ] do STATUS=`zowe jobs view job-status-by-jobid $JOBID --rff status --rft string` RC=$? diff --git a/packages/cli/__tests__/zosjobs/__system__/delete/cli.zos-jobs.delete.job.system.test.ts b/packages/cli/__tests__/zosjobs/__system__/delete/cli.zos-jobs.delete.job.system.test.ts index c70924a92c..1b5db43002 100644 --- a/packages/cli/__tests__/zosjobs/__system__/delete/cli.zos-jobs.delete.job.system.test.ts +++ b/packages/cli/__tests__/zosjobs/__system__/delete/cli.zos-jobs.delete.job.system.test.ts @@ -46,11 +46,15 @@ describe("zos-jobs delete job command", () => { describe("successful scenario", () => { it("should delete a job 1.0", () => { - const response = runCliScript(__dirname + "/__scripts__/job/delete_job_v1.sh", - TEST_ENVIRONMENT, [IEFBR14_JCL]); - expect(response.stderr.toString()).toBe(""); - expect(response.status).toBe(0); - expect(response.stdout.toString()).toContain("Successfully submitted request to delete job"); + if (TEST_ENVIRONMENT.systemTestProperties.zosjobs.skipCIM) { + process.stdout.write("Skipping test because skipCIM is set."); + } else { + const response = runCliScript(__dirname + "/__scripts__/job/delete_job_v1.sh", + TEST_ENVIRONMENT, [IEFBR14_JCL]); + expect(response.stderr.toString()).toBe(""); + expect(response.status).toBe(0); + expect(response.stdout.toString()).toContain("Successfully submitted request to delete job"); + } }); it("should delete a job 2.0", () => { @@ -88,26 +92,30 @@ describe("zos-jobs delete job command", () => { }); it("delete a job without a profile 1.0", async () => { - const ZOWE_OPT_BASE_PATH = "ZOWE_OPT_BASE_PATH"; - - // if API Mediation layer is being used (basePath has a value) then - // set an ENVIRONMENT variable to be used by zowe. - if (DEFAULT_SYSTEM_PROPS.zosmf.basePath != null) { - TEST_ENVIRONMENT_NO_PROF.env[ZOWE_OPT_BASE_PATH] = DEFAULT_SYSTEM_PROPS.zosmf.basePath; + if (TEST_ENVIRONMENT.systemTestProperties.zosjobs.skipCIM) { + process.stdout.write("Skipping test because skipCIM is set."); + } else { + const ZOWE_OPT_BASE_PATH = "ZOWE_OPT_BASE_PATH"; + + // if API Mediation layer is being used (basePath has a value) then + // set an ENVIRONMENT variable to be used by zowe. + if (DEFAULT_SYSTEM_PROPS.zosmf.basePath != null) { + TEST_ENVIRONMENT_NO_PROF.env[ZOWE_OPT_BASE_PATH] = DEFAULT_SYSTEM_PROPS.zosmf.basePath; + } + + const response = runCliScript(__dirname + "/__scripts__/job/delete_job_v1_fully_qualified.sh", + TEST_ENVIRONMENT_NO_PROF, + [ + IEFBR14_JCL, + DEFAULT_SYSTEM_PROPS.zosmf.host, + DEFAULT_SYSTEM_PROPS.zosmf.port, + DEFAULT_SYSTEM_PROPS.zosmf.user, + DEFAULT_SYSTEM_PROPS.zosmf.password, + ]); + expect(response.stderr.toString()).toBe(""); + expect(response.status).toBe(0); + expect(response.stdout.toString()).toContain("Successfully submitted request to delete job"); } - - const response = runCliScript(__dirname + "/__scripts__/job/delete_job_v1_fully_qualified.sh", - TEST_ENVIRONMENT_NO_PROF, - [ - IEFBR14_JCL, - DEFAULT_SYSTEM_PROPS.zosmf.host, - DEFAULT_SYSTEM_PROPS.zosmf.port, - DEFAULT_SYSTEM_PROPS.zosmf.user, - DEFAULT_SYSTEM_PROPS.zosmf.password, - ]); - expect(response.stderr.toString()).toBe(""); - expect(response.status).toBe(0); - expect(response.stdout.toString()).toContain("Successfully submitted request to delete job"); }); it("delete a job without a profile 2.0", async () => { diff --git a/packages/cli/__tests__/zosjobs/__system__/delete/cli.zos-jobs.delete.old-jobs.system.test.ts b/packages/cli/__tests__/zosjobs/__system__/delete/cli.zos-jobs.delete.old-jobs.system.test.ts index 3b3d493ef2..128038ab84 100644 --- a/packages/cli/__tests__/zosjobs/__system__/delete/cli.zos-jobs.delete.old-jobs.system.test.ts +++ b/packages/cli/__tests__/zosjobs/__system__/delete/cli.zos-jobs.delete.old-jobs.system.test.ts @@ -16,6 +16,7 @@ import { ITestPropertiesSchema } from "../../../../../../__tests__/__src__/prope // Test Environment populated in the beforeAll(); let TEST_ENVIRONMENT: ITestEnvironment; let IEFBR14_JCL: string; +const modifyVersionDefaultUsesCIM = false; describe("zos-jobs delete old-jobs command", () => { // Create the unique test environment @@ -38,35 +39,50 @@ describe("zos-jobs delete old-jobs command", () => { describe("successful scenario", () => { it("should delete all old jobs sequentially default", () => { - const response = runCliScript(__dirname + "/__scripts__/old-jobs/delete_old_jobs.sh", - TEST_ENVIRONMENT, [IEFBR14_JCL]); - expect(response.status).toBe(0); - expect(response.stderr.toString()).toBe(""); - expect(response.stdout.toString()).toContain("Successfully deleted"); + if (TEST_ENVIRONMENT.systemTestProperties.zosjobs.skipCIM && modifyVersionDefaultUsesCIM) { + process.stdout.write("Skipping test because skipCIM is set."); + } else { + const response = runCliScript(__dirname + "/__scripts__/old-jobs/delete_old_jobs.sh", + TEST_ENVIRONMENT, [IEFBR14_JCL]); + expect(response.status).toBe(0); + expect(response.stderr.toString()).toBe(""); + expect(response.stdout.toString()).toContain("Successfully deleted"); + } }); it("should delete all old jobs in parallel default", () => { - const response = runCliScript(__dirname + "/__scripts__/old-jobs/delete_old_jobs.sh", - TEST_ENVIRONMENT, [IEFBR14_JCL, "--mcr", "0"]); - expect(response.status).toBe(0); - expect(response.stderr.toString()).toBe(""); - expect(response.stdout.toString()).toContain("Successfully deleted"); + if (TEST_ENVIRONMENT.systemTestProperties.zosjobs.skipCIM && modifyVersionDefaultUsesCIM) { + process.stdout.write("Skipping test because skipCIM is set."); + } else { + const response = runCliScript(__dirname + "/__scripts__/old-jobs/delete_old_jobs.sh", + TEST_ENVIRONMENT, [IEFBR14_JCL, "--mcr", "0"]); + expect(response.status).toBe(0); + expect(response.stderr.toString()).toBe(""); + expect(response.stdout.toString()).toContain("Successfully deleted"); + } }); - it("should delete all old jobs with modifyVersion 1.0 sequentially", () => { - const response = runCliScript(__dirname + "/__scripts__/old-jobs/delete_old_jobs.sh", - TEST_ENVIRONMENT, [IEFBR14_JCL, "--modify-version", "1.0"]); - expect(response.status).toBe(0); - expect(response.stderr.toString()).toBe(""); - expect(response.stdout.toString()).toContain("Successfully deleted"); + if (TEST_ENVIRONMENT.systemTestProperties.zosjobs.skipCIM) { + process.stdout.write("Skipping test because skipCIM is set."); + } else { + const response = runCliScript(__dirname + "/__scripts__/old-jobs/delete_old_jobs.sh", + TEST_ENVIRONMENT, [IEFBR14_JCL, "--modify-version", "1.0"]); + expect(response.status).toBe(0); + expect(response.stderr.toString()).toBe(""); + expect(response.stdout.toString()).toContain("Successfully deleted"); + } }); it("should delete all old jobs with modifyVersion 1.0 parallel", () => { - const response = runCliScript(__dirname + "/__scripts__/old-jobs/delete_old_jobs.sh", - TEST_ENVIRONMENT, [IEFBR14_JCL, "--mcr", "0", "--modify-version", "1.0"]); - expect(response.status).toBe(0); - expect(response.stderr.toString()).toBe(""); - expect(response.stdout.toString()).toContain("Successfully deleted"); + if (TEST_ENVIRONMENT.systemTestProperties.zosjobs.skipCIM) { + process.stdout.write("Skipping test because skipCIM is set."); + } else { + const response = runCliScript(__dirname + "/__scripts__/old-jobs/delete_old_jobs.sh", + TEST_ENVIRONMENT, [IEFBR14_JCL, "--mcr", "0", "--modify-version", "1.0"]); + expect(response.status).toBe(0); + expect(response.stderr.toString()).toBe(""); + expect(response.stdout.toString()).toContain("Successfully deleted"); + } }); it("should delete all old jobs with modifyVersion 2.0 sequentially", () => { diff --git a/packages/cli/__tests__/zosjobs/__system__/download/__scripts__/download-output/download.sh b/packages/cli/__tests__/zosjobs/__system__/download/__scripts__/download-output/download.sh index a8f477a047..e2133d5303 100755 --- a/packages/cli/__tests__/zosjobs/__system__/download/__scripts__/download-output/download.sh +++ b/packages/cli/__tests__/zosjobs/__system__/download/__scripts__/download-output/download.sh @@ -17,7 +17,7 @@ then fi # Loop until the job goes to the output queue -until [ $ATTEMPTS -gt 0 ] +until [ $ATTEMPTS -lt 1 ] do STATUS=`zowe jobs view job-status-by-jobid $JOBID --rff status --rft string` RC=$? diff --git a/packages/cli/__tests__/zosjobs/__system__/download/__scripts__/download-output/download_fully_qualified.sh b/packages/cli/__tests__/zosjobs/__system__/download/__scripts__/download-output/download_fully_qualified.sh index f86e5b1d36..1232ccc24e 100755 --- a/packages/cli/__tests__/zosjobs/__system__/download/__scripts__/download-output/download_fully_qualified.sh +++ b/packages/cli/__tests__/zosjobs/__system__/download/__scripts__/download-output/download_fully_qualified.sh @@ -23,7 +23,7 @@ then fi # Loop until the job goes to the output queue -until [ $ATTEMPTS -gt 0 ] +until [ $ATTEMPTS -lt 1 ] do STATUS=`zowe jobs view job-status-by-jobid $JOBID --host $HOST --port $PORT --user $USER --password $PASS --ru=false --rff status --rft string` RC=$? diff --git a/packages/cli/__tests__/zosjobs/__system__/list/__scripts__/list-jobs/submit_and_list_jobs.sh b/packages/cli/__tests__/zosjobs/__system__/list/__scripts__/list-jobs/submit_and_list_jobs.sh index 524086b7b8..d05dfd5b41 100755 --- a/packages/cli/__tests__/zosjobs/__system__/list/__scripts__/list-jobs/submit_and_list_jobs.sh +++ b/packages/cli/__tests__/zosjobs/__system__/list/__scripts__/list-jobs/submit_and_list_jobs.sh @@ -4,10 +4,13 @@ set -e # arguments: $1 is a data set name with JCL inside to submit JOBID1=`zowe zos-jobs submit data-set $1 --rff jobid --rft string` +sleep 1 JOBID2=`zowe zos-jobs submit data-set $1 --rff jobid --rft string` echo "Listing jobs to find job IDs $JOBID1 and $JOBID2" +sleep 1 + LIST_JOB_OUTPUT=`zowe zos-jobs list jobs` if echo $LIST_JOB_OUTPUT | grep -q $JOBID1 then diff --git a/packages/cli/__tests__/zosjobs/__system__/list/__scripts__/list-jobs/submit_and_list_jobs_fully_qualified.sh b/packages/cli/__tests__/zosjobs/__system__/list/__scripts__/list-jobs/submit_and_list_jobs_fully_qualified.sh index 198dcf8b91..7473f059d9 100755 --- a/packages/cli/__tests__/zosjobs/__system__/list/__scripts__/list-jobs/submit_and_list_jobs_fully_qualified.sh +++ b/packages/cli/__tests__/zosjobs/__system__/list/__scripts__/list-jobs/submit_and_list_jobs_fully_qualified.sh @@ -10,8 +10,11 @@ PASS=$5 # arguments: $1 is a data set name with JCL inside to submit JOBID1=`zowe zos-jobs submit data-set $JCL --host $HOST --port $PORT --user $USER --password $PASS --ru=false --rff jobid --rft string` +sleep 1 JOBID2=`zowe zos-jobs submit data-set $JCL --host $HOST --port $PORT --user $USER --password $PASS --ru=false --rff jobid --rft string` +sleep 1 + echo "Listing jobs to find job IDs $JOBID1 and $JOBID2" LIST_JOB_OUTPUT=`zowe zos-jobs list jobs --host $HOST --port $PORT --user $USER --password $PASS --ru=false` diff --git a/packages/cli/__tests__/zosmf/__system__/check/status/zosmf.check.status.system.test.ts b/packages/cli/__tests__/zosmf/__system__/check/status/zosmf.check.status.system.test.ts index a2cb9867c9..70dbf02be3 100644 --- a/packages/cli/__tests__/zosmf/__system__/check/status/zosmf.check.status.system.test.ts +++ b/packages/cli/__tests__/zosmf/__system__/check/status/zosmf.check.status.system.test.ts @@ -14,6 +14,8 @@ import { TestEnvironment } from "../../../../../../../__tests__/__src__/environm import { ITestPropertiesSchema } from "../../../../../../../__tests__/__src__/properties/ITestPropertiesSchema"; import { stripNewLines } from "../../../../../../../__tests__/__src__/TestUtils"; import { IO } from "@zowe/imperative"; +import { join } from "path"; +import { chmodSync } from "fs"; let testEnvironment: ITestEnvironment; let host: string; @@ -105,15 +107,16 @@ describe("zosmf check status", () => { (!process.env.HTTP_PROXY && !process.env.HTTPS_PROXY ? it : it.skip)("should fail due to invalid port", async () => { // update temporary zowe profile with an invalid port - const scriptPath = testEnvironment.workingDir + "_create_profile_invalid_port"; + const scriptPath = join(testEnvironment.workingDir, "create_profile_invalid_port.sh"); const bogusPort = 12345; - const command = `zowe config set profiles.${testEnvironment.tempProfiles?.zosmf[0]}.properties.port ${bogusPort} --gc`; + const command = `#!/bin/bash\nzowe config set profiles.${testEnvironment.tempProfiles?.zosmf[0]}.properties.port ${bogusPort} --gc`; await IO.writeFileAsync(scriptPath, command); + if (process.platform !== "win32") { chmodSync(scriptPath, 0o755); } let response = runCliScript(scriptPath, testEnvironment); expect(response.status).toBe(0); // now check the status response = runCliScript(__dirname + "/__scripts__/command/zosmf_check_status.sh", testEnvironment); - expect(stripNewLines(response.stderr.toString())).toContain("connect ECONNREFUSED"); + expect(stripNewLines(response.stderr.toString())).toMatch(/.*(ECONNREFUSED|ECONNRESET|ETIMEDOUT).*/); }); }); }); diff --git a/packages/cli/__tests__/zosmf/__system__/list/systems/zosmf.list.systems.system.test.ts b/packages/cli/__tests__/zosmf/__system__/list/systems/zosmf.list.systems.system.test.ts index 790f7849b3..1654798fd9 100644 --- a/packages/cli/__tests__/zosmf/__system__/list/systems/zosmf.list.systems.system.test.ts +++ b/packages/cli/__tests__/zosmf/__system__/list/systems/zosmf.list.systems.system.test.ts @@ -14,6 +14,8 @@ import { TestEnvironment } from "../../../../../../../__tests__/__src__/environm import { ITestPropertiesSchema } from "../../../../../../../__tests__/__src__/properties/ITestPropertiesSchema"; import { stripNewLines } from "../../../../../../../__tests__/__src__/TestUtils"; import { IO } from "@zowe/imperative"; +import { join } from "path"; +import { chmodSync } from "fs"; let testEnvironment: ITestEnvironment; let host: string; @@ -123,15 +125,16 @@ describe("zosmf list systems", () => { (!process.env.HTTP_PROXY && !process.env.HTTPS_PROXY ? it : it.skip)("should fail due to invalid port", async () => { // update temporary zowe profile with an invalid port - const scriptPath = testEnvironment.workingDir + "_create_profile_invalid_port"; + const scriptPath = join(testEnvironment.workingDir, "create_profile_invalid_port.sh"); const bogusPort = 12345; - const command = `zowe config set profiles.${testEnvironment.tempProfiles?.zosmf[0]}.properties.port ${bogusPort} --gc`; + const command = `#!/bin/bash\nzowe config set profiles.${testEnvironment.tempProfiles?.zosmf[0]}.properties.port ${bogusPort} --gc`; await IO.writeFileAsync(scriptPath, command); + if (process.platform !== "win32") { chmodSync(scriptPath, 0o755); } let response = runCliScript(scriptPath, testEnvironment); expect(response.status).toBe(0); // now check the status response = runCliScript(__dirname + "/__scripts__/command/zosmf_list_systems.sh", testEnvironment); - expect(stripNewLines(response.stderr.toString())).toContain("connect ECONNREFUSED"); + expect(stripNewLines(response.stderr.toString())).toMatch(/.*(ECONNREFUSED|ECONNRESET|ETIMEDOUT).*/); }); }); }); diff --git a/packages/cli/__tests__/zostso/__system__/stop/__scripts__/address-space/as_fully_qualified.sh b/packages/cli/__tests__/zostso/__system__/stop/__scripts__/address-space/as_fully_qualified.sh index 97bf3bf6e4..3e832f40b4 100755 --- a/packages/cli/__tests__/zostso/__system__/stop/__scripts__/address-space/as_fully_qualified.sh +++ b/packages/cli/__tests__/zostso/__system__/stop/__scripts__/address-space/as_fully_qualified.sh @@ -7,7 +7,7 @@ PORT=$3 USER=$4 PASSWORD=$5 -SERVLET_KEY=`zowe tso start as --host $HOST --account $ACCOUNT --port $PORT --user $USER --password $PASSWORD --ru=false | grep -oP "(?<=: ).*"` +SERVLET_KEY=`zowe tso start as --host $HOST --account $ACCOUNT --port $PORT --user $USER --password $PASSWORD --ru=false | awk -F': ' '{print $2}' | sed '1p;d'` zowe zos-tso stop address-space ${SERVLET_KEY} --host $HOST --port $PORT --user $USER --password $PASSWORD --ru=false exit $? \ No newline at end of file diff --git a/packages/cli/__tests__/zostso/__system__/stop/__scripts__/address-space/as_success_stop.sh b/packages/cli/__tests__/zostso/__system__/stop/__scripts__/address-space/as_success_stop.sh index 88d2188082..8d5ab2620e 100755 --- a/packages/cli/__tests__/zostso/__system__/stop/__scripts__/address-space/as_success_stop.sh +++ b/packages/cli/__tests__/zostso/__system__/stop/__scripts__/address-space/as_success_stop.sh @@ -1,7 +1,7 @@ #!/bin/bash set -e -SERVLET_KEY=`zowe tso start as | grep -oP "(?<=: ).*"` +SERVLET_KEY=`zowe tso start as | awk -F': ' '{print $2}' | sed '1p;d'` zowe zos-tso stop address-space ${SERVLET_KEY} exit $? \ No newline at end of file diff --git a/packages/cli/__tests__/zostso/__system__/stop/__scripts__/address-space/as_success_stop_rfj.sh b/packages/cli/__tests__/zostso/__system__/stop/__scripts__/address-space/as_success_stop_rfj.sh index f587af271f..2678431acb 100755 --- a/packages/cli/__tests__/zostso/__system__/stop/__scripts__/address-space/as_success_stop_rfj.sh +++ b/packages/cli/__tests__/zostso/__system__/stop/__scripts__/address-space/as_success_stop_rfj.sh @@ -1,7 +1,7 @@ #!/bin/bash set -e -SERVLET_KEY=`zowe tso start as | grep -oP "(?<=: ).*"` +SERVLET_KEY=`zowe tso start as | awk -F': ' '{print $2}' | sed '1p;d'` zowe zos-tso stop address-space ${SERVLET_KEY} --response-format-json exit $? \ No newline at end of file diff --git a/packages/cli/src/zoslogs/list/logs/Logs.handler.ts b/packages/cli/src/zoslogs/list/logs/Logs.handler.ts index 4ff94a9b3c..66c4e504e3 100644 --- a/packages/cli/src/zoslogs/list/logs/Logs.handler.ts +++ b/packages/cli/src/zoslogs/list/logs/Logs.handler.ts @@ -22,7 +22,8 @@ export default class LogsHandler extends ZosmfBaseHandler { public async processCmd(commandParameters: IHandlerParameters) { const outputHeader = "Retrieved %s messages from %s, starts from %s, ends at %s. "; - let startTime = new Date().toISOString(); + let startTime: any; + const startDate = new Date().toISOString(); if (commandParameters.arguments.startTime !== undefined) { startTime = commandParameters.arguments.startTime; // in case the input is milliseconds format, which is a long number @@ -39,6 +40,7 @@ export default class LogsHandler extends ZosmfBaseHandler { try{ const resp: IZosLogType = await GetZosLog.getZosLog(this.mSession, zosLogParms); + if (startTime == null) { startTime = startDate; } const logItems: Array = resp.items; if (logItems === undefined || logItems.length === 0) { diff --git a/packages/core/__tests__/apiml/__system__/Services.system.test.ts b/packages/core/__tests__/apiml/__system__/Services.system.test.ts index 6a18c4db69..6416409eab 100644 --- a/packages/core/__tests__/apiml/__system__/Services.system.test.ts +++ b/packages/core/__tests__/apiml/__system__/Services.system.test.ts @@ -32,7 +32,6 @@ describe("APIML Services system test", () => { afterAll(async () => { await TestEnvironment.cleanUp(testEnvironment); }); - it("should succeed with correct parameters and retrieve z/OSMF connection info", async () => { const pluginConfigs: IApimlSvcAttrsLoaded[] = [ { @@ -57,7 +56,7 @@ describe("APIML Services system test", () => { expect(new Array(...zosmfProfileInfo.pluginConfigs)).toEqual(pluginConfigs); const actualJson = require("comment-json").stringify(Services.convertApimlProfileInfoToProfileConfig(response), null, 1); - expect(actualJson).toContain("// Multiple services were detected."); - expect(actualJson).toContain("// Uncomment one of the lines below to set a different default."); + expect(actualJson).toContain("\"ibmzosmf\""); + expect(actualJson).toContain("ibmzosmf/api/v1"); }); }); diff --git a/packages/imperative/__tests__/__integration__/imperative/__tests__/__integration__/cli/config/convert-profiles/cli.imperative-test-cli.config.convert-profiles.integration.subtest.ts b/packages/imperative/__tests__/__integration__/imperative/__tests__/__integration__/cli/config/convert-profiles/cli.imperative-test-cli.config.convert-profiles.integration.subtest.ts index c849cc4f34..4505b37f7b 100644 --- a/packages/imperative/__tests__/__integration__/imperative/__tests__/__integration__/cli/config/convert-profiles/cli.imperative-test-cli.config.convert-profiles.integration.subtest.ts +++ b/packages/imperative/__tests__/__integration__/imperative/__tests__/__integration__/cli/config/convert-profiles/cli.imperative-test-cli.config.convert-profiles.integration.subtest.ts @@ -41,7 +41,7 @@ describe("imperative-test-cli config convert-profiles", () => { if (fs.existsSync(configJsonPath)) { fs.unlinkSync(configJsonPath); } - fsExtra.removeSync(TEST_ENVIRONMENT.workingDir + "/profiles-old"); + fs.rmSync(TEST_ENVIRONMENT.workingDir + "/profiles-old", {recursive: true, force: true}); }); describe("success scenarios", () => { diff --git a/packages/imperative/__tests__/__src__/environment/SetupTestEnvironment.ts b/packages/imperative/__tests__/__src__/environment/SetupTestEnvironment.ts index f0d7a17ac5..5db620d63f 100644 --- a/packages/imperative/__tests__/__src__/environment/SetupTestEnvironment.ts +++ b/packages/imperative/__tests__/__src__/environment/SetupTestEnvironment.ts @@ -13,8 +13,9 @@ import { ISetupEnvironmentParms } from "./doc/parms/ISetupEnvironmentParms"; import { ImperativeExpect } from "../../../src"; import * as nodePath from "path"; import { TEST_RESULT_DATA_DIR } from "../TestConstants"; -import { mkdirpSync } from "fs-extra"; import { ITestEnvironment } from "./doc/response/ITestEnvironment"; +import { mkdirpSync } from "fs-extra"; + const uuidv4 = require("uuid/v4"); /** * Use the utility methods here to setup the test environment for running APIs diff --git a/packages/imperative/__tests__/src/TestUtil.ts b/packages/imperative/__tests__/src/TestUtil.ts index 78cb6d909a..2159c438f0 100644 --- a/packages/imperative/__tests__/src/TestUtil.ts +++ b/packages/imperative/__tests__/src/TestUtil.ts @@ -24,13 +24,13 @@ import { ICommandResponse } from "../../src/cmd"; import { ICompareParms } from "./doc/ICompareParms"; import { TestLogger } from "./TestLogger"; import * as nodePath from "path"; -import { mkdirpSync } from "fs-extra"; import * as fs from "fs"; import { randomBytes } from "crypto"; import * as os from "os"; import { Config, IConfig, IConfigOpts } from "../../src/config"; import { ImperativeConfig } from "../../src/utilities"; import { sync } from "cross-spawn"; +import { mkdirpSync } from "fs-extra"; /** * Requires for non-typed. diff --git a/packages/imperative/src/operations/src/Operation.ts b/packages/imperative/src/operations/src/Operation.ts index e616531aee..0878d09395 100644 --- a/packages/imperative/src/operations/src/Operation.ts +++ b/packages/imperative/src/operations/src/Operation.ts @@ -12,7 +12,6 @@ import { IOperationResult } from "./doc/IOperationResult"; import { TaskStage } from "./TaskStage"; import * as fs from "fs"; -import { removeSync } from "fs-extra"; import { TextUtils } from "../../utilities"; import { ITaskWithStatus } from "./doc/ITaskWithStatus"; import { TaskProgress } from "./TaskProgress"; @@ -471,11 +470,7 @@ export abstract class Operation implements ITaskWithStatus { for (let x = 0; x < order.length; x++) { this.log.info("Cleaning file: " + this.fileToUndo[x]); try { - if (fs.statSync(order[x]).isDirectory()) { - removeSync(order[x]); - } else { - fs.unlinkSync(order[x]); - } + fs.rmSync(order[x], {recursive: true, force: true}); } catch (error) { this.log.error("An error occurred deleting: " + order[x]); this.log.error("Message: " + error.message); diff --git a/packages/imperative/src/rest/__tests__/client/AbstractRestClient.unit.test.ts b/packages/imperative/src/rest/__tests__/client/AbstractRestClient.unit.test.ts index 17a19e4db1..b8f783041f 100644 --- a/packages/imperative/src/rest/__tests__/client/AbstractRestClient.unit.test.ts +++ b/packages/imperative/src/rest/__tests__/client/AbstractRestClient.unit.test.ts @@ -393,6 +393,56 @@ describe("AbstractRestClient tests", () => { expect(error.errorCode).toBeUndefined(); }); + // called IRL when socket is reused and HTTP 1.1 race condition is hit + it("should handle a socket reuse error", async () => { + const errorObject: any = { + name: "socket hang up", + message: "socket hang up", + code: "ECONNRESET" + }; + + let reusedSocket = true; + const requestFnc = jest.fn((options, callback) => { + const emitter = new MockHttpRequestResponse(); + + ProcessUtils.nextTick(() => { + callback(emitter); + + if (reusedSocket) { + emitter.reusedSocket = true; + ProcessUtils.nextTick(() => { + emitter.emit("error", errorObject); + reusedSocket = false; + }); + } else { + ProcessUtils.nextTick(() => { + emitter.emit("data", Buffer.from("\"response data\"", "utf8")); + }); + + ProcessUtils.nextTick(() => { + emitter.emit("end"); + }); + } + }); + return emitter; + }); + + (https.request as any) = requestFnc; + + let error; + let response: string = ""; + + try { + response = await RestClient.getExpectString(new Session({hostname: "test"}), "/resource"); + } catch (thrownError) { + error = thrownError; + } + + expect(error).not.toBeDefined(); + expect(response).toEqual("\"response data\""); + expect(requestFnc).toHaveBeenCalledTimes(2); + }); + it("should not error when headers and payload data are present in outgoing request", async () => { interface IPayload { diff --git a/packages/imperative/src/rest/__tests__/client/__model__/MockHttpRequestResponse.ts b/packages/imperative/src/rest/__tests__/client/__model__/MockHttpRequestResponse.ts index defc34175d..58f9d59e31 100644 --- a/packages/imperative/src/rest/__tests__/client/__model__/MockHttpRequestResponse.ts +++ b/packages/imperative/src/rest/__tests__/client/__model__/MockHttpRequestResponse.ts @@ -66,4 +66,10 @@ export class MockHttpRequestResponse extends EventEmitter { * @memberof RequestOrResponse */ public headers: { [key: string]: any }; + + /** + * Simulate a reused socket + * @memberof MockHttpRequestResponse + */ + public reusedSocket: boolean = false; } diff --git a/packages/imperative/src/rest/__tests__/client/__snapshots__/AbstractRestClient.unit.test.ts.snap b/packages/imperative/src/rest/__tests__/client/__snapshots__/AbstractRestClient.unit.test.ts.snap index 99e9fe281e..99a9a8a8e5 100644 --- a/packages/imperative/src/rest/__tests__/client/__snapshots__/AbstractRestClient.unit.test.ts.snap +++ b/packages/imperative/src/rest/__tests__/client/__snapshots__/AbstractRestClient.unit.test.ts.snap @@ -38,7 +38,7 @@ Object { } `; -exports[`AbstractRestClient tests should give an error message when error event is called 1`] = `"http(s) request error event called"`; +exports[`AbstractRestClient tests should give an error message when error event is called 1`] = `"Failed to send an HTTP request."`; exports[`AbstractRestClient tests should give an error when no resource URI is provided 1`] = `"Expect Error: Required parameter 'resource' must not be blank"`; diff --git a/packages/imperative/src/rest/src/client/AbstractRestClient.ts b/packages/imperative/src/rest/src/client/AbstractRestClient.ts index c29dadcb3d..ae926f8d3b 100644 --- a/packages/imperative/src/rest/src/client/AbstractRestClient.ts +++ b/packages/imperative/src/rest/src/client/AbstractRestClient.ts @@ -338,11 +338,20 @@ export abstract class AbstractRestClient { errMsg = "http(s) request error event called"; } - reject(this.populateError({ - msg: errMsg, - causeErrors: errorResponse, - source: "client" - })); + // Handle the HTTP 1.1 Keep-Alive race condition + if (errorResponse.code === "ECONNRESET" && clientRequest.reusedSocket) { + this.request(options).then((response: string) => { + resolve(response); + }).catch((err) => { + reject(err); + }); + } else { + reject(this.populateError({ + msg: "Failed to send an HTTP request.", + causeErrors: errorResponse, + source: "client" + })); + } }); if (options.requestStream != null) { diff --git a/packages/zosfiles/__tests__/__system__/methods/invoke/Invoke.system.test.ts b/packages/zosfiles/__tests__/__system__/methods/invoke/Invoke.system.test.ts index 273503352a..917dc8b9d2 100644 --- a/packages/zosfiles/__tests__/__system__/methods/invoke/Invoke.system.test.ts +++ b/packages/zosfiles/__tests__/__system__/methods/invoke/Invoke.system.test.ts @@ -215,7 +215,7 @@ describe("Invoke AMS - encoded", () => { REAL_SESSION = TestEnvironment.createZosmfSession(testEnvironment); - dsname = getUniqueDatasetName(`${systemProps.zosmf.user}.ZOSFILE.ENCO#ED.VSAM`); + dsname = getUniqueDatasetName(`${systemProps.zosmf.user}.ZOSFILE.VSAM`, true); volume = systemProps.datasets.vol.toUpperCase(); }); diff --git a/packages/zosfiles/__tests__/__system__/methods/list/List.system.test.ts b/packages/zosfiles/__tests__/__system__/methods/list/List.system.test.ts index c359540c15..0f33393a48 100644 --- a/packages/zosfiles/__tests__/__system__/methods/list/List.system.test.ts +++ b/packages/zosfiles/__tests__/__system__/methods/list/List.system.test.ts @@ -650,7 +650,7 @@ describe("List command group", () => { let caughtError; try { - response = await List.dataSetsMatchingPattern(REAL_SESSION, [dsname + ".INVALID"]); + response = await List.dataSetsMatchingPattern(REAL_SESSION, [dsname + ".INVAL"]); } catch (error) { caughtError = error; } @@ -987,7 +987,7 @@ describe("List command group - encoded", () => { let caughtError; try { - response = await List.dataSetsMatchingPattern(REAL_SESSION, [dsname + ".INVALID"]); + response = await List.dataSetsMatchingPattern(REAL_SESSION, [dsname + ".INVAL"]); } catch (error) { caughtError = error; } diff --git a/packages/zosjobs/__tests__/__system__/CancelJobs.system.test.ts b/packages/zosjobs/__tests__/__system__/CancelJobs.system.test.ts index 06822f259d..568b61073d 100644 --- a/packages/zosjobs/__tests__/__system__/CancelJobs.system.test.ts +++ b/packages/zosjobs/__tests__/__system__/CancelJobs.system.test.ts @@ -10,7 +10,7 @@ */ import { ImperativeError, Session, RestClientError } from "@zowe/imperative"; -import { CancelJobs, SubmitJobs, IJob } from "../../src"; +import { CancelJobs, SubmitJobs, IJob, DeleteJobs } from "../../src"; import { ITestEnvironment } from "@zowe/cli-test-utils"; import { TestEnvironment } from "../../../../__tests__/__src__/environment/TestEnvironment"; import { ITestPropertiesSchema } from "../../../../__tests__/__src__/properties/ITestPropertiesSchema"; @@ -22,6 +22,7 @@ let sleepJCL: string; let systemProps: ITestPropertiesSchema; let testEnvironment: ITestEnvironment; const LONG_TIMEOUT = 100000; // 100 second timeout - jobs could take a while to complete due to system load +const jobsToDelete: IJob[] = []; describe("CancelJobs System tests", () => { @@ -39,12 +40,23 @@ describe("CancelJobs System tests", () => { sleepJCL = JobTestsUtils.getSleepJCL(REAL_SESSION.ISession.user, ACCOUNT, systemProps.zosjobs.jobclass, maxStepNum); }); + afterAll(async () => { + for (const job of jobsToDelete) { + await DeleteJobs.deleteJob(REAL_SESSION, job.jobname, job.jobid); + } + }); + describe("Positive tests", () => { it("should be able to cancel a job using cancelJob (modify version 1)", async () => { - const job = await SubmitJobs.submitJclNotifyCommon(REAL_SESSION, {jcl: sleepJCL, status: "INPUT"}); - expect(job.retcode).toBeNull(); // job is not complete, no CC - const response = await CancelJobs.cancelJob(REAL_SESSION, job.jobname, job.jobid, "1.0"); - expect(response).toBeUndefined(); + if (testEnvironment.systemTestProperties.zosjobs.skipCIM) { + process.stdout.write("Skipping test because skipCIM is set."); + } else { + const job = await SubmitJobs.submitJclNotifyCommon(REAL_SESSION, {jcl: sleepJCL, status: "INPUT"}); + expect(job.retcode).toBeNull(); // job is not complete, no CC + const response = await CancelJobs.cancelJob(REAL_SESSION, job.jobname, job.jobid, "1.0"); + expect(response).toBeUndefined(); + jobsToDelete.push(job); + } }, LONG_TIMEOUT); it("should be able to cancel a job using cancelJob (modify version 2)", async () => { @@ -53,6 +65,7 @@ describe("CancelJobs System tests", () => { const response = await CancelJobs.cancelJob(REAL_SESSION, job.jobname, job.jobid, "2.0"); expect(response).not.toBeUndefined(); expect(response?.status).toEqual("0"); // intermittent failure + jobsToDelete.push(job); }, LONG_TIMEOUT); it("should be able to cancel a job using cancelJob (modify version default)", async () => { @@ -61,13 +74,19 @@ describe("CancelJobs System tests", () => { const response = await CancelJobs.cancelJob(REAL_SESSION, job.jobname, job.jobid); expect(response).not.toBeUndefined(); expect(response?.status).toEqual("0"); // intermittent failure + jobsToDelete.push(job); }, LONG_TIMEOUT); it("should be able to cancel a job using cancelJobForJob (modify version 1)", async () => { - const job = await SubmitJobs.submitJclNotifyCommon(REAL_SESSION, {jcl: sleepJCL, status: "INPUT"}); - expect(job.retcode).toBeNull(); // job is not complete, no CC - const response = await CancelJobs.cancelJobForJob(REAL_SESSION, job, "1.0"); - expect(response).toBeUndefined(); + if (testEnvironment.systemTestProperties.zosjobs.skipCIM) { + process.stdout.write("Skipping test because skipCIM is set."); + } else { + const job = await SubmitJobs.submitJclNotifyCommon(REAL_SESSION, {jcl: sleepJCL, status: "INPUT"}); + expect(job.retcode).toBeNull(); // job is not complete, no CC + const response = await CancelJobs.cancelJobForJob(REAL_SESSION, job, "1.0"); + expect(response).toBeUndefined(); + jobsToDelete.push(job); + } }, LONG_TIMEOUT); it("should be able to cancel a job using cancelJobForJob (modify version 2)", async () => { @@ -76,6 +95,7 @@ describe("CancelJobs System tests", () => { const response = await CancelJobs.cancelJobForJob(REAL_SESSION, job, "2.0"); expect(response).not.toBeUndefined(); expect(response?.status).toEqual("0"); // intermittent failure + jobsToDelete.push(job); }, LONG_TIMEOUT); it("should be able to cancel a job using cancelJobForJob (modify version default)", async () => { @@ -84,13 +104,19 @@ describe("CancelJobs System tests", () => { const response = await CancelJobs.cancelJobForJob(REAL_SESSION, job); expect(response).not.toBeUndefined(); expect(response?.status).toEqual("0"); // intermittent failure + jobsToDelete.push(job); }, LONG_TIMEOUT); it("should be able to cancel a job using cancelJobCommon (job version 1)", async () => { - const job = await SubmitJobs.submitJclNotifyCommon(REAL_SESSION, {jcl: sleepJCL, status: "INPUT"}); - expect(job.retcode).toBeNull(); // job is not complete, no CC - const response = await CancelJobs.cancelJobCommon(REAL_SESSION, {jobname: job.jobname, jobid: job.jobid, version: "1.0"}); - expect(response).toBeUndefined(); + if (testEnvironment.systemTestProperties.zosjobs.skipCIM) { + process.stdout.write("Skipping test because skipCIM is set."); + } else { + const job = await SubmitJobs.submitJclNotifyCommon(REAL_SESSION, {jcl: sleepJCL, status: "INPUT"}); + expect(job.retcode).toBeNull(); // job is not complete, no CC + const response = await CancelJobs.cancelJobCommon(REAL_SESSION, {jobname: job.jobname, jobid: job.jobid, version: "1.0"}); + expect(response).toBeUndefined(); + jobsToDelete.push(job); + } }, LONG_TIMEOUT); it("should be able to cancel a job using cancelJobCommon (job version 2.0 - synchronous)", async () => { @@ -99,6 +125,7 @@ describe("CancelJobs System tests", () => { const response = await CancelJobs.cancelJobCommon(REAL_SESSION, {jobname: job.jobname, jobid: job.jobid, version: "2.0"}); expect(response).toBeDefined(); expect(response?.status).toEqual("0"); // intermittent failure + jobsToDelete.push(job); }, LONG_TIMEOUT); it("should be able to cancel a job using cancelJobCommon (job version default)", async () => { @@ -106,6 +133,7 @@ describe("CancelJobs System tests", () => { expect(job.retcode).toBeNull(); // job is not complete, no CC const response = await CancelJobs.cancelJobCommon(REAL_SESSION, {jobname: job.jobname, jobid: job.jobid}); expect(response?.status).toEqual("0"); // intermittent failure + jobsToDelete.push(job); }, LONG_TIMEOUT); it("should be able to cancel a job using cancelJobCommon (job version 2.0 - synchronous) and return an error feedback object", async () => { @@ -115,6 +143,7 @@ describe("CancelJobs System tests", () => { expect(response?.status).toEqual("0"); response = await CancelJobs.cancelJobCommon(REAL_SESSION, {jobname: job.jobname, jobid: job.jobid, version: "2.0"}); expect(response?.status).toEqual("156"); + jobsToDelete.push(job); }, LONG_TIMEOUT); }); diff --git a/packages/zosjobs/__tests__/__system__/DeleteJobs.system.test.ts b/packages/zosjobs/__tests__/__system__/DeleteJobs.system.test.ts index a12dc6957c..6f071ec0f7 100644 --- a/packages/zosjobs/__tests__/__system__/DeleteJobs.system.test.ts +++ b/packages/zosjobs/__tests__/__system__/DeleteJobs.system.test.ts @@ -24,6 +24,7 @@ let iefbr14JCL: string; let defaultSystem: ITestPropertiesSchema; let testEnvironment: ITestEnvironment; const LONG_TIMEOUT = 100000; // 100 second timeout - jobs could take a while to complete due to system load +const modifyVersionDefaultUsesCIM = false; describe("DeleteJobs System tests", () => { @@ -44,24 +45,51 @@ describe("DeleteJobs System tests", () => { describe("Positive tests", () => { it("should be able to delete a job using deleteJob", async () => { - const job = await SubmitJobs.submitJclNotifyCommon(REAL_SESSION, {jcl: iefbr14JCL}); - expect(job.retcode).toEqual("CC 0000"); - const response = await DeleteJobs.deleteJob(REAL_SESSION, job.jobname, job.jobid); - expect(response).toBeUndefined(); + if (testEnvironment.systemTestProperties.zosjobs.skipCIM && modifyVersionDefaultUsesCIM) { + process.stdout.write("Skipping test because skipCIM is set."); + } else { + const job = await SubmitJobs.submitJclNotifyCommon(REAL_SESSION, {jcl: iefbr14JCL}); + expect(job.retcode).toEqual("CC 0000"); + const response = await DeleteJobs.deleteJob(REAL_SESSION, job.jobname, job.jobid); + expect(response.message).toEqual("Request was successful."); + expect(response.jobname).toEqual(job.jobname); + expect(response.jobid).toEqual(job.jobid); + expect(response["job-correlator"]).toEqual(job["job-correlator"]); + expect(response.owner).toEqual(job.owner); + expect(response.status).toEqual("0"); + } }, LONG_TIMEOUT); it("should be able to delete a job using deleteJobForJob", async () => { - const job = await SubmitJobs.submitJclNotifyCommon(REAL_SESSION, {jcl: iefbr14JCL}); - expect(job.retcode).toEqual("CC 0000"); - const response = await DeleteJobs.deleteJobForJob(REAL_SESSION, job); - expect(response).toBeUndefined(); + if (testEnvironment.systemTestProperties.zosjobs.skipCIM && modifyVersionDefaultUsesCIM) { + process.stdout.write("Skipping test because skipCIM is set."); + } else { + const job = await SubmitJobs.submitJclNotifyCommon(REAL_SESSION, {jcl: iefbr14JCL}); + expect(job.retcode).toEqual("CC 0000"); + const response = await DeleteJobs.deleteJobForJob(REAL_SESSION, job); + expect(response.message).toEqual("Request was successful."); + expect(response.jobname).toEqual(job.jobname); + expect(response.jobid).toEqual(job.jobid); + expect(response["job-correlator"]).toEqual(job["job-correlator"]); + expect(response.owner).toEqual(job.owner); + expect(response.status).toEqual("0"); + } }, LONG_TIMEOUT); it("should be able to delete a job using deleteJobCommon", async () => { - const job = await SubmitJobs.submitJclNotifyCommon(REAL_SESSION, {jcl: iefbr14JCL}); - expect(job.retcode).toEqual("CC 0000"); - const response = await DeleteJobs.deleteJobCommon(REAL_SESSION, {jobname: job.jobname, jobid: job.jobid}); - expect(response).toBeUndefined(); + if (testEnvironment.systemTestProperties.zosjobs.skipCIM && modifyVersionDefaultUsesCIM) { + process.stdout.write("Skipping test because skipCIM is set."); + } else { + const job = await SubmitJobs.submitJclNotifyCommon(REAL_SESSION, {jcl: iefbr14JCL}); + expect(job.retcode).toEqual("CC 0000"); + const response = await DeleteJobs.deleteJobCommon(REAL_SESSION, {jobname: job.jobname, jobid: job.jobid}); + expect(response.message).toEqual("Request was successful."); + expect(response.jobname).toEqual(job.jobname); + expect(response.jobid).toEqual(job.jobid); + expect(response["job-correlator"]).toEqual(job["job-correlator"]); + expect(response.owner).toEqual(job.owner); + expect(response.status).toEqual("0"); + } }, LONG_TIMEOUT); it("should be able to delete a job using deleteJobCommon (job modify version 2.0 - synchronous)", async () => { @@ -153,21 +181,36 @@ describe("DeleteJobs System tests - Encoded", () => { const job = await SubmitJobs.submitJclNotifyCommon(REAL_SESSION, {jcl: iefbr14JCL}); expect(job.retcode).toEqual("CC 0000"); const response = await DeleteJobs.deleteJob(REAL_SESSION, job.jobname, job.jobid); - expect(response).toBeUndefined(); + expect(response.message).toEqual("Request was successful."); + expect(response.jobname).toEqual(job.jobname); + expect(response.jobid).toEqual(job.jobid); + expect(response["job-correlator"]).toEqual(job["job-correlator"]); + expect(response.owner).toEqual(job.owner); + expect(response.status).toEqual("0"); }, LONG_TIMEOUT); it("should be able to delete a job using deleteJobForJob", async () => { const job = await SubmitJobs.submitJclNotifyCommon(REAL_SESSION, {jcl: iefbr14JCL}); expect(job.retcode).toEqual("CC 0000"); const response = await DeleteJobs.deleteJobForJob(REAL_SESSION, job); - expect(response).toBeUndefined(); + expect(response.message).toEqual("Request was successful."); + expect(response.jobname).toEqual(job.jobname); + expect(response.jobid).toEqual(job.jobid); + expect(response["job-correlator"]).toEqual(job["job-correlator"]); + expect(response.owner).toEqual(job.owner); + expect(response.status).toEqual("0"); }, LONG_TIMEOUT); it("should be able to delete a job using deleteJobCommon", async () => { const job = await SubmitJobs.submitJclNotifyCommon(REAL_SESSION, {jcl: iefbr14JCL}); expect(job.retcode).toEqual("CC 0000"); const response = await DeleteJobs.deleteJobCommon(REAL_SESSION, {jobname: job.jobname, jobid: job.jobid}); - expect(response).toBeUndefined(); + expect(response.message).toEqual("Request was successful."); + expect(response.jobname).toEqual(job.jobname); + expect(response.jobid).toEqual(job.jobid); + expect(response["job-correlator"]).toEqual(job["job-correlator"]); + expect(response.owner).toEqual(job.owner); + expect(response.status).toEqual("0"); }, LONG_TIMEOUT); it("should be able to delete a job using deleteJobCommon (job modify version 2.0 - synchronous)", async () => { diff --git a/packages/zosjobs/__tests__/__system__/GetJobs.system.test.ts b/packages/zosjobs/__tests__/__system__/GetJobs.system.test.ts index 94732d63da..e5b22dec8a 100644 --- a/packages/zosjobs/__tests__/__system__/GetJobs.system.test.ts +++ b/packages/zosjobs/__tests__/__system__/GetJobs.system.test.ts @@ -18,6 +18,7 @@ import { join } from "path"; import { ITestEnvironment } from "@zowe/cli-test-utils"; import { TestEnvironment } from "../../../../__tests__/__src__/environment/TestEnvironment"; import { ITestPropertiesSchema } from "../../../../__tests__/__src__/properties/ITestPropertiesSchema"; +import { delay } from "../../../../__tests__/__src__/TestUtils"; /**********************************************************************************/ let ACCOUNT: string; @@ -722,8 +723,7 @@ describe("Get Status APIs", () => { it("should be able to get a job that was submitted and get proper error when the job is deleted", async () => { const job = await SubmitJobs.submitJcl(REAL_SESSION, JCL); - const jobStatus = await GetJobs.getStatusForJob(REAL_SESSION, job); - + delay(3000); await DeleteJobs.deleteJobForJob(REAL_SESSION, job); await waitThreeSeconds(); // make sure jobs is deleted let error; @@ -978,6 +978,7 @@ describe("Get JCL APIs", () => { describe("invalid request error handling", () => { it("should detect and surface an error for getting JCL that doesnt exist", async () => { const job = await SubmitJobs.submitJcl(REAL_SESSION, JCL); + delay(3000); await DeleteJobs.deleteJobForJob(REAL_SESSION, job); await waitThreeSeconds(); let error; diff --git a/packages/zosjobs/__tests__/__system__/ModifyJobs.system.test.ts b/packages/zosjobs/__tests__/__system__/ModifyJobs.system.test.ts index f2bb072a1a..67d7650f8a 100644 --- a/packages/zosjobs/__tests__/__system__/ModifyJobs.system.test.ts +++ b/packages/zosjobs/__tests__/__system__/ModifyJobs.system.test.ts @@ -15,6 +15,7 @@ import { ITestEnvironment } from "@zowe/cli-test-utils"; import { TestEnvironment } from "../../../../__tests__/__src__/environment/TestEnvironment"; import { ITestPropertiesSchema } from "../../../../__tests__/__src__/properties/ITestPropertiesSchema"; import { JobTestsUtils } from "./JobTestsUtils"; +import { delay } from "../../../../__tests__/__src__/TestUtils"; let testEnvironment: ITestEnvironment; let systemProps: ITestPropertiesSchema; @@ -47,6 +48,10 @@ describe("Modify Jobs - System Tests", () => { await TestEnvironment.cleanUp(testEnvironment); }); + beforeEach(async () => { + await delay(1000); + }); + describe("Positive tests", () => { it("should return a success message once jobclass has been modified", async () => { const job: any = await ModifyJobs.modifyJobCommon( @@ -120,6 +125,10 @@ describe("Modify Jobs - System Tests - Encoded", () => { await TestEnvironment.cleanUp(testEnvironment); }); + beforeEach(async () => { + await delay(1000); + }); + describe("Positive tests", () => { it("should return a success message once jobclass has been modified", async () => { const job: any = await ModifyJobs.modifyJobCommon( diff --git a/packages/zosjobs/__tests__/__system__/MonitorJobs.system.test.ts b/packages/zosjobs/__tests__/__system__/MonitorJobs.system.test.ts index 55999d62fa..cbeb6aa798 100644 --- a/packages/zosjobs/__tests__/__system__/MonitorJobs.system.test.ts +++ b/packages/zosjobs/__tests__/__system__/MonitorJobs.system.test.ts @@ -18,6 +18,7 @@ import { ZosmfRestClient } from "@zowe/core-for-zowe-sdk"; import { ITestEnvironment } from "@zowe/cli-test-utils"; import { TestEnvironment } from "../../../../__tests__/__src__/environment/TestEnvironment"; import { ITestPropertiesSchema } from "../../../../__tests__/__src__/properties/ITestPropertiesSchema"; +import { delay } from "../../../../__tests__/__src__/TestUtils"; // long running test timeout const LONG_TIMEOUT = 100000; @@ -45,6 +46,7 @@ let MONITOR_JOB_NAME: string; // Utility function to cleanup async function cleanTestJobs() { // The tests may submit jobs - we will clean every job that may have been left by failures, etc. + await delay(1000); // Wait for jobs to register in z/OSMF const jobs: IJob[] = await GetJobs.getJobsCommon(REAL_SESSION, {owner: REAL_SESSION.ISession.user, prefix: MONITOR_JOB_NAME}); if (jobs.length > 0) { for (const job of jobs) { @@ -84,12 +86,8 @@ describe("System Tests - Monitor Jobs", () => { SYSAFF = testEnvironment.systemTestProperties.zosjobs.sysaff; }); - // Cleanup before & after each test - this will ensure that hopefully no jobs are left outstanding (or are currently + // Cleanup after each test - this will ensure that hopefully no jobs are left outstanding (or are currently // outstanding) when the tests run - beforeEach(async () => { - GetJobs.getStatusCommon = ORIG_JOBS_STATUS; - await cleanTestJobs(); - }); afterEach(async () => { GetJobs.getStatusCommon = ORIG_JOBS_STATUS; await cleanTestJobs(); diff --git a/packages/zosjobs/__tests__/__unit__/DeleteJobs.unit.test.ts b/packages/zosjobs/__tests__/__unit__/DeleteJobs.unit.test.ts index c28a5c0015..26a416e269 100644 --- a/packages/zosjobs/__tests__/__unit__/DeleteJobs.unit.test.ts +++ b/packages/zosjobs/__tests__/__unit__/DeleteJobs.unit.test.ts @@ -46,7 +46,7 @@ describe("Delete Jobs unit tests", () => { describe("Positive tests", () => { it("should allow users to call deleteJob with correct parameters", async () => { - ZosmfRestClient.deleteExpectJSON = jest.fn(returnDeleteJobsDataAsync); + ZosmfRestClient.deleteExpectJSON = jest.fn().mockReturnValue(CancelJobsData.SAMPLE_JOB_FEEDBACK_GOOD); let caughtError; let response; try { @@ -55,11 +55,11 @@ describe("Delete Jobs unit tests", () => { caughtError = error; } expect(caughtError).toBeUndefined(); - expect(response).toEqual(CancelJobsData.SAMPLE_JOB_FEEDBACK_ASYNC); + expect(response).toEqual(CancelJobsData.SAMPLE_JOB_FEEDBACK_GOOD); }); it("should allow users to call deleteJobForJob with correct parameters", async () => { - ZosmfRestClient.deleteExpectJSON = jest.fn(returnDeleteJobsDataAsync); + ZosmfRestClient.deleteExpectJSON = jest.fn().mockReturnValue(CancelJobsData.SAMPLE_JOB_FEEDBACK_GOOD); let caughtError; let response; try { @@ -68,7 +68,7 @@ describe("Delete Jobs unit tests", () => { caughtError = error; } expect(caughtError).toBeUndefined(); - expect(response).toEqual(CancelJobsData.SAMPLE_JOB_FEEDBACK_ASYNC); + expect(response).toEqual(CancelJobsData.SAMPLE_JOB_FEEDBACK_GOOD); }); it("should allow users to call deleteJobForJob with correct parameters (with modify version 1_0)", async () => { @@ -99,7 +99,7 @@ describe("Delete Jobs unit tests", () => { }); it("should allow users to call deleteJobCommon with correct parameters", async () => { - ZosmfRestClient.deleteExpectJSON = jest.fn(returnDeleteJobsDataAsync); + ZosmfRestClient.deleteExpectJSON = jest.fn().mockReturnValue(CancelJobsData.SAMPLE_JOB_FEEDBACK_GOOD); let caughtError; let response; try { @@ -108,7 +108,7 @@ describe("Delete Jobs unit tests", () => { caughtError = error; } expect(caughtError).toBeUndefined(); - expect(response).toEqual(CancelJobsData.SAMPLE_JOB_FEEDBACK_ASYNC); + expect(response).toEqual(CancelJobsData.SAMPLE_JOB_FEEDBACK_GOOD); }); it("should allow users to call deleteJobCommon with correct parameters (with modify version 1_0)", async () => { diff --git a/packages/zosjobs/src/DeleteJobs.ts b/packages/zosjobs/src/DeleteJobs.ts index fa9afbee52..0fb7204700 100644 --- a/packages/zosjobs/src/DeleteJobs.ts +++ b/packages/zosjobs/src/DeleteJobs.ts @@ -78,12 +78,14 @@ export class DeleteJobs { const parameters: string = IO.FILE_DELIM + encodeURIComponent(parms.jobname) + IO.FILE_DELIM + encodeURIComponent(parms.jobid); const responseJson = await ZosmfRestClient.deleteExpectJSON(session, JobsConstants.RESOURCE + parameters, headers); - if (parms.modifyVersion === "2.0") { + if (parms.modifyVersion === "1.0") { + return undefined; + } else { const responseFeedback = responseJson as IJobFeedback; // Turns out status is a number, but we cannot introduce breaking changes. responseFeedback.status = responseFeedback.status.toString(); return responseFeedback; - } else { return undefined; } + } } diff --git a/packages/zosmf/__tests__/__system__/methods/CheckStatus.system.test.ts b/packages/zosmf/__tests__/__system__/methods/CheckStatus.system.test.ts index e1538eb64d..0cb2fd9fe1 100644 --- a/packages/zosmf/__tests__/__system__/methods/CheckStatus.system.test.ts +++ b/packages/zosmf/__tests__/__system__/methods/CheckStatus.system.test.ts @@ -118,8 +118,10 @@ describe("Check Status Api", () => { expect(error).toBeTruthy(); expect(response).toBeFalsy(); - expect(error.message).toContain(`Error: connect ECONNREFUSED`); - expect(error.message).toContain(badPort.toString()); - }); + const jsonCauseErrors = error.causeErrors; + expect(jsonCauseErrors.code).toMatch(/(ECONNREFUSED|ECONNRESET|ETIMEDOUT)/); + expect(jsonCauseErrors.syscall).toEqual("connect"); + expect(jsonCauseErrors.port).toEqual(badPort); + }, 300000); }); }); diff --git a/packages/zosmf/__tests__/__system__/methods/ListDefinedSystems.system.test.ts b/packages/zosmf/__tests__/__system__/methods/ListDefinedSystems.system.test.ts index fefeda5c95..3a0ca1139e 100644 --- a/packages/zosmf/__tests__/__system__/methods/ListDefinedSystems.system.test.ts +++ b/packages/zosmf/__tests__/__system__/methods/ListDefinedSystems.system.test.ts @@ -118,7 +118,9 @@ describe("List Defined Systems Api", () => { expect(error).toBeTruthy(); expect(response).toBeFalsy(); - expect(error.message).toMatch(/Error: (connect|read) (ECONNREFUSED|ECONNRESET)/); - }); + const jsonCauseErrors = error.causeErrors; + expect(jsonCauseErrors.code).toMatch(/(ECONNREFUSED|ECONNRESET|ETIMEDOUT)/); + expect(jsonCauseErrors.syscall).toMatch(/(connect|read)/); + }, 300000); }); }); diff --git a/packages/zosuss/__tests__/__system__/Shell.system.test.ts b/packages/zosuss/__tests__/__system__/Shell.system.test.ts index 1f8c07360d..eece57bd59 100644 --- a/packages/zosuss/__tests__/__system__/Shell.system.test.ts +++ b/packages/zosuss/__tests__/__system__/Shell.system.test.ts @@ -126,7 +126,7 @@ describe("zowe uss issue ssh api call test", () => { it("should handle errors correctly when connection is refused", async () => { const invalidSshSession = new SshSession({ - hostname: "localhost", + hostname: "127.0.0.1", port: 22, user: "root", password: "**ThisPasswordIsExpectedNotToBeTheRealPasswordForRoot**"