549 lines
27 KiB
Ruby
549 lines
27 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe GetWork do
|
|
|
|
let(:austin_geo) { austin_geoip }
|
|
let(:dallas_geo) { dallas_geoip }
|
|
|
|
before(:each) do
|
|
create_phony_database
|
|
end
|
|
|
|
describe "get_work_list" do
|
|
|
|
it "selects no score when no other clients" do
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
|
|
score_location(austin_geo[:locidispid], dallas_geo[:locidispid], 20)
|
|
|
|
GetWork.get_work_list(my_connection).should == []
|
|
end
|
|
|
|
it "selects unscored location" do
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2)
|
|
|
|
GetWork.get_work_list(my_connection).should == [other_connection.client_id]
|
|
GetWork.get_work_list(other_connection).should == [my_connection.client_id]
|
|
end
|
|
|
|
it "skips scored location" do
|
|
score_location(austin_geo[:locidispid], dallas_geo[:locidispid], 20)
|
|
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2)
|
|
|
|
GetWork.get_work_list(my_connection).should == []
|
|
GetWork.get_work_list(other_connection).should == []
|
|
end
|
|
|
|
it "selects scored location with old scores" do
|
|
score_location(austin_geo[:locidispid], dallas_geo[:locidispid], 20)
|
|
# age the scores
|
|
Score.connection.execute("UPDATE scores SET score_dt = score_dt - INTERVAL '200 hours'")
|
|
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2)
|
|
|
|
GetWork.get_work_list(my_connection).should == [other_connection.client_id]
|
|
GetWork.get_work_list(other_connection).should == [my_connection.client_id]
|
|
end
|
|
|
|
it "skips scored location with old and new scores" do
|
|
score_location(austin_geo[:locidispid], dallas_geo[:locidispid], 20)
|
|
# age the scores
|
|
Score.connection.execute("UPDATE scores SET score_dt = score_dt - INTERVAL '200 hours'")
|
|
# create some newer ones
|
|
score_location(austin_geo[:locidispid], dallas_geo[:locidispid], 20)
|
|
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2)
|
|
|
|
GetWork.get_work_list(my_connection).should == []
|
|
GetWork.get_work_list(other_connection).should == []
|
|
end
|
|
|
|
it "skips scores regardess of scoring direction" do
|
|
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2)
|
|
|
|
score_location(dallas_geo[:locidispid], austin_geo[:locidispid], 20)
|
|
GetWork.get_work_list(my_connection).should == []
|
|
GetWork.get_work_list(other_connection).should == []
|
|
|
|
Score.connection.execute('DELETE from scores').check
|
|
|
|
score_location(austin_geo[:locidispid], dallas_geo[:locidispid], 20)
|
|
GetWork.get_work_list(my_connection).should == []
|
|
GetWork.get_work_list(other_connection).should == []
|
|
end
|
|
|
|
it "selects client even if client has scores to self" do
|
|
|
|
# this test just verifies that a bit of data in the db doesn't trip up the query
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2)
|
|
|
|
score_location(dallas_geo[:locidispid], dallas_geo[:locidispid], 20)
|
|
GetWork.get_work_list(my_connection).should == [other_connection.client_id]
|
|
GetWork.get_work_list(other_connection).should == [my_connection.client_id]
|
|
end
|
|
|
|
it "selects only one client from a given remote location" do
|
|
|
|
# if two clients have the same locidispid, only one is meant to be selected for scoring
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection1 = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2)
|
|
other_connection2 = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 3)
|
|
|
|
list = GetWork.get_work_list(my_connection)
|
|
(list == [other_connection1.client_id] || list == [other_connection2.client_id]).should be_true # we don't know which one it'll pick
|
|
GetWork.get_work_list(other_connection1).should =~ [my_connection.client_id, other_connection2.client_id]
|
|
GetWork.get_work_list(other_connection2).should =~ [my_connection.client_id, other_connection1.client_id]
|
|
end
|
|
|
|
it "selects no clients when multiple clients in same location have a score" do
|
|
|
|
# if two clients have the same locidispid, only one is meant to be selected for scoring
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection1 = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2)
|
|
other_connection2 = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 3)
|
|
|
|
score_location(austin_geo[:locidispid], dallas_geo[:locidispid], 20)
|
|
|
|
GetWork.get_work_list(my_connection).should == []
|
|
GetWork.get_work_list(other_connection1).should == [other_connection2.client_id]
|
|
GetWork.get_work_list(other_connection2).should == [other_connection1.client_id]
|
|
end
|
|
|
|
it "selects two clients from differing, unscored locations" do
|
|
|
|
# if two clients have the same locidispid, only one is meant to be selected for scoring
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection1 = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2)
|
|
other_connection2 = FactoryGirl.create(:connection, locidispid: houston_geoip[:locidispid], addr: 3)
|
|
|
|
GetWork.get_work_list(my_connection).should =~ [other_connection1.client_id, other_connection2.client_id]
|
|
GetWork.get_work_list(other_connection1).should =~ [my_connection.client_id, other_connection2.client_id]
|
|
GetWork.get_work_list(other_connection2).should =~ [my_connection.client_id, other_connection1.client_id]
|
|
end
|
|
|
|
it "ignores client with the same addr" do
|
|
|
|
# if two clients have the same locidispid, only one is meant to be selected for scoring
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection1 = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 1)
|
|
|
|
GetWork.get_work_list(my_connection).should == []
|
|
end
|
|
|
|
it "ignores client with the same addr" do
|
|
|
|
# if two clients have the same locidispid, only one is meant to be selected for scoring
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection1 = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 1)
|
|
|
|
GetWork.get_work_list(my_connection).should == []
|
|
end
|
|
|
|
it "randomizes ordering of selected locations" do
|
|
# if two clients have the same locidispid, only one is meant to be selected for scoring
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection1 = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2)
|
|
other_connection2 = FactoryGirl.create(:connection, locidispid: houston_geoip[:locidispid], addr: 3)
|
|
|
|
initial_ordering = GetWork.get_work_list(my_connection)
|
|
initial_ordering.should =~ [other_connection1.client_id, other_connection2.client_id]
|
|
|
|
swapped = false
|
|
100.times do
|
|
# it's randomized results, so we have to let probability win out here. eventually, though (within 100 times? surely), we should see the ordering of work switch up
|
|
swapped = (GetWork.get_work_list(my_connection) == [initial_ordering[1], initial_ordering[0]])
|
|
break if swapped
|
|
end
|
|
|
|
swapped.should be_true
|
|
end
|
|
|
|
it "excludes udp unreachable clients" do
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2, udp_reachable: false)
|
|
other_connection2 = FactoryGirl.create(:connection, locidispid: houston_geoip[:locidispid], addr: 3)
|
|
|
|
GetWork.get_work_list(my_connection).should == [other_connection2.client_id]
|
|
GetWork.get_work_list(other_connection).should == []
|
|
GetWork.get_work_list(other_connection2).should == [my_connection.client_id]
|
|
end
|
|
|
|
it "excludes network testing clients" do
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2, is_network_testing: true)
|
|
other_connection2 = FactoryGirl.create(:connection, locidispid: houston_geoip[:locidispid], addr: 3)
|
|
|
|
GetWork.get_work_list(my_connection).should == [other_connection2.client_id]
|
|
GetWork.get_work_list(other_connection).should == []
|
|
GetWork.get_work_list(other_connection2).should == [my_connection.client_id]
|
|
end
|
|
|
|
it "excludes scoring_timeout clients (1)" do
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2, scoring_timeout: 1.days.from_now)
|
|
other_connection2 = FactoryGirl.create(:connection, locidispid: houston_geoip[:locidispid], addr: 3)
|
|
|
|
GetWork.get_work_list(my_connection).should == [other_connection2.client_id]
|
|
GetWork.get_work_list(other_connection).should == []
|
|
GetWork.get_work_list(other_connection2).should == [my_connection.client_id]
|
|
end
|
|
|
|
it "excludes scoring_timeout clients (2)" do
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2, scoring_timeout: 1.days.from_now)
|
|
other_connection2 = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 3)
|
|
|
|
GetWork.get_work_list(my_connection).should == [other_connection2.client_id]
|
|
GetWork.get_work_list(other_connection).should == []
|
|
GetWork.get_work_list(other_connection2).should == [my_connection.client_id]
|
|
end
|
|
|
|
it "excludes connections in a session" do
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2,)
|
|
other_connection2 = FactoryGirl.create(:connection, locidispid: houston_geoip[:locidispid], addr: 3)
|
|
|
|
music_session = FactoryGirl.create(:active_music_session, creator: my_connection.user)
|
|
|
|
other_connection.music_session = music_session
|
|
other_connection.save!
|
|
|
|
GetWork.get_work_list(my_connection).should == [other_connection2.client_id]
|
|
GetWork.get_work_list(other_connection).should == []
|
|
GetWork.get_work_list(other_connection2).should == [my_connection.client_id]
|
|
end
|
|
end
|
|
|
|
describe "record" do
|
|
|
|
let(:connection1) { FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: austin_ip_as_num, ip_address: austin_ip) }
|
|
let(:connection2) { FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: dallas_ip_as_num, ip_address: dallas_ip) }
|
|
|
|
it "records client errors if no score" do
|
|
|
|
original_timeout1 = connection1.scoring_timeout
|
|
original_timeout2 = connection2.scoring_timeout
|
|
|
|
result = Score.record(connection1.user, connection1.client_id, connection1.ip_address, connection2.client_id, connection2.ip_address, nil, '', false)
|
|
result.should == {message: 'udpReachable is false (to=f)', error: true}
|
|
|
|
connection1.reload
|
|
connection2.reload
|
|
connection1.scoring_failures.should == 1
|
|
expect(connection1.scoring_timeout).to be_within(1.second).of(original_timeout1)
|
|
connection1.scoring_timeout_occurrences.should == 0
|
|
connection2.scoring_failures.should == 1
|
|
expect(connection2.scoring_timeout).to be_within(1.second).of(original_timeout2)
|
|
connection1.scoring_timeout_occurrences.should == 0
|
|
end
|
|
|
|
it "records client errors if addr == addr" do
|
|
original_timeout1 = connection1.scoring_timeout
|
|
original_timeout2 = connection2.scoring_timeout
|
|
|
|
result = Score.record(connection1.user, connection1.client_id, connection1.ip_address, connection2.client_id, connection1.ip_address, nil, '', false)
|
|
result.should == {message: 'aAddr and bAddr are the same (to=f)', error: true}
|
|
|
|
connection1.reload
|
|
connection2.reload
|
|
connection1.scoring_failures.should == 1
|
|
expect(connection1.scoring_timeout).to be_within(1.second).of(original_timeout1)
|
|
connection1.scoring_timeout_occurrences.should == 0
|
|
connection2.scoring_failures.should == 1
|
|
expect(connection2.scoring_timeout).to be_within(1.second).of(original_timeout2)
|
|
connection1.scoring_timeout_occurrences.should == 0
|
|
end
|
|
|
|
it "records success if valid" do
|
|
original_timeout1 = connection1.scoring_timeout
|
|
original_timeout2 = connection2.scoring_timeout
|
|
|
|
result = Score.record(connection1.user, connection1.client_id, connection1.ip_address, connection2.client_id, connection2.ip_address, 20, '', true)
|
|
result.should == {message: 'OK (to=f)', error: false}
|
|
|
|
connection1.reload
|
|
connection2.reload
|
|
connection1.scoring_failures.should == 0
|
|
expect(connection1.scoring_timeout).to be_within(1.second).of(original_timeout1)
|
|
connection1.scoring_timeout_occurrences.should == 0
|
|
connection2.scoring_failures.should == 0
|
|
expect(connection2.scoring_timeout).to be_within(1.second).of(original_timeout2)
|
|
connection1.scoring_timeout_occurrences.should == 0
|
|
end
|
|
|
|
it "puts in doghouse after enough scoring errors" do
|
|
|
|
last_result = nil
|
|
APP_CONFIG.scoring_timeout_threshold.times do
|
|
last_result = Score.record(connection1.user, connection1.client_id, connection1.ip_address, connection2.client_id, connection2.ip_address, nil, '', false)
|
|
end
|
|
|
|
last_result.should == {message: 'udpReachable is false (to=t)', error: true}
|
|
|
|
connection1.reload
|
|
connection2.reload
|
|
|
|
connection1.scoring_failures.should == APP_CONFIG.scoring_timeout_threshold
|
|
connection1.scoring_failures_offset.should == APP_CONFIG.scoring_timeout_threshold
|
|
expect(connection1.scoring_timeout).to be_within(1.second).of(APP_CONFIG.scoring_timeout_minutes.minutes.from_now)
|
|
connection1.scoring_timeout_occurrences.should == 1
|
|
connection2.scoring_failures.should == APP_CONFIG.scoring_timeout_threshold
|
|
connection2.scoring_failures_offset.should == APP_CONFIG.scoring_timeout_threshold
|
|
expect(connection2.scoring_timeout).to be_within(1.second).of(APP_CONFIG.scoring_timeout_minutes.minutes.from_now)
|
|
connection2.scoring_timeout_occurrences.should == 1
|
|
end
|
|
|
|
describe "while in the doghouse" do
|
|
before(:each) do
|
|
APP_CONFIG.scoring_timeout_threshold.times do
|
|
Score.record(connection1.user, connection1.client_id, connection1.ip_address, connection2.client_id, connection2.ip_address, nil, '', false)
|
|
end
|
|
|
|
end
|
|
|
|
it "another bad score comes in" do
|
|
Score.record(connection1.user, connection1.client_id, connection1.ip_address, connection2.client_id, connection2.ip_address, nil, '', false)
|
|
|
|
connection1.reload
|
|
connection2.reload
|
|
|
|
connection1.scoring_failures.should == APP_CONFIG.scoring_timeout_threshold + 1
|
|
expect(connection1.scoring_timeout).to be_within(1.second).of(APP_CONFIG.scoring_timeout_minutes.minutes.from_now)
|
|
connection1.scoring_timeout_occurrences.should == 1
|
|
connection2.scoring_failures.should == APP_CONFIG.scoring_timeout_threshold + 1
|
|
expect(connection2.scoring_timeout).to be_within(1.second).of(APP_CONFIG.scoring_timeout_minutes.minutes.from_now)
|
|
connection2.scoring_timeout_occurrences.should == 1
|
|
end
|
|
|
|
it "a good score comes in" do
|
|
# this has no effect when in the dog house
|
|
Score.record(connection1.user, connection1.client_id, connection1.ip_address, connection2.client_id, connection2.ip_address, 20, '', true)
|
|
|
|
connection1.reload
|
|
connection2.reload
|
|
|
|
connection1.scoring_failures.should == APP_CONFIG.scoring_timeout_threshold
|
|
expect(connection1.scoring_timeout).to be_within(1.second).of(APP_CONFIG.scoring_timeout_minutes.minutes.from_now)
|
|
connection1.scoring_timeout_occurrences.should == 1
|
|
connection2.scoring_failures.should == APP_CONFIG.scoring_timeout_threshold
|
|
expect(connection2.scoring_timeout).to be_within(1.second).of(APP_CONFIG.scoring_timeout_minutes.minutes.from_now)
|
|
connection2.scoring_timeout_occurrences.should == 1
|
|
end
|
|
end
|
|
|
|
describe "after doghouse expires" do
|
|
before(:each) do
|
|
APP_CONFIG.scoring_timeout_threshold.times do
|
|
Score.record(connection1.user, connection1.client_id, connection1.ip_address, connection2.client_id, connection2.ip_address, nil, '', false)
|
|
end
|
|
|
|
# bring scoring_timeout to the past
|
|
connection1.scoring_timeout = (APP_CONFIG.scoring_timeout_minutes * 2).minutes.ago
|
|
connection1.save!
|
|
connection2.scoring_timeout = (APP_CONFIG.scoring_timeout_minutes * 2).minutes.ago
|
|
connection2.save!
|
|
end
|
|
|
|
it "another bad score comes in" do
|
|
|
|
original_timeout1 = connection1.scoring_timeout
|
|
original_timeout2 = connection2.scoring_timeout
|
|
|
|
Score.record(connection1.user, connection1.client_id, connection1.ip_address, connection2.client_id, connection2.ip_address, nil, '', false)
|
|
|
|
connection1.reload
|
|
connection2.reload
|
|
|
|
# failures shold keep increment, but the user should not yet in_scoring_timeout? because it's only one failure
|
|
connection1.scoring_failures.should == APP_CONFIG.scoring_timeout_threshold + 1
|
|
connection1.in_scoring_timeout?.should be_false
|
|
expect(connection1.scoring_timeout).to be_within(1.second).of(original_timeout1)
|
|
connection1.scoring_timeout_occurrences.should == 1
|
|
|
|
connection2.scoring_failures.should == APP_CONFIG.scoring_timeout_threshold + 1
|
|
connection2.in_scoring_timeout?.should be_false
|
|
expect(connection2.scoring_timeout).to be_within(1.second).of(original_timeout2)
|
|
connection2.scoring_timeout_occurrences.should == 1
|
|
end
|
|
|
|
it "a good score comes in" do
|
|
original_timeout1 = connection1.scoring_timeout
|
|
original_timeout2 = connection2.scoring_timeout
|
|
|
|
# this has no effect when in the dog house
|
|
Score.record(connection1.user, connection1.client_id, connection1.ip_address, connection2.client_id, connection2.ip_address, 20, '', true)
|
|
|
|
connection1.reload
|
|
connection2.reload
|
|
|
|
connection1.scoring_failures.should == 0
|
|
connection1.in_scoring_timeout?.should be_false
|
|
expect(connection1.scoring_timeout).to be_within(1.second).of(original_timeout1)
|
|
connection1.scoring_timeout_occurrences.should == 1
|
|
|
|
connection2.scoring_failures.should == 0
|
|
connection2.in_scoring_timeout?.should be_false
|
|
expect(connection2.scoring_timeout).to be_within(1.second).of(original_timeout2)
|
|
connection2.scoring_timeout_occurrences.should == 1
|
|
end
|
|
|
|
it "a good score comes in, then enough bad scores to be put back into timeout" do
|
|
|
|
Score.record(connection1.user, connection1.client_id, connection1.ip_address, connection2.client_id, connection2.ip_address, 20, '', true)
|
|
|
|
# if a good score comes in while in the dog house, everything should be set back to 0, and bad counting resumes
|
|
APP_CONFIG.scoring_timeout_threshold.times do
|
|
Score.record(connection1.user, connection1.client_id, connection1.ip_address, connection2.client_id, connection2.ip_address, nil, '', false)
|
|
end
|
|
|
|
connection1.reload
|
|
connection2.reload
|
|
|
|
connection1.scoring_failures.should == APP_CONFIG.scoring_timeout_threshold
|
|
connection1.scoring_failures_offset.should == APP_CONFIG.scoring_timeout_threshold
|
|
connection1.in_scoring_timeout?.should be_true
|
|
expect(connection1.scoring_timeout).to be_within(1.second).of(APP_CONFIG.scoring_timeout_minutes.minutes.from_now)
|
|
connection1.scoring_timeout_occurrences.should == 2
|
|
connection2.scoring_failures.should == APP_CONFIG.scoring_timeout_threshold
|
|
connection2.scoring_failures_offset.should == APP_CONFIG.scoring_timeout_threshold
|
|
connection2.in_scoring_timeout?.should be_true
|
|
expect(connection2.scoring_timeout).to be_within(1.second).of(APP_CONFIG.scoring_timeout_minutes.minutes.from_now)
|
|
connection2.scoring_timeout_occurrences.should == 2
|
|
end
|
|
|
|
it "enough bad scores come in to put back into timeout" do
|
|
|
|
APP_CONFIG.scoring_timeout_threshold.times do
|
|
Score.record(connection1.user, connection1.client_id, connection1.ip_address, connection2.client_id, connection2.ip_address, nil, '', false)
|
|
end
|
|
|
|
connection1.reload
|
|
connection2.reload
|
|
|
|
connection1.scoring_failures.should == APP_CONFIG.scoring_timeout_threshold * 2 # because this user keeps failing with no good scores
|
|
connection1.scoring_failures_offset.should == APP_CONFIG.scoring_timeout_threshold * 2 # because this user keeps failing with no good scores
|
|
connection1.in_scoring_timeout?.should be_true
|
|
expect(connection1.scoring_timeout).to be_within(1.second).of(APP_CONFIG.scoring_timeout_minutes.minutes.from_now)
|
|
connection1.scoring_timeout_occurrences.should == 2
|
|
connection2.scoring_failures.should == APP_CONFIG.scoring_timeout_threshold * 2 # because this user keeps failing with no good scores
|
|
connection2.scoring_failures_offset.should == APP_CONFIG.scoring_timeout_threshold * 2 # because this user keeps failing with no good scores
|
|
connection2.in_scoring_timeout?.should be_true
|
|
expect(connection2.scoring_timeout).to be_within(1.second).of(APP_CONFIG.scoring_timeout_minutes.minutes.from_now)
|
|
connection2.scoring_timeout_occurrences.should == 2
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
describe "summary" do
|
|
it "selects no score when no other clients" do
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
|
|
score_location(austin_geo[:locidispid], dallas_geo[:locidispid], 20)
|
|
|
|
summary = GetWork.summary
|
|
summary.length.should == 1
|
|
summary[0].work_count.should == 0
|
|
summary[0].client_id.should == my_connection.client_id
|
|
summary[0].email.should == my_connection.user.email
|
|
summary[0].user_id.should == my_connection.user.id
|
|
end
|
|
|
|
it "selects no score when no other clients" do
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1, udp_reachable:true)
|
|
|
|
score_location(austin_geo[:locidispid], dallas_geo[:locidispid], 20)
|
|
|
|
summary = GetWork.summary
|
|
summary.length.should == 1
|
|
summary[0].work_count.should == 0
|
|
summary[0].client_id.should == my_connection.client_id
|
|
summary[0].email.should == my_connection.user.email
|
|
summary[0].user_id.should == my_connection.user.id
|
|
end
|
|
|
|
it "selects unscored location" do
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2)
|
|
|
|
#score_location(austin_geo[:locidispid], dallas_geo[:locidispid], 20)
|
|
|
|
summary = GetWork.summary
|
|
summary.length.should == 2
|
|
summary[0].work_count.should == 1
|
|
summary[1].work_count.should == 1
|
|
end
|
|
|
|
it "does not count scored location" do
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2)
|
|
|
|
score_location(austin_geo[:locidispid], dallas_geo[:locidispid], 20)
|
|
|
|
summary = GetWork.summary
|
|
summary.length.should == 2
|
|
summary[0].work_count.should == 0
|
|
summary[1].work_count.should == 0
|
|
end
|
|
|
|
it "does not count duplicate location" do
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2)
|
|
other_connection2 = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2)
|
|
|
|
score_location(austin_geo[:locidispid], dallas_geo[:locidispid], 20)
|
|
|
|
summary = GetWork.summary
|
|
summary.length.should == 3
|
|
summary[0].work_count.should == 0
|
|
summary[1].work_count.should == 0
|
|
summary[2].work_count.should == 0
|
|
end
|
|
|
|
it "does not count udp_reachable" do
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2, udp_reachable: false)
|
|
|
|
summary = GetWork.summary
|
|
summary.length.should == 2
|
|
summary[0].work_count.should == 0
|
|
summary[1].work_count.should == 0
|
|
end
|
|
|
|
it "does not count udp_reachable with 2 other clients" do
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2, udp_reachable: false)
|
|
other_connection2 = FactoryGirl.create(:connection, locidispid: houston_geoip[:locidispid], addr: 3)
|
|
|
|
summary = GetWork.summary
|
|
summary.length.should == 3
|
|
summary[0].work_count.should == 1
|
|
summary[1].work_count.should == 1
|
|
summary[2].work_count.should == 0
|
|
end
|
|
|
|
it "counts with 3" do
|
|
my_connection = FactoryGirl.create(:connection, locidispid: austin_geo[:locidispid], addr: 1)
|
|
other_connection = FactoryGirl.create(:connection, locidispid: dallas_geo[:locidispid], addr: 2)
|
|
other_connection2 = FactoryGirl.create(:connection, locidispid: houston_geoip[:locidispid], addr: 3)
|
|
|
|
#Database.dump('select * FROM get_work_summary_no_agg(INTERVAL \'120 hours\')');
|
|
|
|
summary = GetWork.summary
|
|
summary.length.should == 3
|
|
summary[0].work_count.should == 2
|
|
summary[1].work_count.should == 2
|
|
summary[2].work_count.should == 2
|
|
|
|
end
|
|
end
|
|
|
|
end |