2025-04-02 21:57:33 +08:00

222 lines
12 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
var __spread = (this && this.__spread) || function () {
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
return ar;
};
// eslint-disable-next-line import/newline-after-import
import { MockApi } from '../api/index.mock';
var mockApi = new MockApi();
jest.mock('../api', function () { return mockApi; });
// eslint-disable-next-line import/first
import { Host, HostPool } from './hosts';
function sleep(time) {
if (time === void 0) { time = 100; }
return new Promise(function (resolve, _) {
setTimeout(resolve, time);
});
}
describe('test hosts', function () {
var getParams = ['accessKey', 'bucket', 'https'];
test('getUp from api', function () { return __awaiter(void 0, void 0, void 0, function () {
var hostPool, apiData, actual1, actual2, actual3;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
hostPool = new HostPool();
return [4 /*yield*/, mockApi.getUpHosts()
// 无冻结行为每次获取到的都是第一个
];
case 1:
apiData = _a.sent();
return [4 /*yield*/, hostPool.getUp.apply(hostPool, __spread(getParams))];
case 2:
actual1 = _a.sent();
expect(actual1 === null || actual1 === void 0 ? void 0 : actual1.host).toStrictEqual(apiData.data.up.acc.main[0]);
return [4 /*yield*/, hostPool.getUp.apply(hostPool, __spread(getParams))];
case 3:
actual2 = _a.sent();
expect(actual2 === null || actual2 === void 0 ? void 0 : actual2.host).toStrictEqual(apiData.data.up.acc.main[0]);
return [4 /*yield*/, hostPool.getUp.apply(hostPool, __spread(getParams))];
case 4:
actual3 = _a.sent();
expect(actual3 === null || actual3 === void 0 ? void 0 : actual3.host).toStrictEqual(apiData.data.up.acc.main[0]);
return [2 /*return*/];
}
});
}); });
test('getUp from config', function () { return __awaiter(void 0, void 0, void 0, function () {
var hostPool, actual1, actual2, actual3;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
hostPool = new HostPool([
'host-1',
'host-2'
]);
return [4 /*yield*/, hostPool.getUp.apply(hostPool, __spread(getParams))];
case 1:
actual1 = _a.sent();
expect(actual1).toStrictEqual(new Host('host-1', 'https'));
return [4 /*yield*/, hostPool.getUp.apply(hostPool, __spread(getParams))];
case 2:
actual2 = _a.sent();
expect(actual2).toStrictEqual(new Host('host-1', 'https'));
return [4 /*yield*/, hostPool.getUp.apply(hostPool, __spread(getParams))];
case 3:
actual3 = _a.sent();
expect(actual3).toStrictEqual(new Host('host-1', 'https'));
return [2 /*return*/];
}
});
}); });
test('freeze & unfreeze', function () { return __awaiter(void 0, void 0, void 0, function () {
var hostPool, host1, host2, actual1, actual2, actual3, actual4, actual5;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
hostPool = new HostPool([
'host-1',
'host-2'
]);
return [4 /*yield*/, hostPool.getUp.apply(hostPool, __spread(getParams))];
case 1:
host1 = _a.sent();
expect(host1).toStrictEqual(new Host('host-1', 'https'));
// eslint-disable-next-line no-unused-expressions
host1 === null || host1 === void 0 ? void 0 : host1.freeze();
return [4 /*yield*/, sleep()
// 自动切换到了下一个可用的 host-2
];
case 2:
_a.sent();
return [4 /*yield*/, hostPool.getUp.apply(hostPool, __spread(getParams))];
case 3:
host2 = _a.sent();
expect(host2).toStrictEqual(new Host('host-2', 'https'));
// eslint-disable-next-line no-unused-expressions
host2 === null || host2 === void 0 ? void 0 : host2.freeze();
return [4 /*yield*/, sleep()
// 以下是都被冻结情况的测试
// 全部都冻结了,拿到的应该是离解冻时间最近的一个
];
case 4:
_a.sent();
return [4 /*yield*/, hostPool.getUp.apply(hostPool, __spread(getParams))];
case 5:
actual1 = _a.sent();
expect(actual1).toStrictEqual(new Host('host-1', 'https'));
// eslint-disable-next-line no-unused-expressions
host1 === null || host1 === void 0 ? void 0 : host1.freeze(); // 已经冻结的再次冻结相当于更新解冻时间
return [4 /*yield*/, sleep()
// 因为 host-1 刚更新过冻结时间,所以这个时候解冻时间优先的应该是 host-2
];
case 6:
_a.sent();
return [4 /*yield*/, hostPool.getUp.apply(hostPool, __spread(getParams))];
case 7:
actual2 = _a.sent();
expect(actual2).toStrictEqual(new Host('host-2', 'https'));
return [4 /*yield*/, sleep()
// 测试解冻 host-2拿到的应该是 host-2
// eslint-disable-next-line no-unused-expressions
];
case 8:
_a.sent();
// 测试解冻 host-2拿到的应该是 host-2
// eslint-disable-next-line no-unused-expressions
host2 === null || host2 === void 0 ? void 0 : host2.unfreeze();
return [4 /*yield*/, hostPool.getUp.apply(hostPool, __spread(getParams))];
case 9:
actual3 = _a.sent();
expect(actual3).toStrictEqual(new Host('host-2', 'https'));
// eslint-disable-next-line no-unused-expressions
host2 === null || host2 === void 0 ? void 0 : host2.freeze(); // 测试完再冻结住
return [4 /*yield*/, sleep()
// 本来优先的现在应该是 host-1
// 测试 host-2 冻结时间设置为 0应该获取到 host-2
// eslint-disable-next-line no-unused-expressions
];
case 10:
_a.sent();
// 本来优先的现在应该是 host-1
// 测试 host-2 冻结时间设置为 0应该获取到 host-2
// eslint-disable-next-line no-unused-expressions
host2 === null || host2 === void 0 ? void 0 : host2.freeze(0);
return [4 /*yield*/, hostPool.getUp.apply(hostPool, __spread(getParams))];
case 11:
actual4 = _a.sent();
expect(actual4).toStrictEqual(new Host('host-2', 'https'));
// eslint-disable-next-line no-unused-expressions
host2 === null || host2 === void 0 ? void 0 : host2.freeze();
return [4 /*yield*/, sleep()
// 测试自定义冻结时间
// eslint-disable-next-line no-unused-expressions
];
case 12:
_a.sent();
// 测试自定义冻结时间
// eslint-disable-next-line no-unused-expressions
host1 === null || host1 === void 0 ? void 0 : host1.freeze(200);
// eslint-disable-next-line no-unused-expressions
host2 === null || host2 === void 0 ? void 0 : host2.freeze(100);
return [4 /*yield*/, hostPool.getUp.apply(hostPool, __spread(getParams))];
case 13:
actual5 = _a.sent();
expect(actual5).toStrictEqual(new Host('host-2', 'https'));
return [2 /*return*/];
}
});
}); });
});
//# sourceMappingURL=hosts.test.js.map