VRFS-122. Session sorting logic.

This commit is contained in:
Jonathon Wilson 2012-11-30 09:35:52 -07:00
parent 3e36df4160
commit 16d8ba6795
2 changed files with 113 additions and 36 deletions

View File

@ -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;
};

View File

@ -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);
});
});
});