Respect BtcWireProto changes, make another step towards tests
This commit is contained in:
@@ -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
|
||||
|
||||
|
@@ -1,4 +1,5 @@
|
||||
require 'rspec'
|
||||
require 'em-spec/rspec'
|
||||
|
||||
$: << File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
|
||||
|
||||
@@ -8,3 +9,4 @@ def binary(str_ary)
|
||||
d.to_i(16).chr
|
||||
end.join("")
|
||||
end
|
||||
|
||||
|
Reference in New Issue
Block a user