merged cont.
[opensuse:yast-rest-service.git] / webyast / test / dbus_stub.rb
1 #--
2 # Webyast Webservice framework
3 #
4 # Copyright (C) 2009, 2010 Novell, Inc. 
5 #   This library is free software; you can redistribute it and/or modify
6 # it only under the terms of version 2.1 of the GNU Lesser General Public
7 # License as published by the Free Software Foundation. 
8 #
9 #   This library is distributed in the hope that it will be useful, but WITHOUT
10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 
12 # details. 
13 #
14 #   You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software 
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 #++
18
19 #
20 # dbus_stub.rb
21 #
22 # Stubs for D-Bus
23 #
24 # See http://en.opensuse.org/YaST/Web/Development/Testing/D-Bus
25 #
26 #
27 # Example usage:
28 #
29 #   # create the stub
30 #   dbus = DBusStub.new :system, "dbus.service.spec"
31 #
32 #   # create a service proxy
33 #   proxy = dbus.proxy "/path/to/service"
34 #
35 #   # add an interface to this proxy
36 #   interface = dbus.interface proxy, "dbus.service.spec.iface"
37 #
38 #   # the proxy and interface generation can be combined as
39 #
40 #   proxy,interface = dbus.proxy "/path/to/service", "dbus.service.spec.iface"
41 #
42 require 'dbus'
43
44 class DBusStub
45
46   attr_reader :bus, :service
47   
48   #
49   # Initialize the service and stub bus.service
50   #
51   #  bus: symbol identifying the bus, either ':system' or ':session'
52   #  service: string identifying the service, something like "org.freedesktop.PackageKit"
53   #
54   #
55   def initialize bus, service
56
57     # Map pathes to stubbed proxies
58     @proxies = {}
59     
60     @bus = case bus
61                    when :system: DBus::SystemBus.instance
62                    when :session: DBus::SessionBus.instance
63                    else
64                      raise "'bus' parameter must be :system or :session"
65                    end
66                    
67     @service_name = service                
68     @service = DBus::Service.new(service, @bus)
69
70     # stub:     service = system_bus.service("org.foo.bar")    
71     @bus.stubs(:service).with(service).returns(@service)
72   end
73   
74   #
75   # get a proxy for a given object path
76   #
77   # if service is given, also create the interface
78   #
79   def proxy path, service = nil
80     proxy = @proxies[path]
81     unless proxy
82       proxy = DBus::ProxyObject.new(@bus, @service_name, path)
83       
84       proxy.stubs(:dbus_stub).returns(self)
85
86       # stub:     @proxy = @service.object("/foo/bar/baz")
87       @service.stubs(:object).with(path).returns(proxy)
88       
89       @proxies[path] = proxy
90     end
91     if service
92       [proxy, self.interface(proxy,service)]
93     else
94       proxy
95     end
96   end
97   
98   #
99   # Add an interface to an existing proxy
100   #
101   def interface proxy, service
102     iface = proxy[service]
103     unless iface
104       # stub:     @proxy.introspect
105       proxy.stubs(:introspect).returns(true)
106       proxy.stubs(:has_iface?).with(service).returns(true)
107
108       #
109       # interface
110       #
111       iface = DBus::ProxyObjectInterface.new(proxy, service)
112     
113       # stub:     iface = @proxy["org.freedesktop.PackageKit"]
114       proxy[service] = iface
115     end
116     iface
117   end
118   
119 end # DBusStub