Merge lp:~eeejay/mago/dx into lp:~mago-contributors/mago/mago-1.0

Proposed by Eitan Isaacson
Status: Merged
Merged at revision: not available
Proposed branch: lp:~eeejay/mago/dx
Merge into: lp:~mago-contributors/mago/mago-1.0
Diff against target: None lines
To merge this branch: bzr merge lp:~eeejay/mago/dx
Reviewer Review Type Date Requested Status
Ubuntu Desktop Testing Contributors Pending
Review via email: mp+6157@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Javier Collado (javier.collado) wrote :

Hello Eitan,

I took a quick look at your code and run the tests to check if everything worked in my machine. Unfortunately, I had a few of problems:

- setup.py: File has to be updated to include notify-osd and indicator-applet tests.

- notify-osd: Most of the test cases failed because of screenshot differ failure. Looking at the image in the data directory and at the screenshot it seems that notify-osd draws things slightly different depending on the screen resolution, so the comparison isn't successful unless using the same screen resolution as in the original test.

- share-directory: The share directory in my installation starts with /usr/local/share and the expected shared directory starts with /usr/share so I had to change the hardcoded value to /usr/local/share to make it possible to run the tests. Anyway, I guess that the buildout changes once integrated will solve this issue.

Best regards,
    Javier

Revision history for this message
Eitan Isaacson (eeejay) wrote :

On Mon, May 4, 2009 at 5:11 PM, Javier Collado
<email address hidden> wrote:
> Hello Eitan,
>
> I took a quick look at your code and run the tests to check if everything worked in my machine. Unfortunately, I had a few of problems:
>
> - setup.py: File has to be updated to include notify-osd and indicator-applet tests.
>

Oops, I ignored the setup.py, I will update the branch with the new inclusions.

> - notify-osd: Most of the test cases failed because of screenshot differ failure. Looking at the image in the data directory and at the screenshot it seems that notify-osd draws things slightly different depending on the screen resolution, so the comparison isn't successful unless using the same screen resolution as in the original test.
>

This is a known problem. The pixmap produced depends on the
background, DPI, font and compositor used. It could be easily
collaborated by erasing the png files in the 'data' directory, and
running the suite. the suite will fail, but the next time you run it,
it will compare against new screenshots.

> - share-directory: The share directory in my installation starts with /usr/local/share and the expected shared directory starts with /usr/share so I had to change the hardcoded value to /usr/local/share to make pick it possible to run the tests. Anyway, I guess that the buildout changes once integrated will solve this issue.

That is just to pick up a random icon, it is not very important. I
chose an icon file that is likely to be in a default ubuntu-desktop
system. Anyway, yes, this should be tweaked once the buildout changes
are in trunk.

>
> Best regards,
>    Javier
> --
> https://code.launchpad.net/~eeejay/ubuntu-desktop-testing/dx/+merge/6157
> You are subscribed to branch lp:~eeejay/ubuntu-desktop-testing/dx.
>

lp:~eeejay/mago/dx updated
71. By Eitan Isaacson

added dx suites to setup.py

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added file 'desktoptesting/deskex.py'
--- desktoptesting/deskex.py 1970-01-01 00:00:00 +0000
+++ desktoptesting/deskex.py 2009-05-04 11:21:59 +0000
@@ -0,0 +1,200 @@
1from desktoptesting.gnome import Application
2from time import time, sleep
3import tempfile
4import pynotify
5import ldtp, ldtputils
6import os
7import gtk, glib
8
9try:
10 import indicate
11except ImportError:
12 indicate = None
13
14class IndicatorApplet(Application):
15 IA_TOPLEVEL = "embindicator-applet"
16 def __init__(self):
17 Application.__init__(self, 'indicator-applet')
18 self.indicators = []
19 self.server = None
20
21 def open(self):
22 pass
23
24 def add_server(self, desktop_file):
25 if not self.server:
26 try:
27 self.server = indicate.indicate_server_ref_default()
28 except AttributeError:
29 raise Exception, \
30 "no libindicate Python bindings, install python-indicate."
31 self.server.set_type("message.im")
32 self.server.set_desktop_file(desktop_file)
33 self.server.show()
34 while gtk.events_pending():
35 gtk.main_iteration()
36
37 def show_indicator(self, sender):
38 def _timeout_cb():
39 gtk.main_quit()
40 return False
41
42 indicator = indicate.IndicatorMessage()
43 indicator.set_property("subtype", "im")
44 indicator.set_property("sender", sender)
45 indicator.set_property_time("time", time())
46 pixbuf = gtk.gdk.pixbuf_new_from_file(
47 "/usr/share/icons/hicolor/22x22/apps/gnome-freecell.png")
48 indicator.set_property_icon("icon", pixbuf)
49 indicator.show()
50 self.indicators.append(indicator)
51 glib.timeout_add_seconds(1, _timeout_cb)
52 gtk.main()
53
54 def capture_applet_icon(self):
55 x, y, w, h = ldtp.getobjectsize(self.TOP_PANEL, self.IA_TOPLEVEL)
56 screeny = ldtputils.imagecapture(
57 outFile=tempfile.mktemp('.png', 'ia_'),
58 x=x, y=y, resolution1=w, resolution2=h)
59 return screeny
60
61 def select_indicator(self, sender):
62 ldtp.selectmenuitem(self.TOP_PANEL, 'mnu' + sender.replace(' ',''))
63
64 def wait_for_indicator_display(self, sender, timeout=5):
65 handlers = []
66 displayed = [False]
67
68 def _display_cb(indicator):
69 indicator.hide() # This is just normal behavior, so why not?
70 displayed[0] = True
71 gtk.main_quit()
72
73 def _timeout_cb():
74 gtk.main_quit()
75 return False
76
77 for indicator in self.indicators:
78 if sender == indicator.get_property("sender"):
79 handler = indicator.connect("user-display", _display_cb)
80 handlers.append((handler, indicator))
81
82 glib.timeout_add_seconds(timeout, _timeout_cb)
83
84 gtk.main()
85
86 for handler, indicator in handlers:
87 indicator.disconnect(handler)
88
89 return displayed[0]
90
91 def wait_for_server_display(self, timeout=5):
92 displayed = [False]
93 handler = 0
94
95 def _display_cb(indicator):
96 indicator.hide() # This is just normal behavior, so why not?
97 displayed[0] = True
98 gtk.main_quit()
99
100 def _timeout_cb():
101 gtk.main_quit()
102 return False
103
104 handler = self.server.connect("server-display", _display_cb)
105
106 glib.timeout_add_seconds(timeout, _timeout_cb)
107
108 gtk.main()
109
110 self.server.disconnect(handler)
111
112 return displayed[0]
113
114 def cleanup(self):
115 for indicator in self.indicators:
116 indicator.hide()
117 # BUG: 351537
118 # self.server.hide()
119 sleep(1)
120
121 def close(self):
122 self.cleanup()
123
124 def setup(self):
125 self.open()
126
127 def teardown(self):
128 self.close()
129
130class NotifyOSD(Application):
131 def __init__(self):
132 self.focus_desktop = False
133 self.screenshots = []
134
135 if not pynotify.init('notify-osd-test'):
136 raise ldtp.LdtpExecutionError, \
137 "Failed to initialize notification connection."
138
139 info = pynotify.get_server_info()
140 if info.get('name', None) != 'notify-osd':
141 raise ldtp.LdtpExecutionError, \
142 "The notify service is '%s', expected 'notify-dameon'" % \
143 info.get('name', None)
144
145 def open(self, focus_desktop=True):
146 self.focus_desktop = focus_desktop
147
148 if self.focus_desktop:
149 ldtp.generatekeyevent('<alt><ctrl>d')
150
151 def exit(self):
152 if self.focus_desktop:
153 ldtp.generatekeyevent('<alt><ctrl>d')
154 for screenshot in self.screenshots:
155 os.remove(screenshot)
156
157 def notify(self, summary, body="", icon=None):
158 n = pynotify.Notification (summary, body, icon)
159 n.show ()
160
161 def notify_synchronous(self, summary, body="", icon=None, value=-1):
162 n = pynotify.Notification (summary, body, icon)
163 n.set_hint("synchronous", "volume")
164 n.set_hint("value", value)
165 n.show ()
166
167 def grab_image_and_wait(self, summary):
168 ldtp.waittillguiexist(summary)
169 start_time = time()
170 x, y, w, h = ldtp.getwindowsize(summary)
171 screenshot = \
172 ldtputils.imagecapture(outFile=tempfile.mktemp('.png', 'nosd_'),
173 x=x+3, y=y+3,
174 resolution1=w-6,
175 resolution2=h-6)
176 ldtp.waittillguinotexist(summary)
177 end_time = time() - start_time
178 self.screenshots.append(screenshot)
179 return (end_time, screenshot)
180
181 def get_extents(self, summary, wait=False):
182 if wait:
183 exists = ldtp.waittillguiexist(summary)
184 else:
185 exists = ldtp.guiexist(summary)
186
187 if exists:
188 return ldtp.getwindowsize(summary)
189 else:
190 return -1, -1, -1, -1
191
192if __name__ == "__main__":
193 from time import sleep
194 test = IndicatorApplet()
195 test.open()
196 test.add_server('/usr/share/applications/transmission.desktop')
197 test.show_indicator('Elmer Fud')
198 print 'sleeping'
199 sleep(20)
200 #print test.wait_for_indicator_display('Elmer Fud', 20)
0201
=== added directory 'indicator-applet'
=== added directory 'indicator-applet/data'
=== added file 'indicator-applet/data/indicator_test.desktop'
--- indicator-applet/data/indicator_test.desktop 1970-01-01 00:00:00 +0000
+++ indicator-applet/data/indicator_test.desktop 2009-03-26 14:55:36 +0000
@@ -0,0 +1,10 @@
1[Desktop Entry]
2Encoding=UTF-8
3Name=Phony Internet Messenger
4GenericName=Internet Messenger
5Comment=Send instant messages over phony protocols
6Exec=phony
7StartupNotify=true
8Terminal=false
9Type=Application
10Categories=Network;InstantMessaging;
011
=== added file 'indicator-applet/indicator_applet.py'
--- indicator-applet/indicator_applet.py 1970-01-01 00:00:00 +0000
+++ indicator-applet/indicator_applet.py 2009-04-01 09:14:02 +0000
@@ -0,0 +1,49 @@
1# -*- coding: utf-8 -*-
2
3import ldtp
4import ldtputils
5import os
6
7from time import time, gmtime, strftime, sleep
8from desktoptesting.check import ScreenshotCompare, FAIL
9from desktoptesting.deskex import IndicatorApplet
10
11class IndicatorAppletTest(IndicatorApplet):
12 def serverTest(self, desktop_file=None):
13 self.add_server(os.path.abspath(desktop_file))
14 if not ldtp.objectexist(self.TOP_PANEL, 'mnuPhonyInternetMessenger'):
15 raise AssertionError("server does not appear in applet.")
16
17 def messageTest(self, desktop_file=None, sender=None):
18 self.add_server(os.path.abspath(desktop_file))
19 self.show_indicator(sender)
20 sleep(1)
21 if not ldtp.objectexist(self.TOP_PANEL, 'mnu' + sender.replace(' ','')):
22 raise AssertionError('indicator did not appear in applet.')
23
24 def iconChangeTest(self, desktop_file=None, sender=None):
25 self.add_server(os.path.abspath(desktop_file))
26 no_message = self.capture_applet_icon()
27 self.show_indicator(sender)
28 with_message = self.capture_applet_icon()
29
30 checker = ScreenshotCompare(no_message, with_message)
31
32 if checker.perform_test() != FAIL:
33 raise AssertionError('icon did not change.')
34
35 def displayIndicatorTest(self, desktop_file=None, sender=None):
36 self.add_server(os.path.abspath(desktop_file))
37 self.show_indicator(sender)
38 sleep(1)
39 self.select_indicator(sender)
40 if not self.wait_for_indicator_display(sender):
41 raise AssertionError('Indicator did not get a callback')
42
43 def displayServerTest(self, desktop_file=None):
44 self.add_server(os.path.abspath(desktop_file))
45 sleep(1)
46 ldtp.selectmenuitem(self.TOP_PANEL, 'mnuPhonyInternetMessenger')
47 if not self.wait_for_server_display():
48 raise AssertionError('Server did not get a callback')
49
050
=== added file 'indicator-applet/indicator_applet.xml'
--- indicator-applet/indicator_applet.xml 1970-01-01 00:00:00 +0000
+++ indicator-applet/indicator_applet.xml 2009-03-31 10:46:34 +0000
@@ -0,0 +1,70 @@
1<?xml version="1.0"?>
2<suite name="indicator-applet">
3 <class>indicator_applet.IndicatorAppletTest</class>
4 <description>indicator-applet tests</description>
5 <case name="Server">
6 <method>serverTest</method>
7 <description>
8 Add a server to the indicator applet.
9 </description>
10 <args>
11 <desktop_file>
12 ./indicator-applet/data/indicator_test.desktop
13 </desktop_file>
14 </args>
15 </case>
16 <case name="MessageIndicator">
17 <method>messageTest</method>
18 <description>
19 Add a message indicator to the indicator applet.
20 </description>
21 <args>
22 <desktop_file>
23 ./indicator-applet/data/indicator_test.desktop
24 </desktop_file>
25 <sender>
26 Elmer Fud
27 </sender>
28 </args>
29 </case>
30 <case name="IconChange">
31 <method>iconChangeTest</method>
32 <description>
33 Test to see if the applet's icon changes when a new message arrives.
34 </description>
35 <args>
36 <desktop_file>
37 ./indicator-applet/data/indicator_test.desktop
38 </desktop_file>
39 <sender>
40 Elmer Fud
41 </sender>
42 </args>
43 </case>
44 <case name="DisplayIndicator">
45 <method>displayIndicatorTest</method>
46 <description>
47 Test to see if the display callback is called when message
48 indicator is selected.
49 </description>
50 <args>
51 <desktop_file>
52 ./indicator-applet/data/indicator_test.desktop
53 </desktop_file>
54 <sender>
55 Elmer Fud
56 </sender>
57 </args>
58 </case>
59 <case name="DisplayServer">
60 <method>displayServerTest</method>
61 <description>
62 Test to see if the display callback is called when a server is selected.
63 </description>
64 <args>
65 <desktop_file>
66 ./indicator-applet/data/indicator_test.desktop
67 </desktop_file>
68 </args>
69 </case>
70</suite>
071
=== added directory 'notify-osd'
=== added directory 'notify-osd/data'
=== added file 'notify-osd/data/bubble_queue.xml'
--- notify-osd/data/bubble_queue.xml 1970-01-01 00:00:00 +0000
+++ notify-osd/data/bubble_queue.xml 2009-03-04 11:00:22 +0000
@@ -0,0 +1,7 @@
1<?xml version="1.0"?>
2<data>
3 <bubble>icons_summary_body_data.xml</bubble>
4 <bubble>icons_summary_data.xml</bubble>
5 <bubble>summary_body_data.xml</bubble>
6 <bubble>summary_data.xml</bubble>
7</data>
08
=== added file 'notify-osd/data/icons_summary.png'
1Binary files notify-osd/data/icons_summary.png 1970-01-01 00:00:00 +0000 and notify-osd/data/icons_summary.png 2009-05-04 09:33:24 +0000 differ9Binary files notify-osd/data/icons_summary.png 1970-01-01 00:00:00 +0000 and notify-osd/data/icons_summary.png 2009-05-04 09:33:24 +0000 differ
=== added file 'notify-osd/data/icons_summary_body.png'
2Binary files notify-osd/data/icons_summary_body.png 1970-01-01 00:00:00 +0000 and notify-osd/data/icons_summary_body.png 2009-05-04 09:33:24 +0000 differ10Binary files notify-osd/data/icons_summary_body.png 1970-01-01 00:00:00 +0000 and notify-osd/data/icons_summary_body.png 2009-05-04 09:33:24 +0000 differ
=== added file 'notify-osd/data/icons_summary_body_data.xml'
--- notify-osd/data/icons_summary_body_data.xml 1970-01-01 00:00:00 +0000
+++ notify-osd/data/icons_summary_body_data.xml 2009-02-28 14:03:43 +0000
@@ -0,0 +1,7 @@
1<?xml version="1.0"?>
2<data>
3 <oracle>./notify-osd/data/icons_summary_body.png</oracle>
4 <summary>Nat King Cole</summary>
5 <body>Hey pal, what's up with the party next weekend? Will you join me and Anna?</body>
6 <icon>notification-message-IM</icon>
7</data>
08
=== added file 'notify-osd/data/icons_summary_data.xml'
--- notify-osd/data/icons_summary_data.xml 1970-01-01 00:00:00 +0000
+++ notify-osd/data/icons_summary_data.xml 2009-02-28 14:03:43 +0000
@@ -0,0 +1,7 @@
1<?xml version="1.0"?>
2<data>
3 <oracle>./notify-osd/data/icons_summary.png</oracle>
4 <summary>WiFi connection lost</summary>
5 <body></body>
6 <icon>notification-network-wireless-disconnected</icon>
7</data>
08
=== added file 'notify-osd/data/summary.png'
1Binary files notify-osd/data/summary.png 1970-01-01 00:00:00 +0000 and notify-osd/data/summary.png 2009-05-04 09:33:24 +0000 differ9Binary files notify-osd/data/summary.png 1970-01-01 00:00:00 +0000 and notify-osd/data/summary.png 2009-05-04 09:33:24 +0000 differ
=== added file 'notify-osd/data/summary_body.png'
2Binary files notify-osd/data/summary_body.png 1970-01-01 00:00:00 +0000 and notify-osd/data/summary_body.png 2009-05-04 09:33:24 +0000 differ10Binary files notify-osd/data/summary_body.png 1970-01-01 00:00:00 +0000 and notify-osd/data/summary_body.png 2009-05-04 09:33:24 +0000 differ
=== added file 'notify-osd/data/summary_body_data.xml'
--- notify-osd/data/summary_body_data.xml 1970-01-01 00:00:00 +0000
+++ notify-osd/data/summary_body_data.xml 2009-02-28 14:03:43 +0000
@@ -0,0 +1,7 @@
1<?xml version="1.0"?>
2<data>
3 <oracle>./notify-osd/data/summary_body.png</oracle>
4 <summary>Totem</summary>
5 <body>This is a superfluous notification</body>
6 <icon></icon>
7</data>
08
=== added file 'notify-osd/data/summary_data.xml'
--- notify-osd/data/summary_data.xml 1970-01-01 00:00:00 +0000
+++ notify-osd/data/summary_data.xml 2009-02-28 14:03:43 +0000
@@ -0,0 +1,7 @@
1<?xml version="1.0"?>
2<data>
3 <oracle>./notify-osd/data/summary.png</oracle>
4 <summary>Summary-only</summary>
5 <body></body>
6 <icon></icon>
7</data>
08
=== added file 'notify-osd/data/synchronous_data.xml'
--- notify-osd/data/synchronous_data.xml 1970-01-01 00:00:00 +0000
+++ notify-osd/data/synchronous_data.xml 2009-03-04 13:24:54 +0000
@@ -0,0 +1,11 @@
1<?xml version="1.0"?>
2<data>
3 <summary1>Nat King Cole</summary1>
4 <body1>Hey pal, what's up with the party next weekend? Will you join me and Anna?</body1>
5 <icon1>notification-message-IM</icon1>
6
7 <summary2>Volume</summary2>
8 <body2></body2>
9 <icon2>notification-audio-volume-medium</icon2>
10 <value2>75</value2>
11</data>
012
=== added file 'notify-osd/notify_osd.py'
--- notify-osd/notify_osd.py 1970-01-01 00:00:00 +0000
+++ notify-osd/notify_osd.py 2009-03-22 23:36:18 +0000
@@ -0,0 +1,82 @@
1# -*- coding: utf-8 -*-
2
3import ldtp
4import ldtputils
5
6from time import time, gmtime, strftime, sleep
7
8from desktoptesting.deskex import NotifyOSD
9from desktoptesting.check import ScreenshotCompare, FAIL
10
11class NotifyOSDTest(NotifyOSD):
12 def layoutTest(self, oracle=None, summary=None, body=None, icon=None):
13 self.notify(summary, body, icon)
14 elapsed, screeny = self.grab_image_and_wait(summary)
15
16 checker = ScreenshotCompare(oracle, screeny)
17
18 try:
19 passed = checker.perform_test()
20 except Exception, e:
21 checker.calibrate()
22 raise e
23
24 if passed == FAIL:
25 raise AssertionError('screenshots differ', screeny)
26
27 def queueTest(self, oracle=None, summary=None, body=None, icon=None):
28 oracles = oracle.split('|')
29 summaries = summary.split('|')
30 bodies = body.split('|')
31 icons = icon.split('|')
32
33 bubbles = []
34
35 for oracle, summary, body, icons in \
36 zip(oracles, summaries, bodies, icons):
37 bubbles.append(_Bubble(oracle, summary, body, icons))
38
39 for b in bubbles:
40 self.notify(b.summary, b.body, b.icon)
41
42 for b in bubbles:
43 b.elapsed, b.screeny = self.grab_image_and_wait(b.summary)
44
45 for b in bubbles:
46 testcheck = ScreenshotCompare(b.oracle, b.screeny)
47
48 try:
49 check = testcheck.perform_test()
50 except Exception, e:
51 testcheck.calibrate()
52 raise e
53
54 if check == FAIL:
55 raise AssertionError("screenshots differ", b.screeny)
56
57 def synchronousTest(self, summary1=None, body1=None, icon1=None,
58 summary2=None, body2=None, icon2=None, value2=None):
59 ALLOWED_OVERLAP = 14
60
61 self.notify(summary1, body1, icon1)
62 sleep(1)
63 self.notify_synchronous(summary2, body2, icon2, int(value2))
64
65 x2, y2, w2, h2 = self.get_extents(summary2, True)
66 x1, y1, w1, h1 = self.get_extents(summary1)
67
68 if w1 == -1:
69 # First bubble does not exist anymore, this could mean
70 # that the second bubble did not appear synchronously.
71 raise AssertionError("not synchronous")
72 elif (y1 + h1) - y2 > ALLOWED_OVERLAP:
73 raise AssertionError("bad overlap")
74
75class _Bubble:
76 def __init__(self, oracle, summary, body, icon):
77 self.oracle = oracle
78 self.summary = summary
79 self.body = body
80 self.icon = icon
81 self.elapsed = None
82 self.screeny = None
083
=== added file 'notify-osd/notify_osd.xml'
--- notify-osd/notify_osd.xml 1970-01-01 00:00:00 +0000
+++ notify-osd/notify_osd.xml 2009-03-22 23:36:18 +0000
@@ -0,0 +1,80 @@
1<?xml version="1.0"?>
2<suite name="notify-osd">
3 <class>notify_osd.NotifyOSDTest</class>
4 <description>notify-osd tests</description>
5 <case name="IconSummaryBody">
6 <method>layoutTest</method>
7 <description>
8 Test the layout of a bubble with an icon, summary and body
9 </description>
10 <args>
11 <oracle>./notify-osd/data/icons_summary_body.png</oracle>
12 <summary>Nat King Cole</summary>
13 <body>Hey pal, what's up with the party next weekend? Will you join me and Anna?</body>
14 <icon>notification-message-IM</icon>
15 </args>
16 </case>
17 <case name="IconSummary">
18 <method>layoutTest</method>
19 <description>
20 Test the layout of a bubble with an icon and summary.
21 </description>
22 <args>
23 <oracle>./notify-osd/data/icons_summary.png</oracle>
24 <summary>WiFi connection lost</summary>
25 <body></body>
26 <icon>notification-network-wireless-disconnected</icon>
27 </args>
28 </case>
29 <case name="SummaryBody">
30 <method>layoutTest</method>
31 <description>
32 Test the layout of a bubble with a summary only.
33 </description>
34 <args>
35 <oracle>./notify-osd/data/summary_body.png</oracle>
36 <summary>Totem</summary>
37 <body>This is a superfluous notification</body>
38 <icon></icon>
39 </args>
40 </case>
41 <case name="Summary">
42 <method>layoutTest</method>
43 <description>
44 Test the layout of a bubble with a summary only.
45 </description>
46 <args>
47 <oracle>./notify-osd/data/summary.png</oracle>
48 <summary>Summary-only</summary>
49 <body></body>
50 <icon></icon>
51 </args>
52 </case>
53 <case name="Queue">
54 <method>queueTest</method>
55 <description>
56 Test the bubble queue.
57 </description>
58 <args>
59 <oracle>./notify-osd/data/icons_summary_body.png|./notify-osd/data/icons_summary.png|./notify-osd/data/summary.png</oracle>
60 <summary>Nat King Cole|WiFi connection lost|Summary-only</summary>
61 <body>Hey pal, what's up with the party next weekend? Will you join me and Anna?||</body>
62 <icon>notification-message-IM|notification-network-wireless-disconnected|</icon>
63 </args>
64 </case>
65 <case name="Synchronous">
66 <method>synchronousTest</method>
67 <description>
68 Test synchronous bubbles.
69 </description>
70 <args>
71 <summary1>Nat King Cole</summary1>
72 <body1>Hey pal, what's up with the party next weekend? Will you join me and Anna?</body1>
73 <icon1>notification-message-IM</icon1>
74 <summary2>Volume</summary2>
75 <body2></body2>
76 <icon2>notification-audio-volume-medium</icon2>
77 <value2>75</value2>
78 </args>
79 </case>
80</suite>

Subscribers

People subscribed via source and target branches

to status/vote changes: