checkError = (oError) => {
			assert.notOk(bResolve);
			assert.strictEqual(oError, oRetryAfterError);
		}
******************************************************************************************
	// Integrative test simulating 503 "Retry-After" handling: resolve or reject
	// 1) Send 2 parallel requests (both supposed to be answered with 503)
	// 1a) 1st 503 error response creates "Retry-After" promise
	// 1b) 2nd response reuses the promise
	// 2) 3rd follow up request reuses also the promise, no request sent
	// 3a) Resolving promise repeats all 3 requests
	// 3b) Rejecting promise rejects all 3 requests
[false, true].forEach((bResolve) => {
	QUnit.test(`sendRequest: 503, "Retry-After" handling, bResolve=${bResolve}`, function (assert) {
		const oRequestor = _Requestor.create("/Service/", oModelInterface);
		let fnReject;
		let fnResolve;
		const oRetryAfterPromise = new Promise((resolve, reject) => {
			fnResolve = resolve;
			fnReject = reject;
		});
		const oRetryAfterError = {message : "DB migration in progress"};
		const oHelperMock = this.mock(_Helper);
		const oJQueryMock = this.mock(jQuery);
		const oModelInterfaceMock = this.mock(oModelInterface);
		oModelInterfaceMock.expects("getOrCreateRetryAfterPromise").twice().withExactArgs()
			.returns(null);
		let oSendPromise3;
		oJQueryMock.expects("ajax").withArgs("/Service/First").callsFake(() => {
			const jqXHR = new jQuery.Deferred();
			setTimeout(async () => {
				const o503jqXHR = {
					getResponseHeader() {},
					status : 503
				};
				const o503jqXHRMock = this.mock(o503jqXHR);
				o503jqXHRMock.expects("getResponseHeader")
					.withExactArgs("SAP-ContextId")
					.returns("n/a");
				o503jqXHRMock.expects("getResponseHeader")
					.withExactArgs("X-CSRF-Token")
					.returns("n/a");
				o503jqXHRMock.expects("getResponseHeader")
					.withExactArgs("Retry-After")
					.returns("42");
				oHelperMock.expects("createError")
					.withExactArgs(sinon.match.same(o503jqXHR), "")
					.returns(oRetryAfterError);
				oModelInterfaceMock.expects("getOrCreateRetryAfterPromise")
					.withExactArgs(sinon.match.same(oRetryAfterError)).returns("truthy"); // create
				oModelInterfaceMock.expects("getOrCreateRetryAfterPromise").withExactArgs()
					.returns(oRetryAfterPromise); // get

				// (1a)
				jqXHR.reject(o503jqXHR);

				try {
					await jqXHR;
				} catch (ex) {
					// continue regardless of error
				}

				// register follow up request for oRetryAfterPromise and NOT oSecurityTokenPromise
				oRequestor.oSecurityTokenPromise = {};
				oModelInterfaceMock.expects("getOrCreateRetryAfterPromise").withExactArgs()
					.returns(oRetryAfterPromise); // get

				// code under test (2)
				oSendPromise3 = oRequestor.sendRequest("POST", "Third");
			}, 0);

			return jqXHR;
		});

		oJQueryMock.expects("ajax").withArgs("/Service/Second").callsFake(() => {
			const jqXHR = new jQuery.Deferred();
			setTimeout(async () => {
				const o503jqXHR = {
					getResponseHeader() {},
					status : 503
				};
				const o503jqXHRMock = this.mock(o503jqXHR);
				o503jqXHRMock.expects("getResponseHeader")
					.withExactArgs("SAP-ContextId")
					.returns("n/a");
				o503jqXHRMock.expects("getResponseHeader")
					.withExactArgs("X-CSRF-Token")
					.returns("n/a");
				o503jqXHRMock.expects("getResponseHeader")
					.withExactArgs("Retry-After")
					.returns("42");
				oHelperMock.expects("createError")
					.withExactArgs(sinon.match.same(o503jqXHR), "")
					.returns("~oRetryAfterError~");
				oModelInterfaceMock.expects("getOrCreateRetryAfterPromise")
					.withExactArgs("~oRetryAfterError~").returns("n/a"); // no create needed
				oModelInterfaceMock.expects("getOrCreateRetryAfterPromise").withExactArgs()
					.returns(oRetryAfterPromise); // get same as other parallel request

				// (1b)
				jqXHR.reject(o503jqXHR);

				try {
					await jqXHR;
				} catch (ex) {
					// continue regardless of error
				}

				if (bResolve) {
					oJQueryMock.expects("ajax")
						.withArgs("/Service/First")
						.callsFake(() => {
							return createMock(assert, {/*oPayload