|
|
|
@ -34,7 +34,7 @@ describe('SwarmPolling', () => {
|
|
|
|
|
const ourNumber = ourPubkey.key;
|
|
|
|
|
|
|
|
|
|
// tslint:disable-next-line: variable-name
|
|
|
|
|
let TEST_pollOnceForKeySpy: Sinon.SinonSpy<any>;
|
|
|
|
|
let pollOnceForKeySpy: Sinon.SinonSpy<any>;
|
|
|
|
|
|
|
|
|
|
let swarmPolling: SwarmPolling;
|
|
|
|
|
|
|
|
|
@ -60,8 +60,8 @@ describe('SwarmPolling', () => {
|
|
|
|
|
getConversationController().getOrCreate(ourPubkey.key, ConversationTypeEnum.PRIVATE);
|
|
|
|
|
|
|
|
|
|
swarmPolling = getSwarmPollingInstance();
|
|
|
|
|
swarmPolling.TEST_reset();
|
|
|
|
|
TEST_pollOnceForKeySpy = Sinon.spy(swarmPolling, 'TEST_pollOnceForKey');
|
|
|
|
|
swarmPolling.resetSwarmPolling();
|
|
|
|
|
pollOnceForKeySpy = Sinon.spy(swarmPolling, 'pollOnceForKey');
|
|
|
|
|
|
|
|
|
|
clock = sinon.useFakeTimers(Date.now());
|
|
|
|
|
});
|
|
|
|
@ -76,7 +76,7 @@ describe('SwarmPolling', () => {
|
|
|
|
|
it('returns INACTIVE for non existing convo', () => {
|
|
|
|
|
const fakeConvo = TestUtils.generateFakePubKey();
|
|
|
|
|
|
|
|
|
|
expect(swarmPolling.TEST_getPollingTimeout(fakeConvo)).to.eq(SWARM_POLLING_TIMEOUT.INACTIVE);
|
|
|
|
|
expect(swarmPolling.getPollingTimeout(fakeConvo)).to.eq(SWARM_POLLING_TIMEOUT.INACTIVE);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('returns ACTIVE for convo with less than two days old activeAt', () => {
|
|
|
|
@ -85,7 +85,7 @@ describe('SwarmPolling', () => {
|
|
|
|
|
ConversationTypeEnum.GROUP
|
|
|
|
|
);
|
|
|
|
|
convo.set('active_at', Date.now() - 2 * 23 * 3600 * 1000); // 23 * 2 = 46 hours old
|
|
|
|
|
expect(swarmPolling.TEST_getPollingTimeout(PubKey.cast(convo.id as string))).to.eq(
|
|
|
|
|
expect(swarmPolling.getPollingTimeout(PubKey.cast(convo.id as string))).to.eq(
|
|
|
|
|
SWARM_POLLING_TIMEOUT.ACTIVE
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
@ -96,7 +96,7 @@ describe('SwarmPolling', () => {
|
|
|
|
|
ConversationTypeEnum.GROUP
|
|
|
|
|
);
|
|
|
|
|
convo.set('active_at', undefined);
|
|
|
|
|
expect(swarmPolling.TEST_getPollingTimeout(PubKey.cast(convo.id as string))).to.eq(
|
|
|
|
|
expect(swarmPolling.getPollingTimeout(PubKey.cast(convo.id as string))).to.eq(
|
|
|
|
|
SWARM_POLLING_TIMEOUT.INACTIVE
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
@ -107,12 +107,12 @@ describe('SwarmPolling', () => {
|
|
|
|
|
ConversationTypeEnum.GROUP
|
|
|
|
|
);
|
|
|
|
|
convo.set('active_at', Date.now() - 1000 * 3600 * 25 * 2); // 25 hours x 2 = 50 hours old
|
|
|
|
|
expect(swarmPolling.TEST_getPollingTimeout(PubKey.cast(convo.id as string))).to.eq(
|
|
|
|
|
expect(swarmPolling.getPollingTimeout(PubKey.cast(convo.id as string))).to.eq(
|
|
|
|
|
SWARM_POLLING_TIMEOUT.MEDIUM_ACTIVE
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
convo.set('active_at', Date.now() - 1000 * 3600 * 24 * 7 + 3600); // a week minus an hour old
|
|
|
|
|
expect(swarmPolling.TEST_getPollingTimeout(PubKey.cast(convo.id as string))).to.eq(
|
|
|
|
|
expect(swarmPolling.getPollingTimeout(PubKey.cast(convo.id as string))).to.eq(
|
|
|
|
|
SWARM_POLLING_TIMEOUT.MEDIUM_ACTIVE
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
@ -123,7 +123,7 @@ describe('SwarmPolling', () => {
|
|
|
|
|
ConversationTypeEnum.GROUP
|
|
|
|
|
);
|
|
|
|
|
convo.set('active_at', Date.now() - 1000 * 3600 * 24 * 8); // 8 days
|
|
|
|
|
expect(swarmPolling.TEST_getPollingTimeout(PubKey.cast(convo.id as string))).to.eq(
|
|
|
|
|
expect(swarmPolling.getPollingTimeout(PubKey.cast(convo.id as string))).to.eq(
|
|
|
|
|
SWARM_POLLING_TIMEOUT.INACTIVE
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
@ -138,8 +138,8 @@ describe('SwarmPolling', () => {
|
|
|
|
|
convo.set('active_at', Date.now() - 1000 * 3600 * 25);
|
|
|
|
|
await swarmPolling.start(true);
|
|
|
|
|
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.callCount).to.eq(1);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.firstCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(pollOnceForKeySpy.callCount).to.eq(1);
|
|
|
|
|
expect(pollOnceForKeySpy.firstCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('does run for our pubkey even if activeAt is recent ', async () => {
|
|
|
|
@ -150,8 +150,8 @@ describe('SwarmPolling', () => {
|
|
|
|
|
convo.set('active_at', Date.now());
|
|
|
|
|
await swarmPolling.start(true);
|
|
|
|
|
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.callCount).to.eq(1);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.firstCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(pollOnceForKeySpy.callCount).to.eq(1);
|
|
|
|
|
expect(pollOnceForKeySpy.firstCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('does run for group pubkey on start no matter the recent timestamp ', async () => {
|
|
|
|
@ -165,9 +165,9 @@ describe('SwarmPolling', () => {
|
|
|
|
|
await swarmPolling.start(true);
|
|
|
|
|
|
|
|
|
|
// our pubkey will be polled for, hence the 2
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.callCount).to.eq(2);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.firstCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.secondCall.args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
expect(pollOnceForKeySpy.callCount).to.eq(2);
|
|
|
|
|
expect(pollOnceForKeySpy.firstCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(pollOnceForKeySpy.secondCall.args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('does run for group pubkey on start no matter the old timestamp ', async () => {
|
|
|
|
@ -182,9 +182,9 @@ describe('SwarmPolling', () => {
|
|
|
|
|
await swarmPolling.start(true);
|
|
|
|
|
|
|
|
|
|
// our pubkey will be polled for, hence the 2
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.callCount).to.eq(2);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.firstCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.secondCall.args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
expect(pollOnceForKeySpy.callCount).to.eq(2);
|
|
|
|
|
expect(pollOnceForKeySpy.firstCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(pollOnceForKeySpy.secondCall.args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('does run for group pubkey on start but not another time if activeAt is old ', async () => {
|
|
|
|
@ -201,12 +201,12 @@ describe('SwarmPolling', () => {
|
|
|
|
|
await swarmPolling.start(true);
|
|
|
|
|
|
|
|
|
|
// this should only call the stub one more time: for our direct pubkey but not for the group pubkey
|
|
|
|
|
await swarmPolling.TEST_pollForAllKeys();
|
|
|
|
|
await swarmPolling.pollForAllKeys();
|
|
|
|
|
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.callCount).to.eq(3);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.firstCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.secondCall.args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.thirdCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(pollOnceForKeySpy.callCount).to.eq(3);
|
|
|
|
|
expect(pollOnceForKeySpy.firstCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(pollOnceForKeySpy.secondCall.args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
expect(pollOnceForKeySpy.thirdCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('does run twice if activeAt less than one hour ', async () => {
|
|
|
|
@ -221,12 +221,12 @@ describe('SwarmPolling', () => {
|
|
|
|
|
await swarmPolling.start(true);
|
|
|
|
|
clock.tick(6000);
|
|
|
|
|
// no need to do that as the tick will trigger a call in all cases after 5 secs
|
|
|
|
|
// await swarmPolling.TEST_pollForAllKeys();
|
|
|
|
|
// await swarmPolling.pollForAllKeys();
|
|
|
|
|
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.callCount).to.eq(4);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.secondCall.args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.thirdCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.lastCall.args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
expect(pollOnceForKeySpy.callCount).to.eq(4);
|
|
|
|
|
expect(pollOnceForKeySpy.secondCall.args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
expect(pollOnceForKeySpy.thirdCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(pollOnceForKeySpy.lastCall.args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('does run twice if activeAt is inactive and we tick longer than 2 minutes', async () => {
|
|
|
|
@ -235,24 +235,24 @@ describe('SwarmPolling', () => {
|
|
|
|
|
ConversationTypeEnum.GROUP
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
TEST_pollOnceForKeySpy.resetHistory();
|
|
|
|
|
pollOnceForKeySpy.resetHistory();
|
|
|
|
|
convo.set('active_at', Date.now());
|
|
|
|
|
const groupConvoPubkey = PubKey.cast(convo.id as string);
|
|
|
|
|
swarmPolling.addGroupId(groupConvoPubkey);
|
|
|
|
|
// this call the stub two times already, one for our direct pubkey and one for the group
|
|
|
|
|
await swarmPolling.start(true);
|
|
|
|
|
const timeToTick = 3 * 60 * 1000;
|
|
|
|
|
swarmPolling.TEST_forcePolledTimestamp(groupConvoPubkey, Date.now() - timeToTick);
|
|
|
|
|
swarmPolling.forcePolledTimestamp(groupConvoPubkey, Date.now() - timeToTick);
|
|
|
|
|
// more than week old, so inactive group but we have to tick after more than 2 min
|
|
|
|
|
convo.set('active_at', Date.now() - 7 * 25 * 3600 * 1000);
|
|
|
|
|
clock.tick(timeToTick);
|
|
|
|
|
|
|
|
|
|
// we should have two more calls here, so 4 total.
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.callCount).to.eq(4);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.firstCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.secondCall.args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.thirdCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.getCalls()[3].args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
expect(pollOnceForKeySpy.callCount).to.eq(4);
|
|
|
|
|
expect(pollOnceForKeySpy.firstCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(pollOnceForKeySpy.secondCall.args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
expect(pollOnceForKeySpy.thirdCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(pollOnceForKeySpy.getCalls()[3].args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('does run once only if group is inactive and we tick less than 2 minutes ', async () => {
|
|
|
|
@ -260,7 +260,7 @@ describe('SwarmPolling', () => {
|
|
|
|
|
TestUtils.generateFakePubKeyStr(),
|
|
|
|
|
ConversationTypeEnum.GROUP
|
|
|
|
|
);
|
|
|
|
|
TEST_pollOnceForKeySpy.resetHistory();
|
|
|
|
|
pollOnceForKeySpy.resetHistory();
|
|
|
|
|
|
|
|
|
|
convo.set('active_at', Date.now());
|
|
|
|
|
const groupConvoPubkey = PubKey.cast(convo.id as string);
|
|
|
|
@ -273,9 +273,9 @@ describe('SwarmPolling', () => {
|
|
|
|
|
clock.tick(1 * 60 * 1000);
|
|
|
|
|
|
|
|
|
|
// we should have only one more call here, the one for our direct pubkey fetch
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.callCount).to.eq(3);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.secondCall.args).to.deep.eq([groupConvoPubkey, true]); // this one comes from the swarmPolling.start
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.thirdCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(pollOnceForKeySpy.callCount).to.eq(3);
|
|
|
|
|
expect(pollOnceForKeySpy.secondCall.args).to.deep.eq([groupConvoPubkey, true]); // this one comes from the swarmPolling.start
|
|
|
|
|
expect(pollOnceForKeySpy.thirdCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
describe('multiple runs', () => {
|
|
|
|
@ -295,45 +295,45 @@ describe('SwarmPolling', () => {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('does run twice if activeAt is less than 2 days', async () => {
|
|
|
|
|
TEST_pollOnceForKeySpy.resetHistory();
|
|
|
|
|
pollOnceForKeySpy.resetHistory();
|
|
|
|
|
// less than 2 days old, this is an active group
|
|
|
|
|
convo.set('active_at', Date.now() - 2 * 24 * 3600 * 1000 - 3600 * 1000);
|
|
|
|
|
|
|
|
|
|
const timeToTick = 6 * 1000;
|
|
|
|
|
|
|
|
|
|
swarmPolling.TEST_forcePolledTimestamp(convo.id, timeToTick);
|
|
|
|
|
swarmPolling.forcePolledTimestamp(convo.id, timeToTick);
|
|
|
|
|
// we tick more than 5 sec
|
|
|
|
|
clock.tick(timeToTick);
|
|
|
|
|
|
|
|
|
|
await swarmPolling.TEST_pollForAllKeys();
|
|
|
|
|
await swarmPolling.pollForAllKeys();
|
|
|
|
|
// we have 4 calls total. 2 for our direct promises run each 5 seconds, and 2 for the group pubkey active (so run every 5 sec too)
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.callCount).to.eq(4);
|
|
|
|
|
expect(pollOnceForKeySpy.callCount).to.eq(4);
|
|
|
|
|
// first two calls are our pubkey
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.firstCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.secondCall.args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
expect(pollOnceForKeySpy.firstCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(pollOnceForKeySpy.secondCall.args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.thirdCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.getCalls()[3].args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
expect(pollOnceForKeySpy.thirdCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(pollOnceForKeySpy.getCalls()[3].args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('does run twice if activeAt is more than 2 days old and we tick more than one minute ', async () => {
|
|
|
|
|
TEST_pollOnceForKeySpy.resetHistory();
|
|
|
|
|
pollOnceForKeySpy.resetHistory();
|
|
|
|
|
convo.set('active_at', Date.now() - 2 * 25 * 3600 * 1000); // medium active
|
|
|
|
|
|
|
|
|
|
const timeToTick = 65 * 1000;
|
|
|
|
|
swarmPolling.TEST_forcePolledTimestamp(convo.id, timeToTick);
|
|
|
|
|
swarmPolling.forcePolledTimestamp(convo.id, timeToTick);
|
|
|
|
|
|
|
|
|
|
clock.tick(timeToTick); // should tick twice more (one more our direct pubkey and one for the group)
|
|
|
|
|
|
|
|
|
|
await swarmPolling.TEST_pollForAllKeys();
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.callCount).to.eq(4);
|
|
|
|
|
await swarmPolling.pollForAllKeys();
|
|
|
|
|
expect(pollOnceForKeySpy.callCount).to.eq(4);
|
|
|
|
|
|
|
|
|
|
// first two calls are our pubkey
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.firstCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.secondCall.args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
expect(pollOnceForKeySpy.firstCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(pollOnceForKeySpy.secondCall.args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.thirdCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(TEST_pollOnceForKeySpy.getCalls()[3].args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
expect(pollOnceForKeySpy.thirdCall.args).to.deep.eq([ourPubkey, false]);
|
|
|
|
|
expect(pollOnceForKeySpy.getCalls()[3].args).to.deep.eq([groupConvoPubkey, true]);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|