Respect BtcWireProto changes, make another step towards tests

This commit is contained in:
Nick Thomas
2011-06-21 21:18:23 +01:00
parent eb764e4acb
commit 21ad42894e
3 changed files with 93 additions and 57 deletions

View File

@@ -5,15 +5,33 @@ require 'em-bitcoin'
include ::EM::P
class MockActor
attr_accessor :connection
attr_accessor :connection, :network_name, :sub_version, :current_height,
:node_nonce
def inspect
"#<MockActor: #{name}>"
end
def to_s ; inspect ; end
def network_name ; :main ; end
def current_time ; Time.now ; end
def sub_version ; nil ; end
def current_height ; 0 ; end
def initialize(attributes = {})
self.network_name = :main # defaults
self.current_height = 0
self.node_nonce = 0
attributes.each {|k,v| self.send("#{k}=", v) }
end
def current_time=(new_time)
@current_time = new_time
end
def current_time
@current_time || Time.now
end
def log(level, msg)
STDERR.puts("#{level}: #{msg}") if $DEBUG
STDERR.puts([name, level, msg].join(": ")) #if $DEBUG
end
def ready!
@@ -24,49 +42,57 @@ class MockActor
@ready == true
end
end
protected
class MockSignature
attr_reader :lip, :lport, :rip, :rport
attr_accessor :name
def initialize(lip = "127.0.0.1", lport = 12701, rip="127.0.0.2", rport=12702)
@lip, @lport, @rip, @rport = lip, lport, rip, rport
end
end
module EMPMocks
def get_peername
Socket::pack_sockaddr_in(@signature.rport, @signature.rip)
end
def get_sockname
Socket::pack_sockaddr_in(@signature.lport, @signature.lip)
end
def send_data(d)
nil # TODO: expectations &c...
end
end
shared_examples_for BitcoinPeer do
end
describe BitcoinClient do
before(:each) do
@reactor = stub("reactor")
@sig = MockSignature.new
include EM::Spec
@actor = MockActor.new
@client = BitcoinClient.new(@sig, @actor)
@client.extend(EMPMocks)
def host
"127.0.0.1"
end
def port
@port || 0
end
def start_server(actor = @server_actor)
sig = EM::start_server(host, port, EM::P::BitcoinServer, actor)
@port = Socket::unpack_sockaddr_in(EM::get_sockname(sig))[0]
@server
end
def start_client(actor = @client_actor)
@client = EM::connect(host, port, EM::P::BitcoinClient, actor)
end
before(:each) do
@client_actor = MockActor.new(:name => "client")
@server_actor = MockActor.new(:name => "server")
done
end
describe "connection setup" do
context "successful" do
it "should accept a valid actor" do
@client.actor.should == @actor
end
it "should connect to a Bitcoin server" do
start_server
start_client
done
it "should send a version first, accept a verack + version, then send a verack"
# EM::add_periodic_timer(2) do
# @client_actor.should_receive(:ready!).and_return(true)
# @client_actor.should_receive(:connection=).with(@client).and_return(true)
# done
# end
end
end
end