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

428 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.

"use strict";
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
var _iterator = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/symbol/iterator"));
var _symbol = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/symbol"));
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
var _index = require("../api/index.mock");
var _hosts = require("./hosts");
var __awaiter = void 0 && (void 0).__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["default"]))(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 = void 0 && (void 0).__generator || function (thisArg, body) {
var _ = {
label: 0,
sent: function sent() {
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["default"] === "function" && (g[_iterator["default"]] = 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 = void 0 && (void 0).__read || function (o, n) {
var m = typeof _symbol["default"] === "function" && o[_iterator["default"]];
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 = void 0 && (void 0).__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
var mockApi = new _index.MockApi();
jest.mock('../api', function () {
return mockApi;
}); // eslint-disable-next-line import/first
function sleep(time) {
if (time === void 0) {
time = 100;
}
return new _promise["default"](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 _hosts.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 _hosts.HostPool(['host-1', 'host-2']);
return [4
/*yield*/
, hostPool.getUp.apply(hostPool, __spread(getParams))];
case 1:
actual1 = _a.sent();
expect(actual1).toStrictEqual(new _hosts.Host('host-1', 'https'));
return [4
/*yield*/
, hostPool.getUp.apply(hostPool, __spread(getParams))];
case 2:
actual2 = _a.sent();
expect(actual2).toStrictEqual(new _hosts.Host('host-1', 'https'));
return [4
/*yield*/
, hostPool.getUp.apply(hostPool, __spread(getParams))];
case 3:
actual3 = _a.sent();
expect(actual3).toStrictEqual(new _hosts.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 _hosts.HostPool(['host-1', 'host-2']);
return [4
/*yield*/
, hostPool.getUp.apply(hostPool, __spread(getParams))];
case 1:
host1 = _a.sent();
expect(host1).toStrictEqual(new _hosts.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 _hosts.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 _hosts.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 _hosts.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 _hosts.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 _hosts.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 _hosts.Host('host-2', 'https'));
return [2
/*return*/
];
}
});
});
});
});