|
|
|
|
|
require File.dirname(__FILE__) + '/../spec_helper'
|
|
|
|
|
|
describe GraderMessage do
|
|
|
|
|
|
def add_submission_with_id(id)
|
|
|
submission = stub(Submission, :id => id)
|
|
|
GraderMessage.create_grade_submission("exam",submission)
|
|
|
end
|
|
|
|
|
|
before(:each) do
|
|
|
GraderMessage.destroy_all
|
|
|
end
|
|
|
|
|
|
it "should return nil when there is no messages to me" do
|
|
|
GraderMessage.create_message(1,0)
|
|
|
GraderMessage.get_message_for(2).should == nil
|
|
|
end
|
|
|
|
|
|
it "should return a messages directed to me" do
|
|
|
GraderMessage.create_message(1,0)
|
|
|
GraderMessage.get_message_for(2).should == nil
|
|
|
end
|
|
|
|
|
|
it "should return a messages directed to me, in order of creation" do
|
|
|
msg1 = GraderMessage.create_message(1,0)
|
|
|
msg2 = GraderMessage.create_message(2,2)
|
|
|
msg3 = GraderMessage.create_message(1,2)
|
|
|
GraderMessage.get_message_for(1).id.should == msg1.id
|
|
|
GraderMessage.get_message_for(1).id.should == msg3.id
|
|
|
end
|
|
|
|
|
|
it "should not return a messages directed to me if the command is not on my list of accepting commands" do
|
|
|
msg1 = GraderMessage.create_message(1,GraderMessage::GRADE_SUBMISSION)
|
|
|
msg2 = GraderMessage.create_message(1,GraderMessage::STOP)
|
|
|
GraderMessage.get_message_for(1,[GraderMessage::GRADE_TEST_REQUEST]).should == nil
|
|
|
end
|
|
|
|
|
|
it "should return a messages directed to me if the command is on my list of accepting commands" do
|
|
|
msg1 = GraderMessage.create_message(1,0)
|
|
|
msg2 = GraderMessage.create_message(1,2)
|
|
|
msg3 = GraderMessage.create_message(2,2)
|
|
|
GraderMessage.get_message_for(1,[2]).id.should == msg2.id
|
|
|
GraderMessage.get_message_for(1,[2]).should == nil
|
|
|
end
|
|
|
|
|
|
it "should return a message directed to anyone when I'm requesting" do
|
|
|
msg1 = GraderMessage.create_message(:any,0)
|
|
|
GraderMessage.get_message_for(1).id.should == msg1.id
|
|
|
end
|
|
|
|
|
|
it "should return a messages directed to anyone only if the command is on my list of accepting commands" do
|
|
|
msg1 = GraderMessage.create_message(:any,0)
|
|
|
GraderMessage.get_message_for(1,[1]).should == nil
|
|
|
msg2 = GraderMessage.create_message(:any,1)
|
|
|
GraderMessage.get_message_for(1,[1]).id.should == msg2.id
|
|
|
end
|
|
|
|
|
|
it "should return messages directed to anyone to many graders in order of requests" do
|
|
|
msg1 = GraderMessage.create_message(:any,0)
|
|
|
msg2 = GraderMessage.create_message(:any,2)
|
|
|
msg3 = GraderMessage.create_message(:any,2)
|
|
|
GraderMessage.get_message_for(1).id.should == msg1.id
|
|
|
GraderMessage.get_message_for(2).id.should == msg2.id
|
|
|
GraderMessage.get_message_for(1).id.should == msg3.id
|
|
|
end
|
|
|
|
|
|
it "should return messages directed to anyone to graders accepting those commands in order of requests" do
|
|
|
msg1 = GraderMessage.create_message(:any,0)
|
|
|
msg2 = GraderMessage.create_message(:any,1)
|
|
|
msg3 = GraderMessage.create_message(:any,2)
|
|
|
msg4 = GraderMessage.create_message(:any,2)
|
|
|
msg5 = GraderMessage.create_message(:any,3)
|
|
|
GraderMessage.get_message_for(1).id.should == msg1.id
|
|
|
GraderMessage.get_message_for(2,[2]).id.should == msg3.id
|
|
|
GraderMessage.get_message_for(1,[3]).id.should == msg5.id
|
|
|
GraderMessage.get_message_for(2).id.should == msg2.id
|
|
|
GraderMessage.get_message_for(1).id.should == msg4.id
|
|
|
end
|
|
|
|
|
|
it "should get all messages dispatched when there are many concurrent processes" do
|
|
|
n = 100
|
|
|
msg = []
|
|
|
n.times do |i|
|
|
|
msg << GraderMessage.create_message(:any,i)
|
|
|
end
|
|
|
|
|
|
#puts "#{n} messages created"
|
|
|
|
|
|
t = 10 # use 10 threads
|
|
|
ths = []
|
|
|
t.times do |i|
|
|
|
fork do
|
|
|
#puts "I'm the #{i+1}-th process."
|
|
|
begin
|
|
|
m = GraderMessage.get_message_for(i)
|
|
|
#puts "#{i+1} got #{m.id}" if m
|
|
|
sleep 0.1
|
|
|
end while m!=nil
|
|
|
#puts "The #{i+1}-th process terminated."
|
|
|
exit 0
|
|
|
end
|
|
|
end
|
|
|
|
|
|
t.times do
|
|
|
Process.wait
|
|
|
end
|
|
|
|
|
|
# for some reason the connection is lost at this point.
|
|
|
GraderMessage.connection.reconnect!
|
|
|
|
|
|
# check that all messages have been processed
|
|
|
GraderMessage.find(:all) do |msg|
|
|
|
msg.taken_grader_process.should != nil
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|