circus-deployment 0.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.
- data/LICENSE +23 -0
- data/README.md +0 -0
- data/bin/circus +24 -0
- data/lib/bundler/circus_bundler.rb +24 -0
- data/lib/bundler/circus_util.rb +43 -0
- data/lib/bundler/patches.rb +18 -0
- data/lib/circus/act.rb +74 -0
- data/lib/circus/actstore_client.rb +30 -0
- data/lib/circus/agents/agent.rb +59 -0
- data/lib/circus/agents/client.rb +77 -0
- data/lib/circus/agents/connection.rb +76 -0
- data/lib/circus/agents/conversation.rb +17 -0
- data/lib/circus/agents/dbus_connection.rb +85 -0
- data/lib/circus/agents/dbus_logger.rb +34 -0
- data/lib/circus/agents/encoding.rb +32 -0
- data/lib/circus/agents/logger.rb +52 -0
- data/lib/circus/agents/params.rb +47 -0
- data/lib/circus/agents/ssh_connection.rb +120 -0
- data/lib/circus/application.rb +99 -0
- data/lib/circus/booth_client.rb +25 -0
- data/lib/circus/booth_tool.rb +98 -0
- data/lib/circus/cli.rb +147 -0
- data/lib/circus/clown_client.rb +27 -0
- data/lib/circus/connection_builder.rb +32 -0
- data/lib/circus/external_util.rb +14 -0
- data/lib/circus/local_config.rb +65 -0
- data/lib/circus/profiles/base.rb +115 -0
- data/lib/circus/profiles/django.rb +90 -0
- data/lib/circus/profiles/jekyll.rb +90 -0
- data/lib/circus/profiles/make_base.rb +17 -0
- data/lib/circus/profiles/pure_py.rb +46 -0
- data/lib/circus/profiles/pure_rb.rb +48 -0
- data/lib/circus/profiles/python_base.rb +39 -0
- data/lib/circus/profiles/rack.rb +59 -0
- data/lib/circus/profiles/ruby_base.rb +52 -0
- data/lib/circus/profiles/shell.rb +46 -0
- data/lib/circus/profiles.rb +10 -0
- data/lib/circus/repos/git.rb +42 -0
- data/lib/circus/repos/mercurial.rb +42 -0
- data/lib/circus/repos.rb +16 -0
- data/lib/circus/resource_allocator_client.rb +19 -0
- data/lib/circus/stdout_logger.rb +11 -0
- data/lib/circus/version.rb +3 -0
- data/lib/circus.rb +9 -0
- data/vendor/ruby-dbus/COPYING +504 -0
- data/vendor/ruby-dbus/ChangeLog +782 -0
- data/vendor/ruby-dbus/HOWTO-RELEASE +14 -0
- data/vendor/ruby-dbus/NEWS +104 -0
- data/vendor/ruby-dbus/README +53 -0
- data/vendor/ruby-dbus/Rakefile +47 -0
- data/vendor/ruby-dbus/doc/tutorial/src/00.index.page +12 -0
- data/vendor/ruby-dbus/doc/tutorial/src/10.intro.page +127 -0
- data/vendor/ruby-dbus/doc/tutorial/src/20.basic_client.page +174 -0
- data/vendor/ruby-dbus/doc/tutorial/src/30.service.page +121 -0
- data/vendor/ruby-dbus/doc/tutorial/src/default.css +129 -0
- data/vendor/ruby-dbus/doc/tutorial/src/default.template +46 -0
- data/vendor/ruby-dbus/examples/gdbus/gdbus +255 -0
- data/vendor/ruby-dbus/examples/gdbus/gdbus.glade +184 -0
- data/vendor/ruby-dbus/examples/gdbus/launch.sh +4 -0
- data/vendor/ruby-dbus/examples/no-introspect/nm-test.rb +21 -0
- data/vendor/ruby-dbus/examples/no-introspect/tracker-test.rb +16 -0
- data/vendor/ruby-dbus/examples/rhythmbox/playpause.rb +25 -0
- data/vendor/ruby-dbus/examples/service/call_service.rb +25 -0
- data/vendor/ruby-dbus/examples/service/service_newapi.rb +51 -0
- data/vendor/ruby-dbus/examples/simple/call_introspect.rb +34 -0
- data/vendor/ruby-dbus/examples/utils/listnames.rb +11 -0
- data/vendor/ruby-dbus/examples/utils/notify.rb +19 -0
- data/vendor/ruby-dbus/lib/dbus/auth.rb +156 -0
- data/vendor/ruby-dbus/lib/dbus/bus.rb +750 -0
- data/vendor/ruby-dbus/lib/dbus/export.rb +133 -0
- data/vendor/ruby-dbus/lib/dbus/introspect.rb +544 -0
- data/vendor/ruby-dbus/lib/dbus/marshall.rb +443 -0
- data/vendor/ruby-dbus/lib/dbus/matchrule.rb +100 -0
- data/vendor/ruby-dbus/lib/dbus/message.rb +293 -0
- data/vendor/ruby-dbus/lib/dbus/type.rb +222 -0
- data/vendor/ruby-dbus/lib/dbus.rb +89 -0
- data/vendor/ruby-dbus/ruby-dbus.gemspec +28 -0
- data/vendor/ruby-dbus/setup.rb +1585 -0
- data/vendor/ruby-dbus/test/Makefile +4 -0
- data/vendor/ruby-dbus/test/bus_driver_test.rb +21 -0
- data/vendor/ruby-dbus/test/server_robustness_test.rb +41 -0
- data/vendor/ruby-dbus/test/server_test.rb +44 -0
- data/vendor/ruby-dbus/test/service_newapi.rb +99 -0
- data/vendor/ruby-dbus/test/session_bus_test_manual.rb +20 -0
- data/vendor/ruby-dbus/test/signal_test.rb +57 -0
- data/vendor/ruby-dbus/test/t1 +4 -0
- data/vendor/ruby-dbus/test/t2.rb +66 -0
- data/vendor/ruby-dbus/test/t3-ticket27.rb +18 -0
- data/vendor/ruby-dbus/test/t5-report-dbus-interface.rb +58 -0
- data/vendor/ruby-dbus/test/t6-loop.rb +85 -0
- data/vendor/ruby-dbus/test/test_all +26 -0
- data/vendor/ruby-dbus/test/test_server +74 -0
- data/vendor/ruby-dbus/test/variant_test.rb +66 -0
- metadata +225 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# Test the methods of the bus driver
|
|
3
|
+
require "test/unit"
|
|
4
|
+
require "dbus"
|
|
5
|
+
|
|
6
|
+
def d(msg)
|
|
7
|
+
puts msg if $DEBUG
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class BusDriverTest < Test::Unit::TestCase
|
|
11
|
+
def setup
|
|
12
|
+
@bus = DBus::SessionBus.instance
|
|
13
|
+
@svc = @bus.service("org.ruby.service")
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_exists
|
|
17
|
+
assert @svc.exists?
|
|
18
|
+
nonsvc = @bus.service "org.ruby.nosuchservice"
|
|
19
|
+
assert ! nonsvc.exists?
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# Test that a server survives various error cases
|
|
3
|
+
require "test/unit"
|
|
4
|
+
require "dbus"
|
|
5
|
+
|
|
6
|
+
class ServerRobustnessTest < Test::Unit::TestCase
|
|
7
|
+
def setup
|
|
8
|
+
@bus = DBus::SessionBus.instance
|
|
9
|
+
@svc = @bus.service("org.ruby.service")
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# https://trac.luon.net/ruby-dbus/ticket/31
|
|
13
|
+
# the server should not crash
|
|
14
|
+
def test_no_such_path_with_introspection
|
|
15
|
+
obj = @svc.object "/org/ruby/NotMyInstance"
|
|
16
|
+
obj.introspect
|
|
17
|
+
assert false, "should have raised"
|
|
18
|
+
rescue DBus::Error => e
|
|
19
|
+
assert_no_match(/timeout/, e)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_no_such_path_without_introspection
|
|
23
|
+
obj = @svc.object "/org/ruby/NotMyInstance"
|
|
24
|
+
ifc = DBus::ProxyObjectInterface.new(obj, "org.ruby.SampleInterface")
|
|
25
|
+
ifc.define_method("the_answer", "out n:i")
|
|
26
|
+
ifc.the_answer
|
|
27
|
+
assert false, "should have raised"
|
|
28
|
+
rescue DBus::Error => e
|
|
29
|
+
assert_no_match(/timeout/, e)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_a_method_that_raises
|
|
33
|
+
obj = @svc.object "/org/ruby/MyInstance"
|
|
34
|
+
obj.introspect
|
|
35
|
+
obj.default_iface = "org.ruby.SampleInterface"
|
|
36
|
+
obj.will_raise
|
|
37
|
+
assert false, "should have raised"
|
|
38
|
+
rescue DBus::Error => e
|
|
39
|
+
assert_no_match(/timeout/, e)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# Test that a server survives various error cases
|
|
3
|
+
require "test/unit"
|
|
4
|
+
require "dbus"
|
|
5
|
+
|
|
6
|
+
class Foo < DBus::Object
|
|
7
|
+
dbus_interface "org.ruby.ServerTest" do
|
|
8
|
+
dbus_signal :signal_without_arguments
|
|
9
|
+
dbus_signal :signal_with_argument, "epsilon:d"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
dbus_signal :signal_without_interface
|
|
13
|
+
rescue DBus::Object::UndefinedInterface => e
|
|
14
|
+
# raised by the preceding signal declaration
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class ServerTest < Test::Unit::TestCase
|
|
18
|
+
def setup
|
|
19
|
+
@bus = DBus::SessionBus.instance
|
|
20
|
+
@svc = @bus.request_service "org.ruby.server-test"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def teardown
|
|
24
|
+
@bus.proxy.ReleaseName "org.ruby.server-test"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_unexporting_an_object
|
|
28
|
+
obj = Foo.new "/org/ruby/Foo"
|
|
29
|
+
@svc.export obj
|
|
30
|
+
assert @svc.unexport(obj)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def test_unexporting_an_object_not_exported
|
|
34
|
+
obj = Foo.new "/org/ruby/Foo"
|
|
35
|
+
assert !@svc.unexport(obj)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_emiting_signals
|
|
39
|
+
obj = Foo.new "/org/ruby/Foo"
|
|
40
|
+
@svc.export obj
|
|
41
|
+
obj.signal_without_arguments
|
|
42
|
+
obj.signal_with_argument(-0.1)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'dbus'
|
|
4
|
+
|
|
5
|
+
def d(msg)
|
|
6
|
+
puts "#{$$} #{msg}" if $DEBUG
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class Test < DBus::Object
|
|
10
|
+
# Create an interface aggregating all upcoming dbus_method defines.
|
|
11
|
+
dbus_interface "org.ruby.SampleInterface" do
|
|
12
|
+
dbus_method :hello, "in name:s, in name2:s" do |name, name2|
|
|
13
|
+
puts "hello(#{name}, #{name2})"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
dbus_method :test_variant, "in stuff:v" do |variant|
|
|
17
|
+
p variant
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
dbus_method :bounce_variant, "in stuff:v, out chaff:v" do |variant|
|
|
21
|
+
[variant]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
dbus_method :variant_size, "in stuff:v, out size:u" do |variant|
|
|
25
|
+
[variant.size]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
dbus_method :the_answer, "out answer:i" do
|
|
29
|
+
42
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
dbus_method :will_raise, "" do
|
|
33
|
+
raise "Handle this"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
dbus_signal :SomethingJustHappened, "toto:s, tutu:u"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
dbus_interface "org.ruby.AnotherInterface" do
|
|
40
|
+
dbus_method :ThatsALongMethodNameIThink do
|
|
41
|
+
puts "ThatsALongMethodNameIThink"
|
|
42
|
+
end
|
|
43
|
+
dbus_method :Reverse, "in instr:s, out outstr:s" do |instr|
|
|
44
|
+
outstr = instr.split(//).reverse.join
|
|
45
|
+
puts "got: #{instr}, replying: #{outstr}"
|
|
46
|
+
[outstr]
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
dbus_interface "org.ruby.Ticket30" do
|
|
51
|
+
dbus_method :Sybilla, 'in choices:av, out advice:s' do |choices|
|
|
52
|
+
["Do #{choices[0]}"]
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
dbus_interface "org.ruby.Loop" do
|
|
57
|
+
# starts doing something long, but returns immediately
|
|
58
|
+
# and sends a signal when done
|
|
59
|
+
dbus_method :LongTaskBegin, 'in delay:i' do |delay|
|
|
60
|
+
# FIXME did not complain about mismatch between signature and block args
|
|
61
|
+
d "Long task began"
|
|
62
|
+
task = Thread.new do
|
|
63
|
+
d "Long task thread started (#{delay}s)"
|
|
64
|
+
sleep delay
|
|
65
|
+
d "Long task will signal end"
|
|
66
|
+
self.LongTaskEnd
|
|
67
|
+
end
|
|
68
|
+
task.abort_on_exception = true # protect from test case bugs
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
dbus_signal :LongTaskEnd
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
bus = DBus::SessionBus.instance
|
|
76
|
+
service = bus.request_service("org.ruby.service")
|
|
77
|
+
myobj = Test.new("/org/ruby/MyInstance")
|
|
78
|
+
service.export(myobj)
|
|
79
|
+
|
|
80
|
+
# introspect every other connection, Ticket #34
|
|
81
|
+
# (except the one that activates us - it has already emitted
|
|
82
|
+
# NOC by the time we run this. Therefore the test for #34 will not work
|
|
83
|
+
# by running t2.rb alone, one has to run t1 before it; 'rake' does it)
|
|
84
|
+
mr = DBus::MatchRule.new.from_s "type='signal',interface='org.freedesktop.DBus',member='NameOwnerChanged'"
|
|
85
|
+
bus.add_match(mr) do |msg|
|
|
86
|
+
new_unique_name = msg.params[2]
|
|
87
|
+
unless new_unique_name.empty?
|
|
88
|
+
# puts "RRRING #{new_unique_name}"
|
|
89
|
+
bus.introspect_data(new_unique_name, "/") do
|
|
90
|
+
# ignore the result
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
puts "listening"
|
|
96
|
+
main = DBus::Main.new
|
|
97
|
+
main << bus
|
|
98
|
+
main.run
|
|
99
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
require "test/unit"
|
|
3
|
+
require "dbus"
|
|
4
|
+
|
|
5
|
+
def d(msg)
|
|
6
|
+
puts msg if $DEBUG
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class SessionBusAddressTest < Test::Unit::TestCase
|
|
10
|
+
def setup
|
|
11
|
+
# test getting the session bus address even if unset in ENV (Issue#4)
|
|
12
|
+
ENV.delete "DBUS_SESSION_BUS_ADDRESS"
|
|
13
|
+
@bus = DBus::SessionBus.instance
|
|
14
|
+
@svc = @bus.service("org.freedesktop.DBus")
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_connection
|
|
18
|
+
assert @svc.exists?
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# Test the signal handlers
|
|
3
|
+
require "test/unit"
|
|
4
|
+
require "dbus"
|
|
5
|
+
|
|
6
|
+
def d(msg)
|
|
7
|
+
puts "#{$$} #{msg}" if $DEBUG
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class SignalHandlerTest < Test::Unit::TestCase
|
|
11
|
+
def setup
|
|
12
|
+
@session_bus = DBus::SessionBus.instance
|
|
13
|
+
svc = @session_bus.service("org.ruby.service")
|
|
14
|
+
@obj = svc.object("/org/ruby/MyInstance")
|
|
15
|
+
@obj.introspect # necessary
|
|
16
|
+
@obj.default_iface = "org.ruby.Loop"
|
|
17
|
+
|
|
18
|
+
@loop = DBus::Main.new
|
|
19
|
+
@loop << @session_bus
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def teardown
|
|
23
|
+
# workaround for nonexisting remove_match
|
|
24
|
+
@session_bus.instance_variable_set(:@signal_matchrules, [])
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# testing for commit 017c83 (kkaempf)
|
|
28
|
+
def test_calling_both_handlers
|
|
29
|
+
counter = 0
|
|
30
|
+
|
|
31
|
+
@obj.on_signal "LongTaskEnd" do
|
|
32
|
+
d "+10"
|
|
33
|
+
counter += 10
|
|
34
|
+
end
|
|
35
|
+
@obj.on_signal "LongTaskEnd" do
|
|
36
|
+
d "+1"
|
|
37
|
+
counter += 1
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
d "will begin"
|
|
41
|
+
@obj.LongTaskBegin 3
|
|
42
|
+
|
|
43
|
+
quitter = Thread.new do
|
|
44
|
+
d "sleep before quit"
|
|
45
|
+
# FIXME if we sleep for too long
|
|
46
|
+
# the socket will be drained and we deadlock in a select.
|
|
47
|
+
# It could be worked around by sending ourselves a Unix signal
|
|
48
|
+
# (with a dummy handler) to interrupt the select
|
|
49
|
+
sleep 1
|
|
50
|
+
d "will quit"
|
|
51
|
+
@loop.quit
|
|
52
|
+
end
|
|
53
|
+
@loop.run
|
|
54
|
+
|
|
55
|
+
assert_equal 11, counter
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
require "test/unit"
|
|
3
|
+
require "dbus"
|
|
4
|
+
|
|
5
|
+
class ValueTest < Test::Unit::TestCase
|
|
6
|
+
def setup
|
|
7
|
+
session_bus = DBus::SessionBus.instance
|
|
8
|
+
svc = session_bus.service("org.ruby.service")
|
|
9
|
+
@obj = svc.object("/org/ruby/MyInstance")
|
|
10
|
+
@obj.introspect # necessary
|
|
11
|
+
@obj.default_iface = "org.ruby.SampleInterface"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_passing_an_array_through_a_variant
|
|
15
|
+
# old explicit typing
|
|
16
|
+
@obj.test_variant(["as", ["coucou", "kuku"]])
|
|
17
|
+
# automatic typing
|
|
18
|
+
@obj.test_variant(["coucou", "kuku"])
|
|
19
|
+
@obj.test_variant(["saint", "was that a word or a signature?"])
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_bouncing_a_variant
|
|
23
|
+
assert_equal "cuckoo", @obj.bounce_variant("cuckoo")[0]
|
|
24
|
+
assert_equal ["coucou", "kuku"], @obj.bounce_variant(["coucou", "kuku"])[0]
|
|
25
|
+
assert_equal [], @obj.bounce_variant([])[0]
|
|
26
|
+
empty_hash = {}
|
|
27
|
+
assert_equal empty_hash, @obj.bounce_variant(empty_hash)[0]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# these are ambiguous
|
|
31
|
+
def test_pairs_with_a_string
|
|
32
|
+
|
|
33
|
+
# deprecated
|
|
34
|
+
assert_equal "foo", @obj.bounce_variant(["s", "foo"])[0]
|
|
35
|
+
|
|
36
|
+
assert_equal "foo", @obj.bounce_variant(DBus.variant("s", "foo"))[0]
|
|
37
|
+
assert_equal "foo", @obj.bounce_variant([DBus.type("s"), "foo"])[0]
|
|
38
|
+
|
|
39
|
+
# does not work, because the server side forgets the explicit typing
|
|
40
|
+
# assert_equal ["s", "foo"], @obj.bounce_variant(["av", ["s", "foo"]])[0]
|
|
41
|
+
# assert_equal ["s", "foo"], @obj.bounce_variant(["as", ["s", "foo"]])[0]
|
|
42
|
+
|
|
43
|
+
# instead, use this to demonstrate that the variant is passed as expected
|
|
44
|
+
assert_equal 4, @obj.variant_size(["s", "four"])[0]
|
|
45
|
+
# "av" is the simplest thing that will work,
|
|
46
|
+
# shifting the heuristic from a pair to the individual items
|
|
47
|
+
assert_equal 2, @obj.variant_size(["av", ["s", "four"]])[0]
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_marshalling_an_array_of_variants
|
|
51
|
+
# https://trac.luon.net/ruby-dbus/ticket/30
|
|
52
|
+
@obj.default_iface = "org.ruby.Ticket30"
|
|
53
|
+
choices = []
|
|
54
|
+
choices << ['s', 'Plan A']
|
|
55
|
+
choices << ['s', 'Plan B']
|
|
56
|
+
# old explicit typing
|
|
57
|
+
assert_equal "Do Plan A", @obj.Sybilla(choices)[0]
|
|
58
|
+
# automatic typing
|
|
59
|
+
assert_equal "Do Plan A", @obj.Sybilla(["Plan A", "Plan B"])[0]
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def test_service_returning_nonarray
|
|
63
|
+
# "warning: default `to_a' will be obsolete"
|
|
64
|
+
@obj.the_answer
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# Test passing a particular struct array through a variant
|
|
3
|
+
# https://trac.luon.net/ruby-dbus/ticket/27
|
|
4
|
+
require "dbus"
|
|
5
|
+
session_bus = DBus::SessionBus.instance
|
|
6
|
+
svc = session_bus.service("org.ruby.service")
|
|
7
|
+
obj = svc.object("/org/ruby/MyInstance")
|
|
8
|
+
obj.introspect # necessary
|
|
9
|
+
obj.default_iface = "org.ruby.SampleInterface"
|
|
10
|
+
# The bug is probably alignment related so whether it triggers
|
|
11
|
+
# depends also on the combined length of service, interface,
|
|
12
|
+
# and method names. Luckily here it works out.
|
|
13
|
+
triple = ['a(uuu)', []]
|
|
14
|
+
obj.test_variant(triple)
|
|
15
|
+
quadruple = ['a(uuuu)', []] # a(uuu) works fine
|
|
16
|
+
# The bus disconnects us because of malformed message,
|
|
17
|
+
# code 12: DBUS_INVALID_TOO_MUCH_DATA
|
|
18
|
+
obj.test_variant(quadruple)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# should report it missing on org.ruby.SampleInterface
|
|
3
|
+
# (on object...) instead of on DBus::Proxy::ObjectInterface
|
|
4
|
+
require "test/unit"
|
|
5
|
+
require "dbus"
|
|
6
|
+
|
|
7
|
+
class ErrMsgTest < Test::Unit::TestCase
|
|
8
|
+
def setup
|
|
9
|
+
session_bus = DBus::SessionBus.instance
|
|
10
|
+
svc = session_bus.service("org.ruby.service")
|
|
11
|
+
@obj = svc.object("/org/ruby/MyInstance")
|
|
12
|
+
@obj.introspect # necessary
|
|
13
|
+
@obj.default_iface = "org.ruby.SampleInterface"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_report_dbus_interface
|
|
17
|
+
begin
|
|
18
|
+
@obj.NoSuchMethod
|
|
19
|
+
# a specific exception...
|
|
20
|
+
rescue NameError => e
|
|
21
|
+
# mentioning DBus and the interface
|
|
22
|
+
assert_match(/DBus interface.*#{@obj.default_iface}/, e.to_s)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_report_short_struct
|
|
27
|
+
begin
|
|
28
|
+
@obj.test_variant ["(ss)", ["too few"] ]
|
|
29
|
+
rescue DBus::TypeException => e
|
|
30
|
+
assert_match(/1 elements but type info for 2/, e.to_s)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def test_report_long_struct
|
|
35
|
+
begin
|
|
36
|
+
@obj.test_variant ["(ss)", ["a", "b", "too many"] ]
|
|
37
|
+
rescue DBus::TypeException => e
|
|
38
|
+
assert_match(/3 elements but type info for 2/, e.to_s)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_report_nil
|
|
43
|
+
nils = [
|
|
44
|
+
["(s)", [nil] ], # would get disconnected
|
|
45
|
+
["i", nil ],
|
|
46
|
+
["a{ss}", {"foo" => nil} ],
|
|
47
|
+
]
|
|
48
|
+
nils.each do |has_nil|
|
|
49
|
+
begin
|
|
50
|
+
@obj.test_variant has_nil
|
|
51
|
+
rescue DBus::TypeException => e
|
|
52
|
+
# TODO want backtrace from the perspective of the caller:
|
|
53
|
+
# rescue/reraise in send_sync?
|
|
54
|
+
assert_match(/Cannot send nil/, e.to_s)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# Test the main loop
|
|
3
|
+
require "test/unit"
|
|
4
|
+
require "dbus"
|
|
5
|
+
|
|
6
|
+
def d(msg)
|
|
7
|
+
puts "#{$$} #{msg}" if $DEBUG
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class MainLoopTest < Test::Unit::TestCase
|
|
11
|
+
def setup
|
|
12
|
+
@session_bus = DBus::SessionBus.instance
|
|
13
|
+
svc = @session_bus.service("org.ruby.service")
|
|
14
|
+
@obj = svc.object("/org/ruby/MyInstance")
|
|
15
|
+
@obj.introspect # necessary
|
|
16
|
+
@obj.default_iface = "org.ruby.Loop"
|
|
17
|
+
|
|
18
|
+
@loop = DBus::Main.new
|
|
19
|
+
@loop << @session_bus
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def teardown
|
|
23
|
+
# workaround for nonexisting remove_match
|
|
24
|
+
@session_bus.instance_variable_set(:@signal_matchrules, [])
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Hack the library internals so that there is a delay between
|
|
28
|
+
# sending a DBus call and listening for its reply, so that
|
|
29
|
+
# the bus has a chance to join the server messages and a race is reproducible
|
|
30
|
+
def call_lazily
|
|
31
|
+
class << @session_bus
|
|
32
|
+
alias :wait_for_message_orig :wait_for_message
|
|
33
|
+
def wait_for_message_lazy
|
|
34
|
+
d "I am so lazy"
|
|
35
|
+
sleep 1 # Give the server+bus a chance to join the messages
|
|
36
|
+
wait_for_message_orig
|
|
37
|
+
end
|
|
38
|
+
alias :wait_for_message :wait_for_message_lazy
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
yield
|
|
42
|
+
|
|
43
|
+
# undo
|
|
44
|
+
class << @session_bus
|
|
45
|
+
remove_method :wait_for_message
|
|
46
|
+
remove_method :wait_for_message_lazy
|
|
47
|
+
alias :wait_for_message :wait_for_message_orig
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def test_loop_quit(delay = 1)
|
|
52
|
+
@obj.on_signal "LongTaskEnd" do
|
|
53
|
+
d "Telling loop to quit"
|
|
54
|
+
@loop.quit
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
call_lazily do
|
|
58
|
+
# The method will sleep the requested amount of seconds
|
|
59
|
+
# (in another thread) before signalling LongTaskEnd
|
|
60
|
+
@obj.LongTaskBegin delay
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# this thread will make the test fail if @loop.run does not return
|
|
64
|
+
dynamite = Thread.new do
|
|
65
|
+
d "Dynamite burning"
|
|
66
|
+
sleep 2
|
|
67
|
+
d "Dynamite explodes"
|
|
68
|
+
# We need to raise in the main thread.
|
|
69
|
+
# Simply raising here means the exception is ignored
|
|
70
|
+
# (until dynamite.join which we don't call) or
|
|
71
|
+
# (if abort_on_exception is set) it terminates the whole script.
|
|
72
|
+
Thread.main.raise RuntimeError, "The main loop did not quit in time"
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
@loop.run
|
|
76
|
+
d "Defusing dynamite"
|
|
77
|
+
# if we get here, defuse the bomb
|
|
78
|
+
dynamite.exit
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# https://bugzilla.novell.com/show_bug.cgi?id=537401
|
|
82
|
+
def test_loop_drained_socket
|
|
83
|
+
test_loop_quit 0
|
|
84
|
+
end
|
|
85
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#! /bin/bash
|
|
2
|
+
# run all applicable test cases with proper setup
|
|
3
|
+
# $0 [-a: all, even failing]
|
|
4
|
+
# $0 ./a_single_testcase
|
|
5
|
+
if [ "$1" = "" ]; then
|
|
6
|
+
: ${CASES:=./t[01234-9]* ./*_test.rb}
|
|
7
|
+
elif [ "$1" = "-a" ]; then
|
|
8
|
+
: ${CASES:=./t? ./t*-* ./*_test.rb}
|
|
9
|
+
OPTS=-k
|
|
10
|
+
else
|
|
11
|
+
: ${CASES:=$@}
|
|
12
|
+
fi
|
|
13
|
+
CASES_A=($CASES) # make array
|
|
14
|
+
CASES_A=(${CASES_A[@]/*~/}) # exclude backup files
|
|
15
|
+
if ! which python >/dev/null; then
|
|
16
|
+
echo >&2 "Python not found, skipping those tests"
|
|
17
|
+
CASES_A=(${CASES_A[@]/*.py/}) # exclude python files
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
#export DBUS_VERBOSE=1
|
|
21
|
+
#export RUBYOPT="-d"
|
|
22
|
+
export RUBYOPT="$RUBYOPT -w"
|
|
23
|
+
RUBYLIB=../lib ./test_server $OPTS \
|
|
24
|
+
./service_newapi.rb \
|
|
25
|
+
-- \
|
|
26
|
+
${CASES_A[@]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#! /bin/sh
|
|
2
|
+
# A wrapper for DBus tests
|
|
3
|
+
# Sets up a private session bus and calls all its arguments in turn
|
|
4
|
+
# exiting on first failure
|
|
5
|
+
# $0 server [-k] [arg1 arg2...] -- test1 test2...
|
|
6
|
+
set -o errexit
|
|
7
|
+
|
|
8
|
+
KEEP_GOING=false
|
|
9
|
+
if [ "$1" = "-k" ]; then
|
|
10
|
+
KEEP_GOING=true
|
|
11
|
+
shift
|
|
12
|
+
fi
|
|
13
|
+
|
|
14
|
+
while [ "$1" != "--" ]; do
|
|
15
|
+
SERVER="$SERVER $1"
|
|
16
|
+
shift
|
|
17
|
+
done
|
|
18
|
+
shift # --
|
|
19
|
+
|
|
20
|
+
# This launches the bus daemon,
|
|
21
|
+
# exports DBUS_SESSION_BUS_ADDRESS and sets DBUS_SESSION_BUS_PID
|
|
22
|
+
my_dbus_launch () {
|
|
23
|
+
# reimplementing dbus-launch because it is in dbus-1-x11.rpm
|
|
24
|
+
PF=`mktemp dbus.pid.XXXXXX` || exit
|
|
25
|
+
AF=`mktemp dbus.addr.XXXXXX` || exit
|
|
26
|
+
RM_FILES="$RM_FILES $PF $AF"
|
|
27
|
+
|
|
28
|
+
dbus-daemon --session --print-address=3 3>$AF --print-pid=4 4>$PF &
|
|
29
|
+
# wait for the daemon to print the info
|
|
30
|
+
TRIES=0
|
|
31
|
+
while [ ! -s $AF -o ! -s $PF ]; do
|
|
32
|
+
sleep 0.1
|
|
33
|
+
TRIES=`expr $TRIES + 1`
|
|
34
|
+
if [ $TRIES -gt 100 ]; then echo "dbus-daemon failed?"; exit 1; fi
|
|
35
|
+
done
|
|
36
|
+
DBUS_SESSION_BUS_PID=$(cat $PF)
|
|
37
|
+
export DBUS_SESSION_BUS_ADDRESS=$(cat $AF)
|
|
38
|
+
KILLS="$KILLS $DBUS_SESSION_BUS_PID"
|
|
39
|
+
# dbus-monitor &
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
setup_activation () {
|
|
43
|
+
SDIR=$XDG_DATA_DIRS/dbus-1/services
|
|
44
|
+
mkdir -p $SDIR
|
|
45
|
+
cat <<EOF > $SDIR/test.service
|
|
46
|
+
[D-BUS Service]
|
|
47
|
+
Name=org.ruby.service
|
|
48
|
+
Exec=$SERVER
|
|
49
|
+
EOF
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
run_server () {
|
|
53
|
+
echo -n "Hey, server, get on da bus... "
|
|
54
|
+
# start the server
|
|
55
|
+
$SERVER & sleep 3
|
|
56
|
+
echo "off we go!"
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export XDG_DATA_DIRS=`mktemp -d dbus.activation.XXXXXX`
|
|
60
|
+
RM_FILES="$RM_FILES $XDG_DATA_DIRS"
|
|
61
|
+
my_dbus_launch
|
|
62
|
+
setup_activation
|
|
63
|
+
#run_server
|
|
64
|
+
|
|
65
|
+
# Clean up at exit. This will also kill the server.
|
|
66
|
+
trap "kill \$KILLS; rm -rf \$RM_FILES" EXIT TERM INT
|
|
67
|
+
|
|
68
|
+
while [ -n "$1" ]; do
|
|
69
|
+
echo Running $1
|
|
70
|
+
$1 || $KEEP_GOING
|
|
71
|
+
shift
|
|
72
|
+
done
|
|
73
|
+
|
|
74
|
+
echo Done
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# Test marshalling variants according to ruby types
|
|
3
|
+
require "test/unit"
|
|
4
|
+
require "dbus"
|
|
5
|
+
|
|
6
|
+
class VariantTest < Test::Unit::TestCase
|
|
7
|
+
def setup
|
|
8
|
+
@bus = DBus::SessionBus.instance
|
|
9
|
+
@svc = @bus.service("org.ruby.service")
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def make_variant(a)
|
|
13
|
+
DBus::PacketMarshaller.make_variant(a)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_make_variant_scalar
|
|
17
|
+
# special case: do not fail immediately, marshaller will do that
|
|
18
|
+
assert_equal ["b", nil], make_variant(nil)
|
|
19
|
+
|
|
20
|
+
assert_equal ["b", true], make_variant(true)
|
|
21
|
+
# Integers
|
|
22
|
+
# no byte
|
|
23
|
+
assert_equal ["i", 42], make_variant(42)
|
|
24
|
+
# 3_000_000_000 can be u or x.
|
|
25
|
+
# less specific test: just run it thru a loopback
|
|
26
|
+
assert_equal ["x", 3_000_000_000], make_variant(3_000_000_000)
|
|
27
|
+
assert_equal ["x", 5_000_000_000], make_variant(5_000_000_000)
|
|
28
|
+
|
|
29
|
+
assert_equal ["d", 3.14], make_variant(3.14)
|
|
30
|
+
|
|
31
|
+
assert_equal ["s", "foo"], make_variant("foo")
|
|
32
|
+
assert_equal ["s", "bar"], make_variant(:bar)
|
|
33
|
+
|
|
34
|
+
# left: strruct, array, dict
|
|
35
|
+
# object path: detect exported objects?, signature
|
|
36
|
+
|
|
37
|
+
# # by Ruby types
|
|
38
|
+
# class Foo
|
|
39
|
+
# end
|
|
40
|
+
# make_variant(Foo.new)
|
|
41
|
+
# if we don;t understand a class, the error should be informative -> new exception
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def test_make_variant_array
|
|
45
|
+
ai = [1, 2, 3]
|
|
46
|
+
# as = ["one", "two", "three"]
|
|
47
|
+
# which?
|
|
48
|
+
# assert_equal ["ai", [1, 2, 3]], make_variant(ai)
|
|
49
|
+
assert_equal ["av", [["i", 1],
|
|
50
|
+
["i", 2],
|
|
51
|
+
["i", 3]]], make_variant(ai)
|
|
52
|
+
a0 = []
|
|
53
|
+
assert_equal ["av", []], make_variant(a0)
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def test_make_variant_hash
|
|
58
|
+
h = {"k1" => "v1", "k2" => "v2"}
|
|
59
|
+
assert_equal ["a{sv}", {
|
|
60
|
+
"k1" => ["s", "v1"],
|
|
61
|
+
"k2" => ["s", "v2"],
|
|
62
|
+
}], make_variant(h)
|
|
63
|
+
h0 = {}
|
|
64
|
+
assert_equal ["a{sv}", {}], make_variant(h0)
|
|
65
|
+
end
|
|
66
|
+
end
|