Skip to content

Commit 5bc64f6

Browse files
committed
Add tests for ffi-rzmq and isolate test execution for each ZMQ adapter
1 parent 702b72c commit 5bc64f6

12 files changed

+150
-34
lines changed

Gemfile

+1
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ end
1616
group :test do
1717
gem 'cztop'
1818
gem 'rbczmq'
19+
gem 'ffi-rzmq'
1920
end

ci/Dockerfile.main.erb

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
FROM iruby-test-base:ruby-<%= ruby_version %>
22

3+
RUN gem install cztop \
4+
&& gem install rbczmq -- --with-system-libs
5+
36
RUN mkdir -p /iruby
47
ADD . /iruby
58
WORKDIR /iruby
6-
RUN gem install cztop \
7-
&& gem install rbczmq -- --with-system-libs \
8-
&& bundle install
9+
RUN bundle install

lib/iruby/session.rb

+4-4
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ module IRuby
77
class Session
88
include SessionSerialize
99

10-
def initialize(config)
10+
def initialize(config, adapter_name=nil)
1111
@config = config
12-
@adapter = create_session_adapter(config)
12+
@adapter = create_session_adapter(config, adapter_name)
1313

1414
setup
1515
setup_sockets
@@ -108,8 +108,8 @@ def check_socket_type(socket_type)
108108
end
109109
end
110110

111-
def create_session_adapter(config)
112-
adapter_class = SessionAdapter.select_adapter_class
111+
def create_session_adapter(config, adapter_name)
112+
adapter_class = SessionAdapter.select_adapter_class(adapter_name)
113113
adapter_class.new(config)
114114
end
115115
end

lib/iruby/session_adapter.rb

+9-4
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,23 @@ def make_rep_socket(protocol, host, port)
3939
require_relative 'session_adapter/ffirzmq_adapter'
4040
require_relative 'session_adapter/pyzmq_adapter'
4141

42-
def self.select_adapter_class
42+
def self.select_adapter_class(name=nil)
4343
classes = {
4444
'rbczmq' => SessionAdapter::RbczmqAdapter,
4545
'cztop' => SessionAdapter::CztopAdapter,
4646
'ffi-rzmq' => SessionAdapter::FfirzmqAdapter,
4747
'pyzmq' => SessionAdapter::PyzmqAdapter
4848
}
49-
if (name = ENV.fetch('IRUBY_SESSION_ADAPTER', nil))
49+
if (name ||= ENV.fetch('IRUBY_SESSION_ADAPTER', nil))
5050
cls = classes[name]
5151
unless cls.available?
52-
raise SessionAdapterNotFound,
53-
"Session adapter `#{name}` from IRUBY_SESSION_ADAPTER is unavailable"
52+
if ENV['IRUBY_SESSION_ADAPTER']
53+
raise SessionAdapterNotFound,
54+
"Session adapter `#{name}` from IRUBY_SESSION_ADAPTER is unavailable"
55+
else
56+
raise SessionAdapterNotFound,
57+
"Session adapter `#{name}` is unavailable"
58+
end
5459
end
5560
return cls
5661
end

lib/iruby/session_adapter/ffirzmq_adapter.rb

+26
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,32 @@ class FfirzmqAdapter < BaseAdapter
44
def self.load_requirements
55
require 'ffi-rzmq'
66
end
7+
8+
def heartbeat_loop(sock)
9+
@heartbeat_device = ZMQ::Device.new(sock, sock)
10+
end
11+
12+
private
13+
14+
def make_socket(type, protocol, host, port)
15+
case type
16+
when :ROUTER, :PUB, :REP
17+
type = ZMQ.const_get(type)
18+
else
19+
if ZMQ.const_defined?(type)
20+
raise ArgumentError, "Unsupported ZMQ socket type: #{type_symbol}"
21+
else
22+
raise ArgumentError, "Invalid ZMQ socket type: #{type_symbol}"
23+
end
24+
end
25+
zmq_context.socket(type).tap do |sock|
26+
sock.bind("#{protocol}://#{host}:#{port}")
27+
end
28+
end
29+
30+
def zmq_context
31+
@zmq_context ||= ZMQ::Context.new
32+
end
733
end
834
end
935
end

lib/iruby/session_adapter/rbczmq_adapter.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def recv(sock)
1414
end
1515

1616
def heartbeat_loop(sock)
17-
ZMQ.proxy(socket, socket)
17+
ZMQ.proxy(sock, sock)
1818
end
1919

2020
private

run-test.sh

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#! /bin/bash
2+
3+
set -ex
4+
5+
# ADAPTERS="cztop rbczmq ffi-rzmq pyzmq"
6+
ADAPTERS="cztop rbczmq ffi-rzmq"
7+
8+
for adapter in $ADAPTERS; do
9+
export IRUBY_TEST_SESSION_ADAPTER_NAME=$adapter
10+
bundle exec rake test TESTOPTS=-v
11+
done

tasks/ci.rake

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ namespace :ci do
5959
task :script do
6060
volumes = ['-v', "#{Dir.pwd}:/iruby"] if ENV['attach_pwd']
6161
sh 'docker', 'run', '--rm', '-it', *volumes,
62-
iruby_test_image_name, 'bundle', 'exec', 'rake', 'test'
62+
iruby_test_image_name, 'bash', 'run-test.sh'
6363
end
6464
end
6565
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
require_relative 'session_adapter_test_base'
2+
require 'iruby'
3+
4+
module IRubyTest
5+
if ENV['IRUBY_TEST_SESSION_ADAPTER_NAME'] == 'cztop'
6+
class CztopAdapterTest < SessionAdapterTestBase
7+
def adapter_class
8+
IRuby::SessionAdapter::CztopAdapter
9+
end
10+
11+
def test_send
12+
assert(adapter_class.available?)
13+
end
14+
15+
def test_recv
16+
skip
17+
end
18+
end
19+
end
20+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
require_relative 'session_adapter_test_base'
2+
require 'iruby'
3+
4+
module IRubyTest
5+
if ENV['IRUBY_TEST_SESSION_ADAPTER_NAME'] == 'ffi-rzmq'
6+
class FfirzmqAdapterTest < SessionAdapterTestBase
7+
def adapter_class
8+
IRuby::SessionAdapter::FfirzmqAdapter
9+
end
10+
11+
def test_send
12+
assert(adapter_class.available?)
13+
end
14+
15+
def test_recv
16+
skip
17+
end
18+
end
19+
end
20+
end

test/iruby/session_adapter/rbczmq_adapter_test.rb

+22-20
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,36 @@
22
require 'iruby'
33

44
module IRubyTest
5-
class RbczmqAdapterTest < SessionAdapterTestBase
6-
def adapter_class
7-
IRuby::SessionAdapter::RbczmqAdapter
8-
end
5+
if ENV['IRUBY_TEST_SESSION_ADAPTER_NAME'] == 'rbczmq'
6+
class RbczmqAdapterTest < SessionAdapterTestBase
7+
def adapter_class
8+
IRuby::SessionAdapter::RbczmqAdapter
9+
end
910

10-
def test_send
11-
dummy_message = MiniTest::Mock.new.expect(:called!, true)
11+
def test_send
12+
dummy_message = MiniTest::Mock.new.expect(:called!, true)
1213

13-
dummy_socket = MiniTest::Mock.new.expect(:send_message, nil, [dummy_message])
14+
dummy_socket = MiniTest::Mock.new.expect(:send_message, nil, [dummy_message])
1415

15-
ZMQ.stub(:Message, ->(message) { message.called!; message }) do
16-
@session_adapter.send(dummy_socket, dummy_message)
17-
end
16+
ZMQ.stub(:Message, ->(message) { message.called!; message }) do
17+
@session_adapter.send(dummy_socket, dummy_message)
18+
end
1819

19-
assert(dummy_message.verify)
20-
assert(dummy_socket.verify)
21-
end
20+
assert(dummy_message.verify)
21+
assert(dummy_socket.verify)
22+
end
2223

23-
def test_recv
24-
dummy_message = MiniTest::Mock.new
25-
dummy_message.expect(:equal?, true, [dummy_message])
24+
def test_recv
25+
dummy_message = MiniTest::Mock.new
26+
dummy_message.expect(:equal?, true, [dummy_message])
2627

27-
dummy_socket = MiniTest::Mock.new.expect(:recv_message, dummy_message)
28+
dummy_socket = MiniTest::Mock.new.expect(:recv_message, dummy_message)
2829

29-
assert_same(dummy_message, @session_adapter.recv(dummy_socket))
30+
assert_same(dummy_message, @session_adapter.recv(dummy_socket))
3031

31-
assert(dummy_message.verify)
32-
assert(dummy_socket.verify)
32+
assert(dummy_message.verify)
33+
assert(dummy_socket.verify)
34+
end
3335
end
3436
end
3537
end

test/iruby/session_test.rb

+31-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,37 @@
33
module IRubyTest
44
class SessionAdapterSelectionTest < TestBase
55
def setup
6-
@session_config = {}
6+
# https://jupyter-client.readthedocs.io/en/stable/kernels.html#connection-files
7+
@session_config = {
8+
"control_port" => 0,
9+
"shell_port" => 0,
10+
"transport" => "tcp",
11+
"signature_scheme" => "hmac-sha256",
12+
"stdin_port" => 0,
13+
"hb_port" => 0,
14+
"ip" => "127.0.0.1",
15+
"iopub_port" => 0,
16+
"key" => "a0436f6c-1916-498b-8eb9-e81ab9368e84"
17+
}
18+
end
19+
20+
def test_new_with_session_adapter
21+
adapter_name = ENV['IRUBY_TEST_SESSION_ADAPTER_NAME']
22+
adapter_class = case adapter_name
23+
when 'cztop'
24+
IRuby::SessionAdapter::CztopAdapter
25+
when 'rbczmq'
26+
IRuby::SessionAdapter::RbczmqAdapter
27+
when 'ffi-rzmq'
28+
IRuby::SessionAdapter::FfirzmqAdapter
29+
when 'pyzmq'
30+
IRuby::SessionAdapter::PyzmqAdapter
31+
else
32+
flunk "Unknown session adapter: #{adapter_name}"
33+
end
34+
35+
session = IRuby::Session.new(@session_config, adapter_name)
36+
assert_kind_of(adapter_class, session.adapter)
737
end
838

939
def test_without_any_session_adapter

0 commit comments

Comments
 (0)