mdp 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,43 @@
1
+ #ifndef MAJORDOMO_WORKER_H
2
+ #define MAJORDOMO_WORKER_H
3
+
4
+ typedef struct {
5
+ mdp_worker_t *worker;
6
+ VALUE broker;
7
+ VALUE service;
8
+ VALUE heartbeat;
9
+ VALUE reconnect;
10
+ #ifndef HAVE_RB_THREAD_BLOCKING_REGION
11
+ zlist_t *recv_buffer;
12
+ #endif
13
+ } rb_majordomo_worker_t;
14
+
15
+ #define MAJORDOMO_WORKER_HEARTBEAT 2500
16
+ #define MAJORDOMO_WORKER_RECONNECT 2500
17
+
18
+ #define GetMajordomoWorker(obj) \
19
+ rb_majordomo_worker_t *worker = NULL; \
20
+ Data_Get_Struct(obj, rb_majordomo_worker_t, worker); \
21
+ if (!worker) rb_raise(rb_eTypeError, "uninitialized Majordomo worker!"); \
22
+ if (!worker->worker) rb_raise(rb_eRuntimeError, "Majordomo worker has already been closed!");
23
+
24
+ struct nogvl_md_worker_new_args {
25
+ char *broker;
26
+ char *service;
27
+ int verbose;
28
+ };
29
+
30
+ struct nogvl_md_worker_recv_args {
31
+ rb_majordomo_worker_t *worker;
32
+ zframe_t *reply;
33
+ };
34
+
35
+ struct nogvl_md_worker_send_args {
36
+ mdp_worker_t *worker;
37
+ zmsg_t *progress;
38
+ zframe_t *reply_to;
39
+ };
40
+
41
+ void _init_majordomo_worker();
42
+
43
+ #endif
@@ -0,0 +1,8 @@
1
+ # encoding: utf-8
2
+
3
+ # Prefer compiled Rubinius bytecode in .rbx/
4
+ ENV["RBXOPT"] = "-Xrbc.db"
5
+
6
+ require "majordomo_ext"
7
+
8
+ require 'majordomo/version' unless defined? Majordomo::VERSION
@@ -0,0 +1,3 @@
1
+ module Majordomo
2
+ VERSION = '0.1'
3
+ end
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+
3
+ require File.expand_path('../lib/majordomo/version', __FILE__)
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "mdp"
7
+ s.version = Majordomo::VERSION
8
+ s.summary = "Majordomo for Ruby"
9
+ s.description = "Majordomo - A Ruby binding for libmdp (Majordomo implementation in C)"
10
+ s.authors = ["Lourens Naudé"]
11
+ s.email = ["lourens@methodmissing.com"]
12
+ s.homepage = "http://github.com/methodmissing/majordomo"
13
+ s.date = Time.now.utc.strftime('%Y-%m-%d')
14
+ s.platform = Gem::Platform::RUBY
15
+ s.extensions = "ext/majordomo/extconf.rb"
16
+ s.has_rdoc = true
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files test`.split("\n")
19
+ s.rdoc_options = ["--charset=UTF-8"]
20
+ s.require_paths = ["lib"]
21
+ s.add_development_dependency('rake-compiler', '~> 0.8.0')
22
+ end
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+
3
+ require 'test/unit'
4
+ require 'majordomo'
5
+
6
+ class MajordomoTestCase < Test::Unit::TestCase
7
+ undef_method :default_test if method_defined? :default_test
8
+
9
+ BROKER = "tcp://localhost:5555"
10
+
11
+ if ENV['STRESS_GC']
12
+ def setup
13
+ GC.stress = true
14
+ end
15
+
16
+ def teardown
17
+ GC.stress = false
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,51 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), 'helper')
4
+
5
+ class TestClient < MajordomoTestCase
6
+ def test_init
7
+ client = Majordomo::Client.new(BROKER)
8
+ assert_instance_of Majordomo::Client, client
9
+ client.close
10
+
11
+ assert_raises TypeError do
12
+ Majordomo::Client.new(:invalid)
13
+ end
14
+
15
+ client = Majordomo::Client.new(BROKER, true)
16
+ ensure
17
+ client.close
18
+ end
19
+
20
+ def test_broker
21
+ client = Majordomo::Client.new(BROKER)
22
+ assert_equal BROKER, client.broker
23
+ ensure
24
+ client.close
25
+ end
26
+
27
+ def test_timeout
28
+ client = Majordomo::Client.new(BROKER)
29
+ assert_equal 2500, client.timeout
30
+ client.timeout = 1000
31
+ assert_equal 1000, client.timeout
32
+ ensure
33
+ client.close
34
+ end
35
+
36
+ def test_close
37
+ client = Majordomo::Client.new(BROKER)
38
+ assert_nil client.close
39
+ assert_raises RuntimeError do
40
+ client.timeout
41
+ end
42
+ end
43
+
44
+ def test_send
45
+ client = Majordomo::Client.new(BROKER, true)
46
+ client.timeout = 100;
47
+ assert client.send("test", "message")
48
+ ensure
49
+ client.close
50
+ end
51
+ end
@@ -0,0 +1,32 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), 'helper')
4
+
5
+ class TestThreading < MajordomoTestCase
6
+ def test_send_recv
7
+ threads = []
8
+ req_received, rep_received = 0, 0
9
+ threads << Thread.new do
10
+ client = Majordomo::Client.new(BROKER, true)
11
+ client.timeout = 100
12
+ 100.times do
13
+ client.send("thread_test", "ping")
14
+ reply = client.recv("thread_test")
15
+ rep_received += 1 if reply
16
+ end
17
+ end
18
+
19
+ threads << Thread.new do
20
+ worker = Majordomo::Worker.new(BROKER, "thread_test", true)
21
+ 100.times do
22
+ request, reply_to = worker.recv
23
+ req_received += 1 if request
24
+ worker.send("pong", reply_to)
25
+ end
26
+ end
27
+
28
+ threads.map(&:join)
29
+ assert_equal req_received, 100
30
+ assert_equal rep_received, 100
31
+ end
32
+ end
@@ -0,0 +1,86 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), 'helper')
4
+
5
+ class TestWorker < MajordomoTestCase
6
+ def test_init
7
+ worker = Majordomo::Worker.new(BROKER, "test_init")
8
+ assert_instance_of Majordomo::Worker, worker
9
+ worker.close
10
+
11
+ assert_raises TypeError do
12
+ Majordomo::Worker.new(:invalid, "test")
13
+ end
14
+
15
+ assert_raises TypeError do
16
+ Majordomo::Worker.new(BROKER, :invalid)
17
+ end
18
+
19
+ worker = Majordomo::Worker.new(BROKER, "test", true)
20
+ ensure
21
+ worker.close
22
+ end
23
+
24
+ def test_broker
25
+ worker = Majordomo::Worker.new(BROKER, "test")
26
+ assert_equal BROKER, worker.broker
27
+ ensure
28
+ worker.close
29
+ end
30
+
31
+ def test_service
32
+ service = "test_service"
33
+ worker = Majordomo::Worker.new(BROKER, service)
34
+ assert_equal service, worker.service
35
+ ensure
36
+ worker.close
37
+ end
38
+
39
+ def test_heartbeat
40
+ worker = Majordomo::Worker.new(BROKER, "test_heartbeat")
41
+ assert_equal 2500, worker.heartbeat
42
+ worker.heartbeat = 100
43
+ assert_equal 100, worker.heartbeat
44
+ ensure
45
+ worker.close
46
+ end
47
+
48
+ def test_reconnect
49
+ worker = Majordomo::Worker.new(BROKER, "test_reconnect")
50
+ assert_equal 2500, worker.reconnect
51
+ worker.reconnect = 100
52
+ assert_equal 100, worker.reconnect
53
+ ensure
54
+ worker.close
55
+ end
56
+
57
+ def test_close
58
+ worker = Majordomo::Worker.new(BROKER, "test_close")
59
+ assert_nil worker.close
60
+
61
+ assert_raises RuntimeError do
62
+ worker.reconnect
63
+ end
64
+ end
65
+
66
+ def test_recv
67
+ service = "test_revc"
68
+ worker = Majordomo::Worker.new(BROKER, service, true)
69
+ worker.heartbeat = 100
70
+ worker.reconnect = 100
71
+
72
+ client = Majordomo::Client.new(BROKER, true)
73
+ client.timeout = 100
74
+ assert client.send service, "request"
75
+
76
+ request = worker.recv
77
+ assert_instance_of Array, request
78
+ assert_equal "request", request[0]
79
+
80
+ assert worker.send("reply", request[1])
81
+ assert_equal "reply", client.recv(service)
82
+ ensure
83
+ client.close
84
+ worker.close
85
+ end
86
+ end
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mdp
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Lourens Naudé
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-09-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake-compiler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.8.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 0.8.0
30
+ description: Majordomo - A Ruby binding for libmdp (Majordomo implementation in C)
31
+ email:
32
+ - lourens@methodmissing.com
33
+ executables: []
34
+ extensions:
35
+ - ext/majordomo/extconf.rb
36
+ extra_rdoc_files: []
37
+ files:
38
+ - .gitignore
39
+ - CHANGELOG.rdoc
40
+ - Gemfile
41
+ - Gemfile.lock
42
+ - README.rdoc
43
+ - Rakefile
44
+ - ext/majordomo/client.c
45
+ - ext/majordomo/client.h
46
+ - ext/majordomo/extconf.rb
47
+ - ext/majordomo/jruby.h
48
+ - ext/majordomo/majordomo_ext.c
49
+ - ext/majordomo/majordomo_ext.h
50
+ - ext/majordomo/prelude.h
51
+ - ext/majordomo/rubinius.h
52
+ - ext/majordomo/ruby18.h
53
+ - ext/majordomo/ruby19.h
54
+ - ext/majordomo/worker.c
55
+ - ext/majordomo/worker.h
56
+ - lib/majordomo.rb
57
+ - lib/majordomo/version.rb
58
+ - mdp.gemspec
59
+ - test/helper.rb
60
+ - test/test_client.rb
61
+ - test/test_threading.rb
62
+ - test/test_worker.rb
63
+ homepage: http://github.com/methodmissing/majordomo
64
+ licenses: []
65
+ post_install_message:
66
+ rdoc_options:
67
+ - --charset=UTF-8
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ! '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ requirements: []
83
+ rubyforge_project:
84
+ rubygems_version: 1.8.24
85
+ signing_key:
86
+ specification_version: 3
87
+ summary: Majordomo for Ruby
88
+ test_files:
89
+ - test/helper.rb
90
+ - test/test_client.rb
91
+ - test/test_threading.rb
92
+ - test/test_worker.rb