ruby-dbus 0.18.0.beta1 → 0.18.0.beta4
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.
- checksums.yaml +4 -4
- data/NEWS.md +33 -0
- data/VERSION +1 -1
- data/doc/Reference.md +1 -1
- data/examples/service/complex-property.rb +21 -0
- data/lib/dbus/data.rb +744 -0
- data/lib/dbus/introspect.rb +1 -0
- data/lib/dbus/marshall.rb +172 -259
- data/lib/dbus/message.rb +4 -10
- data/lib/dbus/object.rb +11 -11
- data/lib/dbus/object_path.rb +2 -1
- data/lib/dbus/raw_message.rb +91 -0
- data/lib/dbus/type.rb +147 -70
- data/lib/dbus.rb +6 -0
- data/spec/data/marshall.yaml +1667 -0
- data/spec/data_spec.rb +353 -0
- data/spec/object_path_spec.rb +1 -0
- data/spec/packet_marshaller_spec.rb +41 -0
- data/spec/packet_unmarshaller_spec.rb +262 -0
- data/spec/property_spec.rb +80 -2
- data/spec/service_newapi.rb +19 -1
- data/spec/spec_helper.rb +14 -0
- data/spec/type_spec.rb +67 -6
- data/spec/zzz_quit_spec.rb +16 -0
- metadata +10 -2
data/spec/property_spec.rb
CHANGED
@@ -4,6 +4,14 @@
|
|
4
4
|
require_relative "spec_helper"
|
5
5
|
require "dbus"
|
6
6
|
|
7
|
+
# FIXME: factor out DBus::TestFixtures::Value in spec_helper
|
8
|
+
require "ostruct"
|
9
|
+
require "yaml"
|
10
|
+
|
11
|
+
data_dir = File.expand_path("data", __dir__)
|
12
|
+
marshall_yaml_s = File.read("#{data_dir}/marshall.yaml")
|
13
|
+
marshall_yaml = YAML.safe_load(marshall_yaml_s)
|
14
|
+
|
7
15
|
describe "PropertyTest" do
|
8
16
|
before(:each) do
|
9
17
|
@session_bus = DBus::ASessionBus.new
|
@@ -52,7 +60,7 @@ describe "PropertyTest" do
|
|
52
60
|
|
53
61
|
it "tests get all" do
|
54
62
|
all = @iface.all_properties
|
55
|
-
expect(all.keys.sort).to eq(["MyStruct", "ReadMe", "ReadOrWriteMe"])
|
63
|
+
expect(all.keys.sort).to eq(["MyArray", "MyDict", "MyStruct", "MyVariant", "ReadMe", "ReadOrWriteMe"])
|
56
64
|
end
|
57
65
|
|
58
66
|
it "tests get all on a V1 object" do
|
@@ -60,7 +68,7 @@ describe "PropertyTest" do
|
|
60
68
|
iface = obj["org.ruby.SampleInterface"]
|
61
69
|
|
62
70
|
all = iface.all_properties
|
63
|
-
expect(all.keys.sort).to eq(["MyStruct", "ReadMe", "ReadOrWriteMe"])
|
71
|
+
expect(all.keys.sort).to eq(["MyArray", "MyDict", "MyStruct", "MyVariant", "ReadMe", "ReadOrWriteMe"])
|
64
72
|
end
|
65
73
|
|
66
74
|
it "tests unknown property reading" do
|
@@ -122,5 +130,75 @@ describe "PropertyTest" do
|
|
122
130
|
struct = @iface["MyStruct"]
|
123
131
|
expect(struct).to be_frozen
|
124
132
|
end
|
133
|
+
|
134
|
+
it "Get returns the correctly typed value (check with dbus-send)" do
|
135
|
+
# As big as the DBus::Data branch is,
|
136
|
+
# it still does not handle the :exact mode on the client/proxy side.
|
137
|
+
# So we resort to parsing dbus-send output.
|
138
|
+
cmd = "dbus-send --print-reply " \
|
139
|
+
"--dest=org.ruby.service " \
|
140
|
+
"/org/ruby/MyInstance " \
|
141
|
+
"org.freedesktop.DBus.Properties.Get " \
|
142
|
+
"string:org.ruby.SampleInterface " \
|
143
|
+
"string:MyStruct"
|
144
|
+
reply = `#{cmd}`
|
145
|
+
expect(reply).to match(/variant\s+struct {\s+string "three"\s+string "strings"\s+string "in a struct"\s+}/)
|
146
|
+
end
|
147
|
+
|
148
|
+
it "GetAll returns the correctly typed value (check with dbus-send)" do
|
149
|
+
cmd = "dbus-send --print-reply " \
|
150
|
+
"--dest=org.ruby.service " \
|
151
|
+
"/org/ruby/MyInstance " \
|
152
|
+
"org.freedesktop.DBus.Properties.GetAll " \
|
153
|
+
"string:org.ruby.SampleInterface "
|
154
|
+
reply = `#{cmd}`
|
155
|
+
expect(reply).to match(/variant\s+struct {\s+string "three"\s+string "strings"\s+string "in a struct"\s+}/)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
context "an array-typed property" do
|
160
|
+
it "gets read as an array" do
|
161
|
+
val = @iface["MyArray"]
|
162
|
+
expect(val).to eq([42, 43])
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
context "an dict-typed property" do
|
167
|
+
it "gets read as a hash" do
|
168
|
+
val = @iface["MyDict"]
|
169
|
+
expect(val).to eq({
|
170
|
+
"one" => 1,
|
171
|
+
"two" => "dva",
|
172
|
+
"three" => [3, 3, 3]
|
173
|
+
})
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
context "a variant-typed property" do
|
178
|
+
it "gets read at all" do
|
179
|
+
obj = @svc.object("/org/ruby/MyDerivedInstance")
|
180
|
+
iface = obj["org.ruby.SampleInterface"]
|
181
|
+
val = iface["MyVariant"]
|
182
|
+
expect(val).to eq([42, 43])
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
context "marshall.yaml round-trip via a VARIANT property" do
|
187
|
+
marshall_yaml.each do |test|
|
188
|
+
t = OpenStruct.new(test)
|
189
|
+
next if t.val.nil?
|
190
|
+
|
191
|
+
# Round trips do not work yet because the properties
|
192
|
+
# must present a plain Ruby value so the exact D-Bus type is lost.
|
193
|
+
# Round trips will work once users can declare accepting DBus::Data
|
194
|
+
# in properties and method arguments.
|
195
|
+
it "Sets #{t.sig.inspect}:#{t.val.inspect} and Gets something back" do
|
196
|
+
before = DBus::Data.make_typed(t.sig, t.val)
|
197
|
+
expect { @iface["MyVariant"] = before }.to_not raise_error
|
198
|
+
expect { _after = @iface["MyVariant"] }.to_not raise_error
|
199
|
+
# round-trip:
|
200
|
+
# expect(after).to eq(before.value)
|
201
|
+
end
|
202
|
+
end
|
125
203
|
end
|
126
204
|
end
|
data/spec/service_newapi.rb
CHANGED
@@ -13,16 +13,30 @@ PROPERTY_INTERFACE = "org.freedesktop.DBus.Properties"
|
|
13
13
|
class Test < DBus::Object
|
14
14
|
Point2D = Struct.new(:x, :y)
|
15
15
|
|
16
|
+
attr_writer :main_loop
|
17
|
+
|
16
18
|
INTERFACE = "org.ruby.SampleInterface"
|
17
19
|
def initialize(path)
|
18
20
|
super path
|
19
21
|
@read_me = "READ ME"
|
20
22
|
@read_or_write_me = "READ OR WRITE ME"
|
21
23
|
@my_struct = ["three", "strings", "in a struct"].freeze
|
24
|
+
@my_array = [42, 43]
|
25
|
+
@my_dict = {
|
26
|
+
"one" => 1,
|
27
|
+
"two" => "dva",
|
28
|
+
"three" => [3, 3, 3]
|
29
|
+
}
|
30
|
+
@my_variant = @my_array.dup
|
31
|
+
@main_loop = nil
|
22
32
|
end
|
23
33
|
|
24
34
|
# Create an interface aggregating all upcoming dbus_method defines.
|
25
35
|
dbus_interface INTERFACE do
|
36
|
+
dbus_method :quit, "" do
|
37
|
+
@main_loop&.quit
|
38
|
+
end
|
39
|
+
|
26
40
|
dbus_method :hello, "in name:s, in name2:s" do |name, name2|
|
27
41
|
puts "hello(#{name}, #{name2})"
|
28
42
|
end
|
@@ -93,7 +107,10 @@ class Test < DBus::Object
|
|
93
107
|
end
|
94
108
|
dbus_reader :explosive, "s"
|
95
109
|
|
96
|
-
|
110
|
+
dbus_attr_accessor :my_struct, "(sss)"
|
111
|
+
dbus_attr_accessor :my_array, "aq"
|
112
|
+
dbus_attr_accessor :my_dict, "a{sv}"
|
113
|
+
dbus_attr_accessor :my_variant, "v"
|
97
114
|
end
|
98
115
|
|
99
116
|
# closing and reopening the same interface
|
@@ -193,6 +210,7 @@ end
|
|
193
210
|
puts "listening, with ruby-#{RUBY_VERSION}"
|
194
211
|
main = DBus::Main.new
|
195
212
|
main << bus
|
213
|
+
myobj.main_loop = main
|
196
214
|
begin
|
197
215
|
main.run
|
198
216
|
rescue SystemCallError
|
data/spec/spec_helper.rb
CHANGED
@@ -15,6 +15,8 @@ if coverage
|
|
15
15
|
SimpleCov.add_filter "_spec.rb"
|
16
16
|
# do not cover the activesupport helpers
|
17
17
|
SimpleCov.add_filter "/core_ext/"
|
18
|
+
# measure all if/else branches on a line
|
19
|
+
SimpleCov.enable_coverage :branch
|
18
20
|
|
19
21
|
SimpleCov.start
|
20
22
|
|
@@ -118,3 +120,15 @@ def with_service_by_activation(&block)
|
|
118
120
|
|
119
121
|
system "pkill -f #{exec}"
|
120
122
|
end
|
123
|
+
|
124
|
+
# Make a binary string from readable YAML pieces; see data/marshall.yaml
|
125
|
+
def buffer_from_yaml(parts)
|
126
|
+
strings = parts.flatten.map do |part|
|
127
|
+
if part.is_a? Integer
|
128
|
+
part.chr
|
129
|
+
else
|
130
|
+
part
|
131
|
+
end
|
132
|
+
end
|
133
|
+
strings.join.force_encoding(Encoding::BINARY)
|
134
|
+
end
|
data/spec/type_spec.rb
CHANGED
@@ -6,15 +6,76 @@ require "dbus"
|
|
6
6
|
|
7
7
|
describe DBus do
|
8
8
|
describe ".type" do
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
good = [
|
10
|
+
"i",
|
11
|
+
"ai",
|
12
|
+
"a(ii)",
|
13
|
+
"aai"
|
14
|
+
]
|
15
|
+
|
16
|
+
context "valid single types" do
|
17
|
+
good.each do |s|
|
18
|
+
it "#{s.inspect} is parsed" do
|
19
|
+
expect(DBus.type(s).to_s).to eq(s)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
bad = [
|
25
|
+
["\x00", "Unknown type code"],
|
26
|
+
["!", "Unknown type code"],
|
27
|
+
|
28
|
+
# ARRAY related
|
29
|
+
["a", "Empty ARRAY"],
|
30
|
+
["aa", "Empty ARRAY"],
|
31
|
+
|
32
|
+
# STRUCT related
|
33
|
+
["r", "Abstract STRUCT"],
|
34
|
+
["()", "Empty STRUCT"],
|
35
|
+
["(ii", "STRUCT not closed"],
|
36
|
+
["a{i)", "STRUCT unexpectedly closed"],
|
37
|
+
|
38
|
+
# TODO: deep nesting arrays, structs, combined
|
39
|
+
|
40
|
+
# DICT_ENTRY related
|
41
|
+
["e", "Abstract DICT_ENTRY"],
|
42
|
+
["a{}", "DICT_ENTRY must have 2 subtypes, found 0"],
|
43
|
+
["a{s}", "DICT_ENTRY must have 2 subtypes, found 1"],
|
44
|
+
["a{sss}", "DICT_ENTRY must have 2 subtypes, found 3"],
|
45
|
+
["a{vs}", "DICT_ENTRY key must be basic (non-container)"],
|
46
|
+
["{sv}", "DICT_ENTRY not an immediate child of an ARRAY"],
|
47
|
+
["a({sv})", "DICT_ENTRY not an immediate child of an ARRAY"],
|
48
|
+
["a{sv", "DICT_ENTRY not closed"],
|
49
|
+
["}", "DICT_ENTRY unexpectedly closed"],
|
50
|
+
|
51
|
+
# Too long
|
52
|
+
["(#{"y" * 254})", "longer than 255"],
|
53
|
+
|
54
|
+
# not Single Complete Types
|
55
|
+
["", "expecting a Single Complete Type"],
|
56
|
+
["ii", "more than a Single Complete Type"]
|
57
|
+
]
|
58
|
+
context "invalid single types" do
|
59
|
+
bad.each.each do |s, msg|
|
60
|
+
it "#{s.inspect} raises an exception mentioning: #{msg}" do
|
61
|
+
rx = Regexp.new(Regexp.quote(msg))
|
62
|
+
expect { DBus.type(s) }.to raise_error(DBus::Type::SignatureException, rx)
|
63
|
+
end
|
12
64
|
end
|
13
65
|
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe ".types" do
|
69
|
+
good = [
|
70
|
+
"",
|
71
|
+
"ii"
|
72
|
+
]
|
14
73
|
|
15
|
-
|
16
|
-
|
17
|
-
|
74
|
+
context "valid signatures" do
|
75
|
+
good.each do |s|
|
76
|
+
it "#{s.inspect} is parsed" do
|
77
|
+
expect(DBus.types(s).map(&:to_s).join).to eq(s)
|
78
|
+
end
|
18
79
|
end
|
19
80
|
end
|
20
81
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env rspec
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require_relative "spec_helper"
|
5
|
+
require "dbus"
|
6
|
+
|
7
|
+
describe "Quit the service" do
|
8
|
+
it "Tells the service to quit and waits, to collate coverage data" do
|
9
|
+
session_bus = DBus::ASessionBus.new
|
10
|
+
@svc = session_bus.service("org.ruby.service")
|
11
|
+
@obj = @svc.object("/org/ruby/MyInstance")
|
12
|
+
@obj.default_iface = "org.ruby.SampleInterface"
|
13
|
+
@obj.quit
|
14
|
+
sleep 3
|
15
|
+
end
|
16
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-dbus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.18.0.
|
4
|
+
version: 0.18.0.beta4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ruby DBus Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rexml
|
@@ -131,6 +131,7 @@ files:
|
|
131
131
|
- examples/no-introspect/tracker-test.rb
|
132
132
|
- examples/rhythmbox/playpause.rb
|
133
133
|
- examples/service/call_service.rb
|
134
|
+
- examples/service/complex-property.rb
|
134
135
|
- examples/service/service_newapi.rb
|
135
136
|
- examples/simple/call_introspect.rb
|
136
137
|
- examples/simple/get_id.rb
|
@@ -144,6 +145,7 @@ files:
|
|
144
145
|
- lib/dbus/bus_name.rb
|
145
146
|
- lib/dbus/core_ext/class/attribute.rb
|
146
147
|
- lib/dbus/core_ext/module/redefine_method.rb
|
148
|
+
- lib/dbus/data.rb
|
147
149
|
- lib/dbus/error.rb
|
148
150
|
- lib/dbus/introspect.rb
|
149
151
|
- lib/dbus/logger.rb
|
@@ -156,6 +158,7 @@ files:
|
|
156
158
|
- lib/dbus/proxy_object.rb
|
157
159
|
- lib/dbus/proxy_object_factory.rb
|
158
160
|
- lib/dbus/proxy_object_interface.rb
|
161
|
+
- lib/dbus/raw_message.rb
|
159
162
|
- lib/dbus/type.rb
|
160
163
|
- lib/dbus/xml.rb
|
161
164
|
- ruby-dbus.gemspec
|
@@ -167,12 +170,16 @@ files:
|
|
167
170
|
- spec/bus_spec.rb
|
168
171
|
- spec/byte_array_spec.rb
|
169
172
|
- spec/client_robustness_spec.rb
|
173
|
+
- spec/data/marshall.yaml
|
174
|
+
- spec/data_spec.rb
|
170
175
|
- spec/err_msg_spec.rb
|
171
176
|
- spec/introspect_xml_parser_spec.rb
|
172
177
|
- spec/introspection_spec.rb
|
173
178
|
- spec/main_loop_spec.rb
|
174
179
|
- spec/node_spec.rb
|
175
180
|
- spec/object_path_spec.rb
|
181
|
+
- spec/packet_marshaller_spec.rb
|
182
|
+
- spec/packet_unmarshaller_spec.rb
|
176
183
|
- spec/property_spec.rb
|
177
184
|
- spec/proxy_object_spec.rb
|
178
185
|
- spec/server_robustness_spec.rb
|
@@ -190,6 +197,7 @@ files:
|
|
190
197
|
- spec/type_spec.rb
|
191
198
|
- spec/value_spec.rb
|
192
199
|
- spec/variant_spec.rb
|
200
|
+
- spec/zzz_quit_spec.rb
|
193
201
|
homepage: https://github.com/mvidner/ruby-dbus
|
194
202
|
licenses:
|
195
203
|
- LGPL-2.1
|