VRFS-122. Session sorting logic.
This commit is contained in:
parent
3e36df4160
commit
16d8ba6795
|
|
@ -9,7 +9,41 @@
|
|||
var clientsToSessions = {};
|
||||
var sessionLatency = {};
|
||||
|
||||
function getSortScore(sessionId) {
|
||||
return sessionLatency[sessionId].sortScore;
|
||||
}
|
||||
|
||||
function ensureSessionLatencyEntry(sessionId) {
|
||||
if (!(sessionId in sessionLatency)) {
|
||||
sessionLatency[sessionId] = {
|
||||
clientLatencies: {},
|
||||
averageLatency: 0
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
function setInitialSortScore(session) {
|
||||
var i,
|
||||
p,
|
||||
score = 0,
|
||||
participant = null;
|
||||
|
||||
if ("invitations" in session) {
|
||||
score += 2;
|
||||
}
|
||||
for (i=0, p=session.participants.length; i<p; i++) {
|
||||
participant = session.participants[i];
|
||||
if ("user_id" in participant) {
|
||||
score += 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
ensureSessionLatencyEntry(session.id);
|
||||
sessionLatency[session.id].sortScore = score;
|
||||
}
|
||||
|
||||
function sessionPings(session) {
|
||||
setInitialSortScore(session);
|
||||
$.each(session.participants, function(index, participant) {
|
||||
var client = { id: participant.client_id };
|
||||
clientsToSessions[client.id] = session.id;
|
||||
|
|
@ -28,15 +62,24 @@
|
|||
}
|
||||
|
||||
function updateSessionLatency(sessionId, latencyResponse) {
|
||||
if (!(sessionId in sessionLatency)) {
|
||||
sessionLatency[sessionId] = {
|
||||
clientLatencies: {},
|
||||
averageLatency: 0
|
||||
};
|
||||
}
|
||||
ensureSessionLatencyEntry(sessionId);
|
||||
var sl = sessionLatency[sessionId];
|
||||
sl.clientLatencies[latencyResponse.id] = latencyResponse.latency;
|
||||
sl.averageLatency = latencyAverage(sl.clientLatencies);
|
||||
sl.sortScore = updateSortScore(sessionId, sl.averageLatency);
|
||||
}
|
||||
|
||||
function updateSortScore(sessionId, averageLatency) {
|
||||
var newScore = sessionLatency[sessionId].sortScore;
|
||||
if (!(newScore)) {
|
||||
newScore = 0;
|
||||
}
|
||||
if (!averageLatency) {
|
||||
return newScore;
|
||||
}
|
||||
var base = Math.floor(newScore);
|
||||
newScore = base + (1/averageLatency);
|
||||
return newScore;
|
||||
}
|
||||
|
||||
function latencyAverage(clientLatencies) {
|
||||
|
|
@ -55,6 +98,7 @@
|
|||
|
||||
this.sessionPings = sessionPings;
|
||||
this.sessionInfo = sessionInfo;
|
||||
this.getSortScore = getSortScore;
|
||||
|
||||
return this;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -8,52 +8,85 @@
|
|||
testLatency: function() {} // Will be overridden by test cases
|
||||
};
|
||||
|
||||
var sessions = [
|
||||
{id: "1", participants: [ { client_id: "1", ip_address: "1.1.1.1" } ] },
|
||||
{id: "2", participants: [ { client_id: "2", ip_address: "1.1.1.2" } ] },
|
||||
{id: "3", participants: [ { client_id: "3", ip_address: "1.1.1.3", user_id: "023" } ] },
|
||||
{id: "4", participants: [ { client_id: "4", ip_address: "1.1.1.4" } ], invitations: [{id:'1', sender_id:'1'}] },
|
||||
{id: "5", participants: [
|
||||
{ client_id: "5", ip_address: "1.1.1.5" },
|
||||
{ client_id: "6", ip_address: "1.1.1.6" },
|
||||
{ client_id: "7", ip_address: "1.1.1.7" }
|
||||
]}
|
||||
];
|
||||
var callCount = 0;
|
||||
var testLatencyResponses = {
|
||||
"1": {id: "1", latency: 35},
|
||||
"2": {id: "2", latency: 50},
|
||||
"3": {id: "3", latency: 150},
|
||||
"4": {id: "4", latency: 200},
|
||||
"5": {id: "5", latency: 100},
|
||||
"6": {id: "6", latency: 10},
|
||||
"7": {id: "7", latency: 10}
|
||||
};
|
||||
|
||||
beforeEach(function() {
|
||||
callCount = 0;
|
||||
sessionLatency = new context.JK.SessionLatency(fakeJamClient);
|
||||
spyOn(fakeJamClient, "testLatency").andCallFake(function(client, callback) {
|
||||
callback(testLatencyResponses[client.id]);
|
||||
callCount++;
|
||||
});
|
||||
});
|
||||
|
||||
describe("SessionPings", function() {
|
||||
it("should call jamClient.testLatency and compute new average", function() {
|
||||
var session = {
|
||||
id: "123",
|
||||
participants: [ { client_id: "999", ip_address: "1.1.1.1" } ]
|
||||
};
|
||||
spyOn(fakeJamClient, "testLatency").andCallFake(function(client, callback) {
|
||||
callback({id: "999", latency: 35});
|
||||
});
|
||||
sessionLatency.sessionPings(session);
|
||||
sessionLatency.sessionPings(sessions[0]);
|
||||
expect(fakeJamClient.testLatency).toHaveBeenCalled();
|
||||
var info = sessionLatency.sessionInfo(session.id);
|
||||
var info = sessionLatency.sessionInfo(sessions[0].id);
|
||||
expect(info.averageLatency).toEqual(35);
|
||||
});
|
||||
|
||||
it("should average multiple client pings", function() {
|
||||
var session = {
|
||||
id: "123",
|
||||
participants: [
|
||||
{ client_id: "1", ip_address: "1.1.1.1" },
|
||||
{ client_id: "2", ip_address: "1.1.1.2" },
|
||||
{ client_id: "3", ip_address: "1.1.1.3" }
|
||||
]
|
||||
};
|
||||
pingResponses = [
|
||||
{id: "1", latency: 100},
|
||||
{id: "2", latency: 10},
|
||||
{id: "3", latency: 10}
|
||||
];
|
||||
pingResponseIndex = 0;
|
||||
spyOn(fakeJamClient, "testLatency").andCallFake(function(client, callback) {
|
||||
callback(pingResponses[pingResponseIndex]);
|
||||
pingResponseIndex++;
|
||||
});
|
||||
|
||||
sessionLatency.sessionPings(session);
|
||||
var info = sessionLatency.sessionInfo(session.id);
|
||||
sessionLatency.sessionPings(sessions[4]);
|
||||
var info = sessionLatency.sessionInfo(sessions[4].id);
|
||||
expect(info.averageLatency).toEqual(40);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
describe("SessionSorting", function() {
|
||||
beforeEach(function() {
|
||||
$.each(sessions, function(index, session) {
|
||||
sessionLatency.sessionPings(session);
|
||||
});
|
||||
});
|
||||
|
||||
it("should return >= 2 for invited sessions", function() {
|
||||
var score = sessionLatency.getSortScore('4');
|
||||
expect(score >= 2).toBeTruthy();
|
||||
});
|
||||
|
||||
it("should return < 2, >= 1 for friend sessions", function() {
|
||||
var score = sessionLatency.getSortScore('3');
|
||||
expect(score < 2).toBeTruthy();
|
||||
expect(score >= 1).toBeTruthy();
|
||||
});
|
||||
it("should return < 1 for unknown sessions", function() {
|
||||
var score = sessionLatency.getSortScore('2');
|
||||
expect(score < 1).toBeTruthy();
|
||||
});
|
||||
it("should return 1/AvgLatency for unknown pingable sessions", function() {
|
||||
var score = sessionLatency.getSortScore('2');
|
||||
expect(score).toEqual(0.02);
|
||||
});
|
||||
it("should return higher sort value for lower latency", function() {
|
||||
var score1 = sessionLatency.getSortScore('1');
|
||||
var score2 = sessionLatency.getSortScore('2');
|
||||
expect(score1).toBeGreaterThan(score2);
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue