diff --git a/ci/container/test_component.sh b/ci/container/test_component.sh index 0d38f9e99..fb069dfad 100755 --- a/ci/container/test_component.sh +++ b/ci/container/test_component.sh @@ -92,6 +92,8 @@ else ) fi +echo "[INFO] Mocha CMD: $MOCHA_CMD" + if [[ -z "$GITHUB_ACTIONS" ]]; then echo "[INFO] Running Internal Tests. Test result: $WORKSPACE/junit-system-test.xml" if ! ${MOCHA_CMD[@]} "$SOURCE_ROOT/system_test/**/*.{js,ts}"; then diff --git a/lib/connection/connection_config.js b/lib/connection/connection_config.js index c7f59a83b..c9ce0fb78 100644 --- a/lib/connection/connection_config.js +++ b/lib/connection/connection_config.js @@ -1129,15 +1129,18 @@ function createParameters() { { name: PARAM_RETRY_SF_MAX_NUM_RETRIES, defaultValue: 1000, + external: true, validate: isNonNegativeInteger }, { name: PARAM_RETRY_SF_STARTING_SLEEP_TIME, defaultValue: 1, + external: true, validate: isNonNegativeNumber }, { name: PARAM_RETRY_SF_MAX_SLEEP_TIME, + external: true, defaultValue: 16, validate: isNonNegativeNumber } diff --git a/lib/connection/statement.js b/lib/connection/statement.js index a36854eef..7fe5030c0 100644 --- a/lib/connection/statement.js +++ b/lib/connection/statement.js @@ -1492,9 +1492,10 @@ function sendSfRequest(statementContext, options, appendQueryParamOnRetry) { // if we haven't exceeded the maximum number of retries yet and the server // came back with a retryable error code if (numRetries < maxNumRetries && - err && Util.isRetryableHttpError( - err.response, false // no retry for HTTP 403 - )) { + err && (!err.response || (Util.isRetryableHttpError(err.response, false)) + // || Util.isNetworkError(err) + ) + ) { // increment the retry count numRetries++; lastStatusCodeForRetry = err.response ? err.response.statusCode : 0; diff --git a/test/authentication/connectionParameters.js b/test/authentication/connectionParameters.js index 73e1f651b..d3089de89 100644 --- a/test/authentication/connectionParameters.js +++ b/test/authentication/connectionParameters.js @@ -191,6 +191,17 @@ const oauthOktaAuthorizationCode = enableExperimentalAuthentication: true }; +const wiremock = + { + ...baseParameters, + accessUrl: null, + username: 'MOCK_USERNAME', + account: 'MOCK_ACCOUNT_NAME', + host: 'localhost', + protocol: 'http', + authenticator: 'OAUTH', + }; + exports.externalBrowser = externalBrowser; exports.okta = okta; exports.oauth = oauth; @@ -220,3 +231,4 @@ exports.snowflakeAuthTestOauthOktaPassword = snowflakeAuthTestOauthOktaPassword; exports.snowflakeAuthTestOauthOktaClientId = snowflakeAuthTestOauthOktaClientId; exports.oauthSnowflakeWildcardsAuthorizationCode = oauthSnowflakeWildcardsAuthorizationCode; exports.oauthOktaAuthorizationCode = oauthOktaAuthorizationCode; +exports.wiremock = wiremock; diff --git a/test/integration/testConnectionRetries.js b/test/integration/testConnectionRetries.js new file mode 100644 index 000000000..f9a6e214a --- /dev/null +++ b/test/integration/testConnectionRetries.js @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2015-2024 Snowflake Computing Inc. All rights reserved. + */ + +const { runWireMockAsync, addWireMockMappingsFromFile } = require('../wiremockRunner'); +const connParameters = require('../authentication/connectionParameters'); +const testUtil = require('../integration/testUtil'); +const snowflake = require('../../lib/snowflake'); +const assert = require('assert'); + +describe('Connection test', function () { + this.timeout(500000); + let port; + let wireMock; + + before(async () => { + port = await testUtil.getFreePort(); + wireMock = await runWireMockAsync(port); + snowflake.configure({ + logLevel: 'DEBUG', + disableOCSPChecks: true + }); + }); + + afterEach(async () => { + wireMock.scenarios.resetAllScenarios(); + }); + + after(async () => { + await wireMock.global.shutdown(); + }); + + it('Test retries after connection reset - success', async function () { + await addWireMockMappingsFromFile(wireMock, 'wiremock/mappings/six_reset_connection_and_correct_response.json'); + const connectionOption = { ...connParameters.wiremock, password: 'MOCK_TOKEN', port: port, sfRetryMaxSleepTime: 2, sfRetryMaxNumRetries: 10 }; + const connection = testUtil.createConnection(connectionOption); + await testUtil.connectAsync(connection); + await assert.doesNotReject(async () => await testUtil.executeCmdAsync(connection, ' Select 1')); + }); + + it('Test retries after malformed response', async function () { + await addWireMockMappingsFromFile(wireMock, 'wiremock/mappings/six_malformed_and_correct.json'); + const connectionOption = { ...connParameters.wiremock, password: 'MOCK_TOKEN', port: port, sfRetryMaxSleepTime: 2 }; + const connection = testUtil.createConnection(connectionOption); + await testUtil.connectAsync(connection); + await assert.doesNotReject(async () => await testUtil.executeCmdAsync(connection, ' Select 1')); + }); + + it('Test retries after connection reset - fail', async function () { + await addWireMockMappingsFromFile(wireMock, 'wiremock/mappings/six_reset_connection_and_correct_response.json'); + const connectionOption = { ...connParameters.wiremock, password: 'MOCK_TOKEN', port: port, sfRetryMaxNumRetries: 1, sfRetryMaxSleepTime: 2 }; + const connection = testUtil.createConnection(connectionOption); + await testUtil.connectAsync(connection); + await assert.rejects( + testUtil.executeCmdAsync(connection, ' Select 1'), + (err) => { + assert.match(err.message, /Network error. Could not reach Snowflake./); + return true; + }, + ); + }); +}); + + diff --git a/test/integration/wiremock/testWiremockRunner.js b/test/integration/wiremock/testWiremockRunner.js index 17d4f3f6b..41e793b15 100644 --- a/test/integration/wiremock/testWiremockRunner.js +++ b/test/integration/wiremock/testWiremockRunner.js @@ -1,25 +1,15 @@ const assert = require('assert'); const fs = require('fs'); -const net = require('net'); const axios = require('axios'); const { runWireMockAsync } = require('../../wiremockRunner'); const os = require('os'); - -async function getFreePort() { - return new Promise(res => { - const srv = net.createServer(); - srv.listen(0, () => { - const port = srv.address().port; - srv.close(() => res(port)); - }); - }); -} +const testUtil = require('../testUtil'); if (os.platform !== 'win32') { describe('Wiremock test', function () { let port, wireMock; before(async () => { - port = await getFreePort(); + port = await testUtil.getFreePort(); wireMock = await runWireMockAsync(port); }); after(async () => { diff --git a/wiremock/mappings/six_malformed_and_correct.json b/wiremock/mappings/six_malformed_and_correct.json new file mode 100644 index 000000000..edb7340a5 --- /dev/null +++ b/wiremock/mappings/six_malformed_and_correct.json @@ -0,0 +1,599 @@ +{ + "mappings": [ + { + "scenarioName": "Successful login", + "requiredScenarioState": "Started", + "request": { + "urlPathPattern": "/session/v1/login-request.*", + "method": "POST" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "jsonBody": { + "data": { + "masterToken": "master token", + "token": "session token", + "validityInSeconds": 3600, + "masterValidityInSeconds": 14400, + "displayUserName": "OAUTH_TEST_AUTH_CODE", + "serverVersion": "8.48.0 b2024121104444034239f05", + "firstLogin": false, + "remMeToken": null, + "remMeValidityInSeconds": 0, + "healthCheckInterval": 45, + "newClientForUpgrade": "3.12.3", + "sessionId": 1172562260498, + "parameters": [ + { + "name": "CLIENT_PREFETCH_THREADS", + "value": 4 + }, + { + "name": "TIMESTAMP_OUTPUT_FORMAT", + "value": "YYYY-MM-DD HH24:MI:SS.FF3 TZHTZM" + }, + { + "name": "TIME_OUTPUT_FORMAT", + "value": "HH24:MI:SS" + }, + { + "name": "TIMESTAMP_TZ_OUTPUT_FORMAT", + "value": "" + }, + { + "name": "CLIENT_RESULT_CHUNK_SIZE", + "value": 16 + }, + { + "name": "CLIENT_SESSION_KEEP_ALIVE", + "value": false + }, + { + "name": "JDBC_RS_COLUMN_CASE_INSENSITIVE", + "value": false + }, + { + "name": "SNOWPARK_HIDE_INTERNAL_ALIAS", + "value": true + }, + { + "name": "CLIENT_CONSERVATIVE_MEMORY_ADJUST_STEP", + "value": 64 + }, + { + "name": "QUERY_CONTEXT_CACHE_SIZE", + "value": 5 + }, + { + "name": "CLIENT_METADATA_USE_SESSION_DATABASE", + "value": false + }, + { + "name": "JDBC_ENABLE_COMBINED_DESCRIBE", + "value": true + }, + { + "name": "ENABLE_STAGE_S3_PRIVATELINK_FOR_US_EAST_1", + "value": true + }, + { + "name": "JDBC_TREAT_DECIMAL_AS_INT", + "value": true + }, + { + "name": "CLIENT_RESULT_PREFETCH_THREADS", + "value": 1 + }, + { + "name": "TIMESTAMP_NTZ_OUTPUT_FORMAT", + "value": "YYYY-MM-DD HH24:MI:SS.FF3" + }, + { + "name": "CLIENT_METADATA_REQUEST_USE_CONNECTION_CTX", + "value": false + }, + { + "name": "CLIENT_HONOR_CLIENT_TZ_FOR_TIMESTAMP_NTZ", + "value": true + }, + { + "name": "CLIENT_MEMORY_LIMIT", + "value": 1536 + }, + { + "name": "CLIENT_TIMESTAMP_TYPE_MAPPING", + "value": "TIMESTAMP_LTZ" + }, + { + "name": "JDBC_EFFICIENT_CHUNK_STORAGE", + "value": true + }, + { + "name": "TIMEZONE", + "value": "America/Los_Angeles" + }, + { + "name": "SNOWPARK_REQUEST_TIMEOUT_IN_SECONDS", + "value": 86400 + }, + { + "name": "PYTHON_SNOWPARK_USE_AST", + "value": false + }, + { + "name": "SERVICE_NAME", + "value": "" + }, + { + "name": "CLIENT_RESULT_PREFETCH_SLOTS", + "value": 2 + }, + { + "name": "CLIENT_DISABLE_INCIDENTS", + "value": true + }, + { + "name": "JDBC_ENABLE_PUT_GET", + "value": true + }, + { + "name": "CLIENT_ENABLE_CONSERVATIVE_MEMORY_USAGE", + "value": true + }, + { + "name": "BINARY_OUTPUT_FORMAT", + "value": "HEX" + }, + { + "name": "CSV_TIMESTAMP_FORMAT", + "value": "" + }, + { + "name": "CLIENT_TELEMETRY_SESSIONLESS_ENABLED", + "value": true + }, + { + "name": "DATE_OUTPUT_FORMAT", + "value": "YYYY-MM-DD" + }, + { + "name": "JDBC_FORMAT_DATE_WITH_TIMEZONE", + "value": true + }, + { + "name": "SNOWPARK_LAZY_ANALYSIS", + "value": true + }, + { + "name": "JDBC_USE_JSON_PARSER", + "value": true + }, + { + "name": "CLIENT_SESSION_KEEP_ALIVE_HEARTBEAT_FREQUENCY", + "value": 3600 + }, + { + "name": "AUTOCOMMIT", + "value": true + }, + { + "name": "CLIENT_SESSION_CLONE", + "value": false + }, + { + "name": "TIMESTAMP_LTZ_OUTPUT_FORMAT", + "value": "" + }, + { + "name": "VARIANT_MAX_SIZE_IN_RESULT", + "value": 134217728 + }, + { + "name": "JDBC_USE_SESSION_TIMEZONE", + "value": true + }, + { + "name": "JDBC_TREAT_TIMESTAMP_NTZ_AS_UTC", + "value": false + }, + { + "name": "JDBC_EXECUTE_RETURN_COUNT_FOR_DML", + "value": false + }, + { + "name": "ENABLE_FIX_1247059", + "value": true + }, + { + "name": "CLIENT_OUT_OF_BAND_TELEMETRY_ENABLED", + "value": false + }, + { + "name": "VARCHAR_AND_BINARY_MAX_SIZE_IN_RESULT", + "value": 134217728 + }, + { + "name": "SNOWPARK_USE_SCOPED_TEMP_OBJECTS", + "value": true + }, + { + "name": "CLIENT_TELEMETRY_ENABLED", + "value": true + }, + { + "name": "CLIENT_USE_V1_QUERY_API", + "value": true + }, + { + "name": "CLIENT_RESULT_COLUMN_CASE_INSENSITIVE", + "value": false + }, + { + "name": "CLIENT_ENABLE_LOG_INFO_STATEMENT_PARAMETERS", + "value": false + }, + { + "name": "CLIENT_STAGE_ARRAY_BINDING_THRESHOLD", + "value": 65280 + } + ], + "sessionInfo": { + "databaseName": "TEST_DHEYMAN", + "schemaName": "TEST_JDBC", + "warehouseName": "TEST_XSMALL", + "roleName": "ANALYST" + }, + "idToken": null, + "idTokenValidityInSeconds": 0, + "responseData": null, + "mfaToken": null, + "mfaTokenValidityInSeconds": 0 + }, + "code": null, + "message": null, + "success": true + } + } + }, + { + "scenarioName": "Heartbeat", + "requiredScenarioState": "Started", + "request": { + "urlPathPattern": "/session/heartbeat.*", + "method": "POST" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "jsonBody": { + "data": { + "masterToken": "master token", + "token": "session token", + "validityInSeconds": 3600, + "masterValidityInSeconds": 14400, + "displayUserName": "OAUTH_TEST_AUTH_CODE", + "serverVersion": "8.48.0 b2024121104444034239f05", + "firstLogin": false, + "remMeToken": null, + "remMeValidityInSeconds": 0, + "healthCheckInterval": 45, + "newClientForUpgrade": "3.12.3", + "sessionId": 1172562260498, + "parameters": [ + { + "name": "CLIENT_PREFETCH_THREADS", + "value": 4 + }, + { + "name": "TIMESTAMP_OUTPUT_FORMAT", + "value": "YYYY-MM-DD HH24:MI:SS.FF3 TZHTZM" + }, + { + "name": "TIME_OUTPUT_FORMAT", + "value": "HH24:MI:SS" + }, + { + "name": "TIMESTAMP_TZ_OUTPUT_FORMAT", + "value": "" + }, + { + "name": "CLIENT_RESULT_CHUNK_SIZE", + "value": 16 + }, + { + "name": "CLIENT_SESSION_KEEP_ALIVE", + "value": false + }, + { + "name": "JDBC_RS_COLUMN_CASE_INSENSITIVE", + "value": false + }, + { + "name": "SNOWPARK_HIDE_INTERNAL_ALIAS", + "value": true + }, + { + "name": "CLIENT_CONSERVATIVE_MEMORY_ADJUST_STEP", + "value": 64 + }, + { + "name": "QUERY_CONTEXT_CACHE_SIZE", + "value": 5 + }, + { + "name": "CLIENT_METADATA_USE_SESSION_DATABASE", + "value": false + }, + { + "name": "JDBC_ENABLE_COMBINED_DESCRIBE", + "value": true + }, + { + "name": "ENABLE_STAGE_S3_PRIVATELINK_FOR_US_EAST_1", + "value": true + }, + { + "name": "JDBC_TREAT_DECIMAL_AS_INT", + "value": true + }, + { + "name": "CLIENT_RESULT_PREFETCH_THREADS", + "value": 1 + }, + { + "name": "TIMESTAMP_NTZ_OUTPUT_FORMAT", + "value": "YYYY-MM-DD HH24:MI:SS.FF3" + }, + { + "name": "CLIENT_METADATA_REQUEST_USE_CONNECTION_CTX", + "value": false + }, + { + "name": "CLIENT_HONOR_CLIENT_TZ_FOR_TIMESTAMP_NTZ", + "value": true + }, + { + "name": "CLIENT_MEMORY_LIMIT", + "value": 1536 + }, + { + "name": "CLIENT_TIMESTAMP_TYPE_MAPPING", + "value": "TIMESTAMP_LTZ" + }, + { + "name": "JDBC_EFFICIENT_CHUNK_STORAGE", + "value": true + }, + { + "name": "TIMEZONE", + "value": "America/Los_Angeles" + }, + { + "name": "SNOWPARK_REQUEST_TIMEOUT_IN_SECONDS", + "value": 86400 + }, + { + "name": "PYTHON_SNOWPARK_USE_AST", + "value": false + }, + { + "name": "SERVICE_NAME", + "value": "" + }, + { + "name": "CLIENT_RESULT_PREFETCH_SLOTS", + "value": 2 + }, + { + "name": "CLIENT_DISABLE_INCIDENTS", + "value": true + }, + { + "name": "JDBC_ENABLE_PUT_GET", + "value": true + }, + { + "name": "CLIENT_ENABLE_CONSERVATIVE_MEMORY_USAGE", + "value": true + }, + { + "name": "BINARY_OUTPUT_FORMAT", + "value": "HEX" + }, + { + "name": "CSV_TIMESTAMP_FORMAT", + "value": "" + }, + { + "name": "CLIENT_TELEMETRY_SESSIONLESS_ENABLED", + "value": true + }, + { + "name": "DATE_OUTPUT_FORMAT", + "value": "YYYY-MM-DD" + }, + { + "name": "JDBC_FORMAT_DATE_WITH_TIMEZONE", + "value": true + }, + { + "name": "SNOWPARK_LAZY_ANALYSIS", + "value": true + }, + { + "name": "JDBC_USE_JSON_PARSER", + "value": true + }, + { + "name": "CLIENT_SESSION_KEEP_ALIVE_HEARTBEAT_FREQUENCY", + "value": 3600 + }, + { + "name": "AUTOCOMMIT", + "value": true + }, + { + "name": "CLIENT_SESSION_CLONE", + "value": false + }, + { + "name": "TIMESTAMP_LTZ_OUTPUT_FORMAT", + "value": "" + }, + { + "name": "VARIANT_MAX_SIZE_IN_RESULT", + "value": 134217728 + }, + { + "name": "JDBC_USE_SESSION_TIMEZONE", + "value": true + }, + { + "name": "JDBC_TREAT_TIMESTAMP_NTZ_AS_UTC", + "value": false + }, + { + "name": "JDBC_EXECUTE_RETURN_COUNT_FOR_DML", + "value": false + }, + { + "name": "ENABLE_FIX_1247059", + "value": true + }, + { + "name": "CLIENT_OUT_OF_BAND_TELEMETRY_ENABLED", + "value": false + }, + { + "name": "VARCHAR_AND_BINARY_MAX_SIZE_IN_RESULT", + "value": 134217728 + }, + { + "name": "SNOWPARK_USE_SCOPED_TEMP_OBJECTS", + "value": true + }, + { + "name": "CLIENT_TELEMETRY_ENABLED", + "value": true + }, + { + "name": "CLIENT_USE_V1_QUERY_API", + "value": true + }, + { + "name": "CLIENT_RESULT_COLUMN_CASE_INSENSITIVE", + "value": false + }, + { + "name": "CLIENT_ENABLE_LOG_INFO_STATEMENT_PARAMETERS", + "value": false + }, + { + "name": "CLIENT_STAGE_ARRAY_BINDING_THRESHOLD", + "value": 65280 + } + ], + "sessionInfo": { + "databaseName": "TEST_DHEYMAN", + "schemaName": "TEST_JDBC", + "warehouseName": "TEST_XSMALL", + "roleName": "ANALYST" + }, + "idToken": null, + "idTokenValidityInSeconds": 0, + "responseData": null, + "mfaToken": null, + "mfaTokenValidityInSeconds": 0 + }, + "code": null, + "message": null, + "success": true + } + } + }, + { + "scenarioName": "malformed_response_retry", + "requiredScenarioState": "Started", + "newScenarioState": "MALFORMED_RETRY_1", + "request": { + "urlPathPattern": "/queries/v1/query-request.*", + "method": "POST" + }, + "response": { + "fault": "MALFORMED_RESPONSE_CHUNK" + } + }, + { + "scenarioName": "malformed_response_retry", + "requiredScenarioState": "MALFORMED_RETRY_1", + "newScenarioState": "MALFORMED_RETRY_2", + "request": { + "urlPathPattern": "/queries/v1/query-request.*", + "method": "POST" + }, + "response": { + "fault": "MALFORMED_RESPONSE_CHUNK" + } + }, + { + "scenarioName": "malformed_response_retry", + "requiredScenarioState": "MALFORMED_RETRY_2", + "newScenarioState": "MALFORMED_RETRY_3", + "request": { + "urlPathPattern": "/queries/v1/query-request.*", + "method": "POST" + }, + "response": { + "fault": "MALFORMED_RESPONSE_CHUNK" + } + }, + { + "scenarioName": "malformed_response_retry", + "requiredScenarioState": "MALFORMED_RETRY_3", + "newScenarioState": "CORRECT", + "request": { + "urlPathPattern": "/queries/v1/query-request.*", + "method": "POST" + }, + "response": { + "fault": "MALFORMED_RESPONSE_CHUNK" + } + }, + { + "scenarioName": "malformed_response_retry", + "requiredScenarioState": "CORRECT", + "request": { + "urlPathPattern": "/queries/v1/query-request.*", + "method": "POST" + }, + "response": { + "status": 200, + "headers": { + "Cache-Control": "no-cache, no-store", + "Content-Type": "application/json", + "Vary": "Accept-Encoding, User-Agent", + "Server": "SF-LB", + "X-Envoy-Attempt-Count": "1", + "X-Envoy-Upstream-Service-Time": "183", + "X-Content-Type-Options": "nosniff", + "X-Xss-Protection": "1; mode=block", + "Expect-Ct": "enforce, max-age=1800", + "Strict-Transport-Security": "max-age=31536000", + "X-Snowflake-Fe-Instance": "envoy-ingress-awsuswest2qa6-48vvh", + "X-Snowflake-Fe-Config": "9a1a3d85_1738289930_9b94f583_1738793826170_0_0_1738793824803", + "X-Frame-Options": "deny", + "Content-Length": "4180", + "Transfer": "4180", + "Connection": "close", + "transfer-encoding": "chunked" + }, + "jsonBody": {"data":{"parameters":[{"name":"CLIENT_PREFETCH_THREADS","value":4},{"name":"TIMESTAMP_OUTPUT_FORMAT","value":"YYYY-MM-DD HH24:MI:SS.FF3 TZHTZM"},{"name":"JS_TREAT_INTEGER_AS_BIGINT","value":false},{"name":"TIME_OUTPUT_FORMAT","value":"HH24:MI:SS"},{"name":"CLIENT_RESULT_CHUNK_SIZE","value":16},{"name":"TIMESTAMP_TZ_OUTPUT_FORMAT","value":""},{"name":"CLIENT_SESSION_KEEP_ALIVE","value":false},{"name":"QUERY_CONTEXT_CACHE_SIZE","value":5},{"name":"CLIENT_OUT_OF_BAND_TELEMETRY_ENABLED","value":false},{"name":"CLIENT_METADATA_USE_SESSION_DATABASE","value":false},{"name":"ENABLE_STAGE_S3_PRIVATELINK_FOR_US_EAST_1","value":true},{"name":"CLIENT_RESULT_PREFETCH_THREADS","value":1},{"name":"TIMESTAMP_NTZ_OUTPUT_FORMAT","value":"YYYY-MM-DD HH24:MI:SS.FF3"},{"name":"CLIENT_METADATA_REQUEST_USE_CONNECTION_CTX","value":false},{"name":"CLIENT_HONOR_CLIENT_TZ_FOR_TIMESTAMP_NTZ","value":true},{"name":"CLIENT_MEMORY_LIMIT","value":1536},{"name":"CLIENT_TIMESTAMP_TYPE_MAPPING","value":"TIMESTAMP_LTZ"},{"name":"TIMEZONE","value":"America/Los_Angeles"},{"name":"SERVICE_NAME","value":""},{"name":"CLIENT_RESULT_PREFETCH_SLOTS","value":2},{"name":"CLIENT_TELEMETRY_ENABLED","value":true},{"name":"CLIENT_DISABLE_INCIDENTS","value":true},{"name":"CLIENT_USE_V1_QUERY_API","value":true},{"name":"CLIENT_RESULT_COLUMN_CASE_INSENSITIVE","value":false},{"name":"BINARY_OUTPUT_FORMAT","value":"HEX"},{"name":"CSV_TIMESTAMP_FORMAT","value":""},{"name":"CLIENT_ENABLE_LOG_INFO_STATEMENT_PARAMETERS","value":false},{"name":"CLIENT_TELEMETRY_SESSIONLESS_ENABLED","value":true},{"name":"JS_DRIVER_DISABLE_OCSP_FOR_NON_SF_ENDPOINTS","value":false},{"name":"DATE_OUTPUT_FORMAT","value":"YYYY-MM-DD"},{"name":"CLIENT_STAGE_ARRAY_BINDING_THRESHOLD","value":65280},{"name":"CLIENT_SESSION_KEEP_ALIVE_HEARTBEAT_FREQUENCY","value":3600},{"name":"CLIENT_SESSION_CLONE","value":false},{"name":"AUTOCOMMIT","value":true},{"name":"TIMESTAMP_LTZ_OUTPUT_FORMAT","value":""}],"rowtype":[{"name":"1","database":"","schema":"","table":"","nullable":false,"byteLength":null,"length":null,"type":"fixed","scale":0,"precision":1,"collation":null}],"rowset":[["1"]],"total":1,"returned":1,"queryId":"01ba9b61-0108-00ba-0000-011103329096","databaseProvider":null,"finalDatabaseName":"TEST_PMOTACKI","finalSchemaName":"TEST_NODEJS","finalWarehouseName":"TEST1","finalRoleName":"ACCOUNTADMIN","numberOfBinds":0,"arrayBindSupported":false,"statementTypeId":4096,"version":1,"sendResultTime":1740401397835,"queryResultFormat":"json","queryContext":{"entries":[{"id":0,"timestamp":1740401397829376,"priority":0,"context":"COqFgAE="}]}},"code":null,"message":null,"success":true} + } + } + ] +} \ No newline at end of file diff --git a/wiremock/mappings/six_reset_connection_and_correct_response.json b/wiremock/mappings/six_reset_connection_and_correct_response.json new file mode 100644 index 000000000..c4a9bfd21 --- /dev/null +++ b/wiremock/mappings/six_reset_connection_and_correct_response.json @@ -0,0 +1,600 @@ +{ + "mappings": [ + { + "scenarioName": "Successful login", + "requiredScenarioState": "Started", + "request": { + "urlPathPattern": "/session/v1/login-request.*", + "method": "POST" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "jsonBody": { + "data": { + "masterToken": "master token", + "token": "session token", + "validityInSeconds": 3600, + "masterValidityInSeconds": 14400, + "displayUserName": "OAUTH_TEST_AUTH_CODE", + "serverVersion": "8.48.0 b2024121104444034239f05", + "firstLogin": false, + "remMeToken": null, + "remMeValidityInSeconds": 0, + "healthCheckInterval": 45, + "newClientForUpgrade": "3.12.3", + "sessionId": 1172562260498, + "parameters": [ + { + "name": "CLIENT_PREFETCH_THREADS", + "value": 4 + }, + { + "name": "TIMESTAMP_OUTPUT_FORMAT", + "value": "YYYY-MM-DD HH24:MI:SS.FF3 TZHTZM" + }, + { + "name": "TIME_OUTPUT_FORMAT", + "value": "HH24:MI:SS" + }, + { + "name": "TIMESTAMP_TZ_OUTPUT_FORMAT", + "value": "" + }, + { + "name": "CLIENT_RESULT_CHUNK_SIZE", + "value": 16 + }, + { + "name": "CLIENT_SESSION_KEEP_ALIVE", + "value": false + }, + { + "name": "JDBC_RS_COLUMN_CASE_INSENSITIVE", + "value": false + }, + { + "name": "SNOWPARK_HIDE_INTERNAL_ALIAS", + "value": true + }, + { + "name": "CLIENT_CONSERVATIVE_MEMORY_ADJUST_STEP", + "value": 64 + }, + { + "name": "QUERY_CONTEXT_CACHE_SIZE", + "value": 5 + }, + { + "name": "CLIENT_METADATA_USE_SESSION_DATABASE", + "value": false + }, + { + "name": "JDBC_ENABLE_COMBINED_DESCRIBE", + "value": true + }, + { + "name": "ENABLE_STAGE_S3_PRIVATELINK_FOR_US_EAST_1", + "value": true + }, + { + "name": "JDBC_TREAT_DECIMAL_AS_INT", + "value": true + }, + { + "name": "CLIENT_RESULT_PREFETCH_THREADS", + "value": 1 + }, + { + "name": "TIMESTAMP_NTZ_OUTPUT_FORMAT", + "value": "YYYY-MM-DD HH24:MI:SS.FF3" + }, + { + "name": "CLIENT_METADATA_REQUEST_USE_CONNECTION_CTX", + "value": false + }, + { + "name": "CLIENT_HONOR_CLIENT_TZ_FOR_TIMESTAMP_NTZ", + "value": true + }, + { + "name": "CLIENT_MEMORY_LIMIT", + "value": 1536 + }, + { + "name": "CLIENT_TIMESTAMP_TYPE_MAPPING", + "value": "TIMESTAMP_LTZ" + }, + { + "name": "JDBC_EFFICIENT_CHUNK_STORAGE", + "value": true + }, + { + "name": "TIMEZONE", + "value": "America/Los_Angeles" + }, + { + "name": "SNOWPARK_REQUEST_TIMEOUT_IN_SECONDS", + "value": 86400 + }, + { + "name": "PYTHON_SNOWPARK_USE_AST", + "value": false + }, + { + "name": "SERVICE_NAME", + "value": "" + }, + { + "name": "CLIENT_RESULT_PREFETCH_SLOTS", + "value": 2 + }, + { + "name": "CLIENT_DISABLE_INCIDENTS", + "value": true + }, + { + "name": "JDBC_ENABLE_PUT_GET", + "value": true + }, + { + "name": "CLIENT_ENABLE_CONSERVATIVE_MEMORY_USAGE", + "value": true + }, + { + "name": "BINARY_OUTPUT_FORMAT", + "value": "HEX" + }, + { + "name": "CSV_TIMESTAMP_FORMAT", + "value": "" + }, + { + "name": "CLIENT_TELEMETRY_SESSIONLESS_ENABLED", + "value": true + }, + { + "name": "DATE_OUTPUT_FORMAT", + "value": "YYYY-MM-DD" + }, + { + "name": "JDBC_FORMAT_DATE_WITH_TIMEZONE", + "value": true + }, + { + "name": "SNOWPARK_LAZY_ANALYSIS", + "value": true + }, + { + "name": "JDBC_USE_JSON_PARSER", + "value": true + }, + { + "name": "CLIENT_SESSION_KEEP_ALIVE_HEARTBEAT_FREQUENCY", + "value": 3600 + }, + { + "name": "AUTOCOMMIT", + "value": true + }, + { + "name": "CLIENT_SESSION_CLONE", + "value": false + }, + { + "name": "TIMESTAMP_LTZ_OUTPUT_FORMAT", + "value": "" + }, + { + "name": "VARIANT_MAX_SIZE_IN_RESULT", + "value": 134217728 + }, + { + "name": "JDBC_USE_SESSION_TIMEZONE", + "value": true + }, + { + "name": "JDBC_TREAT_TIMESTAMP_NTZ_AS_UTC", + "value": false + }, + { + "name": "JDBC_EXECUTE_RETURN_COUNT_FOR_DML", + "value": false + }, + { + "name": "ENABLE_FIX_1247059", + "value": true + }, + { + "name": "CLIENT_OUT_OF_BAND_TELEMETRY_ENABLED", + "value": false + }, + { + "name": "VARCHAR_AND_BINARY_MAX_SIZE_IN_RESULT", + "value": 134217728 + }, + { + "name": "SNOWPARK_USE_SCOPED_TEMP_OBJECTS", + "value": true + }, + { + "name": "CLIENT_TELEMETRY_ENABLED", + "value": true + }, + { + "name": "CLIENT_USE_V1_QUERY_API", + "value": true + }, + { + "name": "CLIENT_RESULT_COLUMN_CASE_INSENSITIVE", + "value": false + }, + { + "name": "CLIENT_ENABLE_LOG_INFO_STATEMENT_PARAMETERS", + "value": false + }, + { + "name": "CLIENT_STAGE_ARRAY_BINDING_THRESHOLD", + "value": 65280 + } + ], + "sessionInfo": { + "databaseName": "TEST_DHEYMAN", + "schemaName": "TEST_JDBC", + "warehouseName": "TEST_XSMALL", + "roleName": "ANALYST" + }, + "idToken": null, + "idTokenValidityInSeconds": 0, + "responseData": null, + "mfaToken": null, + "mfaTokenValidityInSeconds": 0 + }, + "code": null, + "message": null, + "success": true + } + } + }, + { + "scenarioName": "Heartbeat", + "requiredScenarioState": "Started", + "request": { + "urlPathPattern": "/session/heartbeat.*", + "method": "POST" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "jsonBody": { + "data": { + "masterToken": "master token", + "token": "session token", + "validityInSeconds": 3600, + "masterValidityInSeconds": 14400, + "displayUserName": "OAUTH_TEST_AUTH_CODE", + "serverVersion": "8.48.0 b2024121104444034239f05", + "firstLogin": false, + "remMeToken": null, + "remMeValidityInSeconds": 0, + "healthCheckInterval": 45, + "newClientForUpgrade": "3.12.3", + "sessionId": 1172562260498, + "parameters": [ + { + "name": "CLIENT_PREFETCH_THREADS", + "value": 4 + }, + { + "name": "TIMESTAMP_OUTPUT_FORMAT", + "value": "YYYY-MM-DD HH24:MI:SS.FF3 TZHTZM" + }, + { + "name": "TIME_OUTPUT_FORMAT", + "value": "HH24:MI:SS" + }, + { + "name": "TIMESTAMP_TZ_OUTPUT_FORMAT", + "value": "" + }, + { + "name": "CLIENT_RESULT_CHUNK_SIZE", + "value": 16 + }, + { + "name": "CLIENT_SESSION_KEEP_ALIVE", + "value": false + }, + { + "name": "JDBC_RS_COLUMN_CASE_INSENSITIVE", + "value": false + }, + { + "name": "SNOWPARK_HIDE_INTERNAL_ALIAS", + "value": true + }, + { + "name": "CLIENT_CONSERVATIVE_MEMORY_ADJUST_STEP", + "value": 64 + }, + { + "name": "QUERY_CONTEXT_CACHE_SIZE", + "value": 5 + }, + { + "name": "CLIENT_METADATA_USE_SESSION_DATABASE", + "value": false + }, + { + "name": "JDBC_ENABLE_COMBINED_DESCRIBE", + "value": true + }, + { + "name": "ENABLE_STAGE_S3_PRIVATELINK_FOR_US_EAST_1", + "value": true + }, + { + "name": "JDBC_TREAT_DECIMAL_AS_INT", + "value": true + }, + { + "name": "CLIENT_RESULT_PREFETCH_THREADS", + "value": 1 + }, + { + "name": "TIMESTAMP_NTZ_OUTPUT_FORMAT", + "value": "YYYY-MM-DD HH24:MI:SS.FF3" + }, + { + "name": "CLIENT_METADATA_REQUEST_USE_CONNECTION_CTX", + "value": false + }, + { + "name": "CLIENT_HONOR_CLIENT_TZ_FOR_TIMESTAMP_NTZ", + "value": true + }, + { + "name": "CLIENT_MEMORY_LIMIT", + "value": 1536 + }, + { + "name": "CLIENT_TIMESTAMP_TYPE_MAPPING", + "value": "TIMESTAMP_LTZ" + }, + { + "name": "JDBC_EFFICIENT_CHUNK_STORAGE", + "value": true + }, + { + "name": "TIMEZONE", + "value": "America/Los_Angeles" + }, + { + "name": "SNOWPARK_REQUEST_TIMEOUT_IN_SECONDS", + "value": 86400 + }, + { + "name": "PYTHON_SNOWPARK_USE_AST", + "value": false + }, + { + "name": "SERVICE_NAME", + "value": "" + }, + { + "name": "CLIENT_RESULT_PREFETCH_SLOTS", + "value": 2 + }, + { + "name": "CLIENT_DISABLE_INCIDENTS", + "value": true + }, + { + "name": "JDBC_ENABLE_PUT_GET", + "value": true + }, + { + "name": "CLIENT_ENABLE_CONSERVATIVE_MEMORY_USAGE", + "value": true + }, + { + "name": "BINARY_OUTPUT_FORMAT", + "value": "HEX" + }, + { + "name": "CSV_TIMESTAMP_FORMAT", + "value": "" + }, + { + "name": "CLIENT_TELEMETRY_SESSIONLESS_ENABLED", + "value": true + }, + { + "name": "DATE_OUTPUT_FORMAT", + "value": "YYYY-MM-DD" + }, + { + "name": "JDBC_FORMAT_DATE_WITH_TIMEZONE", + "value": true + }, + { + "name": "SNOWPARK_LAZY_ANALYSIS", + "value": true + }, + { + "name": "JDBC_USE_JSON_PARSER", + "value": true + }, + { + "name": "CLIENT_SESSION_KEEP_ALIVE_HEARTBEAT_FREQUENCY", + "value": 3600 + }, + { + "name": "AUTOCOMMIT", + "value": true + }, + { + "name": "CLIENT_SESSION_CLONE", + "value": false + }, + { + "name": "TIMESTAMP_LTZ_OUTPUT_FORMAT", + "value": "" + }, + { + "name": "VARIANT_MAX_SIZE_IN_RESULT", + "value": 134217728 + }, + { + "name": "JDBC_USE_SESSION_TIMEZONE", + "value": true + }, + { + "name": "JDBC_TREAT_TIMESTAMP_NTZ_AS_UTC", + "value": false + }, + { + "name": "JDBC_EXECUTE_RETURN_COUNT_FOR_DML", + "value": false + }, + { + "name": "ENABLE_FIX_1247059", + "value": true + }, + { + "name": "CLIENT_OUT_OF_BAND_TELEMETRY_ENABLED", + "value": false + }, + { + "name": "VARCHAR_AND_BINARY_MAX_SIZE_IN_RESULT", + "value": 134217728 + }, + { + "name": "SNOWPARK_USE_SCOPED_TEMP_OBJECTS", + "value": true + }, + { + "name": "CLIENT_TELEMETRY_ENABLED", + "value": true + }, + { + "name": "CLIENT_USE_V1_QUERY_API", + "value": true + }, + { + "name": "CLIENT_RESULT_COLUMN_CASE_INSENSITIVE", + "value": false + }, + { + "name": "CLIENT_ENABLE_LOG_INFO_STATEMENT_PARAMETERS", + "value": false + }, + { + "name": "CLIENT_STAGE_ARRAY_BINDING_THRESHOLD", + "value": 65280 + } + ], + "sessionInfo": { + "databaseName": "TEST_DHEYMAN", + "schemaName": "TEST_JDBC", + "warehouseName": "TEST_XSMALL", + "roleName": "ANALYST" + }, + "idToken": null, + "idTokenValidityInSeconds": 0, + "responseData": null, + "mfaToken": null, + "mfaTokenValidityInSeconds": 0 + }, + "code": null, + "message": null, + "success": true + } + } + }, + { + "scenarioName": "connection_reset_retry", + "requiredScenarioState": "Started", + "newScenarioState": "CONNECTION_RESET_RETRY_1", + "request": { + "urlPathPattern": "/queries/v1/query-request.*", + "method": "POST" + }, + "response": { + "fault": "CONNECTION_RESET_BY_PEER" + } + }, + { + "scenarioName": "connection_reset_retry", + "requiredScenarioState": "CONNECTION_RESET_RETRY_1", + "newScenarioState": "CONNECTION_RESET_RETRY_2", + "request": { + "urlPathPattern": "/queries/v1/query-request.*", + "method": "POST" + }, + "response": { + "fault": "CONNECTION_RESET_BY_PEER" + } + }, + { + "scenarioName": "connection_reset_retry", + "requiredScenarioState": "CONNECTION_RESET_RETRY_2", + "newScenarioState": "CONNECTION_RESET_RETRY_3", + "request": { + "urlPathPattern": "/queries/v1/query-request.*", + "method": "POST" + }, + "response": { + "fixedDelayMilliseconds": 12000, + "fault": "CONNECTION_RESET_BY_PEER" + } + }, + { + "scenarioName": "connection_reset_retry", + "requiredScenarioState": "CONNECTION_RESET_RETRY_3", + "newScenarioState": "CORRECT", + "request": { + "urlPathPattern": "/queries/v1/query-request.*", + "method": "POST" + }, + "response": { + "fault": "CONNECTION_RESET_BY_PEER" + } + }, + { + "scenarioName": "connection_reset_retry", + "requiredScenarioState": "CORRECT", + "request": { + "urlPathPattern": "/queries/v1/query-request.*", + "method": "POST" + }, + "response": { + "status": 200, + "headers": { + "Cache-Control": "no-cache, no-store", + "Content-Type": "application/json", + "Vary": "Accept-Encoding, User-Agent", + "Server": "SF-LB", + "X-Envoy-Attempt-Count": "1", + "X-Envoy-Upstream-Service-Time": "183", + "X-Content-Type-Options": "nosniff", + "X-Xss-Protection": "1; mode=block", + "Expect-Ct": "enforce, max-age=1800", + "Strict-Transport-Security": "max-age=31536000", + "X-Snowflake-Fe-Instance": "envoy-ingress-awsuswest2qa6-48vvh", + "X-Snowflake-Fe-Config": "9a1a3d85_1738289930_9b94f583_1738793826170_0_0_1738793824803", + "X-Frame-Options": "deny", + "Content-Length": "4180", + "Transfer": "4180", + "Connection": "close", + "transfer-encoding": "chunked" + }, + "jsonBody": {"data":{"parameters":[{"name":"CLIENT_PREFETCH_THREADS","value":4},{"name":"TIMESTAMP_OUTPUT_FORMAT","value":"YYYY-MM-DD HH24:MI:SS.FF3 TZHTZM"},{"name":"JS_TREAT_INTEGER_AS_BIGINT","value":false},{"name":"TIME_OUTPUT_FORMAT","value":"HH24:MI:SS"},{"name":"CLIENT_RESULT_CHUNK_SIZE","value":16},{"name":"TIMESTAMP_TZ_OUTPUT_FORMAT","value":""},{"name":"CLIENT_SESSION_KEEP_ALIVE","value":false},{"name":"QUERY_CONTEXT_CACHE_SIZE","value":5},{"name":"CLIENT_OUT_OF_BAND_TELEMETRY_ENABLED","value":false},{"name":"CLIENT_METADATA_USE_SESSION_DATABASE","value":false},{"name":"ENABLE_STAGE_S3_PRIVATELINK_FOR_US_EAST_1","value":true},{"name":"CLIENT_RESULT_PREFETCH_THREADS","value":1},{"name":"TIMESTAMP_NTZ_OUTPUT_FORMAT","value":"YYYY-MM-DD HH24:MI:SS.FF3"},{"name":"CLIENT_METADATA_REQUEST_USE_CONNECTION_CTX","value":false},{"name":"CLIENT_HONOR_CLIENT_TZ_FOR_TIMESTAMP_NTZ","value":true},{"name":"CLIENT_MEMORY_LIMIT","value":1536},{"name":"CLIENT_TIMESTAMP_TYPE_MAPPING","value":"TIMESTAMP_LTZ"},{"name":"TIMEZONE","value":"America/Los_Angeles"},{"name":"SERVICE_NAME","value":""},{"name":"CLIENT_RESULT_PREFETCH_SLOTS","value":2},{"name":"CLIENT_TELEMETRY_ENABLED","value":true},{"name":"CLIENT_DISABLE_INCIDENTS","value":true},{"name":"CLIENT_USE_V1_QUERY_API","value":true},{"name":"CLIENT_RESULT_COLUMN_CASE_INSENSITIVE","value":false},{"name":"BINARY_OUTPUT_FORMAT","value":"HEX"},{"name":"CSV_TIMESTAMP_FORMAT","value":""},{"name":"CLIENT_ENABLE_LOG_INFO_STATEMENT_PARAMETERS","value":false},{"name":"CLIENT_TELEMETRY_SESSIONLESS_ENABLED","value":true},{"name":"JS_DRIVER_DISABLE_OCSP_FOR_NON_SF_ENDPOINTS","value":false},{"name":"DATE_OUTPUT_FORMAT","value":"YYYY-MM-DD"},{"name":"CLIENT_STAGE_ARRAY_BINDING_THRESHOLD","value":65280},{"name":"CLIENT_SESSION_KEEP_ALIVE_HEARTBEAT_FREQUENCY","value":3600},{"name":"CLIENT_SESSION_CLONE","value":false},{"name":"AUTOCOMMIT","value":true},{"name":"TIMESTAMP_LTZ_OUTPUT_FORMAT","value":""}],"rowtype":[{"name":"1","database":"","schema":"","table":"","nullable":false,"byteLength":null,"length":null,"type":"fixed","scale":0,"precision":1,"collation":null}],"rowset":[["1"]],"total":1,"returned":1,"queryId":"01ba9b61-0108-00ba-0000-011103329096","databaseProvider":null,"finalDatabaseName":"TEST_PMOTACKI","finalSchemaName":"TEST_NODEJS","finalWarehouseName":"TEST1","finalRoleName":"ACCOUNTADMIN","numberOfBinds":0,"arrayBindSupported":false,"statementTypeId":4096,"version":1,"sendResultTime":1740401397835,"queryResultFormat":"json","queryContext":{"entries":[{"id":0,"timestamp":1740401397829376,"priority":0,"context":"COqFgAE="}]}},"code":null,"message":null,"success":true} + } + } + ] +} \ No newline at end of file