realm-object-server
Version:
119 lines • 5.34 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const chai_1 = require("chai");
const events_1 = require("events");
const realmUtil_1 = require("../shared/realmUtil");
const uuid_1 = require("uuid");
const path = require("path");
const os_1 = require("os");
const realms_1 = require("../realms");
const shared_1 = require("../shared");
const _1 = require(".");
const TestServer_1 = require("../TestServer");
const RealmFactory_1 = require("../RealmFactory");
describe("StatsdToMetricsRealm", () => {
RealmFactory_1.RealmFactory["sessionStopPolicy"] = "immediately";
const logger = new shared_1.ConsoleLogger("off");
let fakeReceiver;
let realm;
beforeEach(() => __awaiter(this, void 0, void 0, function* () {
fakeReceiver = new events_1.EventEmitter();
realm = new realmUtil_1.Realm({
path: path.resolve(os_1.tmpdir(), uuid_1.v4() + ".realm"),
schema: realms_1.MetricsRealm.schema,
});
}));
afterEach(() => __awaiter(this, void 0, void 0, function* () {
if (fakeReceiver) {
fakeReceiver.removeAllListeners();
fakeReceiver = null;
}
if (realm) {
realm.close();
realmUtil_1.Realm.deleteFile({ path: realm.path });
yield TestServer_1.clearTestState();
}
}));
it("can be started and stopped", () => __awaiter(this, void 0, void 0, function* () {
const statsdToMetricsRealm = new _1.StatsdToMetricsRealm({
logger,
openRealm: () => new Promise(resolve => resolve(realm)),
}, fakeReceiver);
chai_1.expect(() => {
statsdToMetricsRealm.listenTo({});
}).to.throw("Already listening to another receiver");
statsdToMetricsRealm.stop();
chai_1.expect(() => {
statsdToMetricsRealm.stop();
}).to.throw("Not listening to a receiver");
}));
it("writes metrics when they're emitted", () => __awaiter(this, void 0, void 0, function* () {
const WAIT = 100;
const statsdToMetricsRealm = new _1.StatsdToMetricsRealm({
logger,
openRealm: () => new Promise(resolve => resolve(realm)),
saveWait: WAIT,
}, fakeReceiver);
function createMetric(value) {
return {
name: "realm.localhost.realm.state.size",
labels: { path: "%2Fsomewhere" },
stats: [
{ type: _1.MetricType.Counter, value },
],
};
}
const fileSizes = realm.objects("RealmStateSize");
const beforeEmission = new Date();
yield new Promise(resolve => {
fileSizes.addListener((collection) => {
if (collection.length === 1) {
const savedMetric = collection[0];
chai_1.expect(savedMetric.path).to.equal("/somewhere");
chai_1.expect(savedMetric.value).to.equal(1337);
const savingDelay = Date.now() - beforeEmission.getTime();
chai_1.expect(savingDelay).to.be.lessThan(WAIT);
fileSizes.removeAllListeners();
resolve();
}
});
fakeReceiver.emit("metric", createMetric("1337"));
});
fakeReceiver.emit("metric", createMetric("1234"));
fakeReceiver.emit("metric", createMetric("4321"));
const DELAY = Math.floor(WAIT / 2);
yield shared_1.delay(DELAY);
yield new Promise(resolve => {
let updates = 0;
fileSizes.addListener((collection) => {
updates++;
chai_1.expect(collection.length).to.equal(1);
const savedMetric = collection[0];
chai_1.expect(savedMetric.value).to.not.equal(1234);
if (savedMetric.value === 1337) {
chai_1.expect(updates).to.equal(1);
}
else if (savedMetric.value === 4321) {
chai_1.expect(updates).to.equal(2);
chai_1.expect(savedMetric.path).to.equal("/somewhere");
const emittedDelay = savedMetric.emitted.getTime() - beforeEmission.getTime();
chai_1.expect(emittedDelay).to.be.lessThan(DELAY);
const savingDelay = Date.now() - beforeEmission.getTime();
chai_1.expect(savingDelay).to.be.at.least(WAIT);
fileSizes.removeAllListeners();
resolve();
}
});
});
statsdToMetricsRealm.stop();
}));
});
//# sourceMappingURL=StatsdToMetricsRealm.spec.js.map