diff --git a/Makefile.tools b/Makefile.tools
index 9637a9f..a83ed3f 100644
--- a/Makefile.tools
+++ b/Makefile.tools
test/test-health test/test-health-sink test/service-record.dtd \
test/service-did.xml test/service-spp.xml test/service-opp.xml \
test/service-ftp.xml test/simple-player test/test-nap \
- test/test-heartrate
+ test/test-heartrate test/test-alert
diff --git a/test/test-alert b/test/test-alert
new file mode 100755
index 0000000..c92a719
--- /dev/null
+++ b/test/test-alert
+#!/usr/bin/python
+from __future__ import absolute_import, print_function, unicode_literals
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+import gobject
+import optparse
+import sys
+import os
+
+BUS_NAME = 'org.bluez'
+ALERT_INTERFACE = 'org.bluez.Alert'
+ALERT_AGENT_INTERFACE = 'org.bluez.AlertAgent'
+BLUEZ_OBJECT_PATH = '/org/bluez'
+TEST_OBJECT_PATH = '/org/bluez/test'
+
+class AlertAgent(dbus.service.Object):
+ def __init__(self, bus, object_path, alert):
+ dbus.service.Object.__init__(self, bus, object_path)
+ self.alert = alert
+
+ @dbus.service.method(ALERT_AGENT_INTERFACE, in_signature='',
+ out_signature='')
+ def MuteOnce(self):
+ print('method MuteOnce() was called')
+ self.alert.NewAlert('ringer', 1, 'not active')
+
+ @dbus.service.method(ALERT_AGENT_INTERFACE, in_signature='s',
+ out_signature='')
+ def SetRinger(self, mode):
+ print('method SetRinger(%s) was called' % mode)
+ self.alert.NewAlert('ringer', 1, mode)
+
+def print_command_line(options):
+ if not options.verbose:
+ return False
+
+ print('-w: ' + str(options.wait))
+
+ if options.times:
+ print('-t: ' + str(options.times))
+
+ if options.register:
+ print('-r: ' + options.register)
+ else:
+ print('-r: ' + str(None))
+
+ if options.new_alert:
+ print('-n:')
+ for i in options.new_alert:
+ print(' ' + i[0] + ', ' + i[1] + ', ' + i[2])
+ else:
+ print('-n: ' + str(None))
+
+ if options.unread_alert:
+ print('-u:')
+ for i in options.unread_alert:
+ print(' ' + i[0] + ', ' + i[1])
+ else:
+ print('-u: ' + str(None))
+
+ print()
+
+ return True
+
+def read_count(param):
+ try:
+ return int(param)
+ except ValueError:
+ print('<count> must be integer, not \"%s\"' % param)
+ sys.exit(1)
+
+def new_alert(alert, params):
+ if not params:
+ return False
+
+ for param in params:
+ category = param[0]
+ count = read_count(param[1])
+ description = param[2]
+
+ alert.NewAlert(category, count, description)
+
+def unread_alert(alert, params):
+ if not params:
+ return False
+
+ for param in params:
+ category = param[0]
+ count = read_count(param[1])
+
+ alert.UnreadAlert(category, count)
+
+option_list = [
+ optparse.make_option('-v', None,
+ action = 'store_true',
+ default = False,
+ dest = 'verbose',
+ help = 'verbose'),
+
+ optparse.make_option('-w', None,
+ action = 'store_true',
+ default = False,
+ dest = 'wait',
+ help = 'wait for dbus events'),
+
+ optparse.make_option('-t', None,
+ action = 'store',
+ default = 1,
+ type = "int",
+ dest = 'times',
+ help = 'repeat UnreadAlert/NewAlert <times> times',
+ metavar = '<times>'),
+
+ optparse.make_option('-r', None,
+ action = 'store',
+ dest = 'register',
+ type = 'string',
+ metavar = '<category>',
+ help = 'register alert'),
+
+ optparse.make_option('-n', None,
+ action = 'append',
+ dest = 'new_alert',
+ type = 'string',
+ nargs = 3,
+ metavar = '<category> <count> <description>',
+ help = 'send new alert'),
+
+ optparse.make_option('-u', None,
+ action = 'append',
+ dest = 'unread_alert',
+ type = 'string',
+ nargs = 2,
+ metavar = '<category> <count>',
+ help = 'send unread alert'),
+]
+
+parser = optparse.OptionParser(option_list=option_list)
+parser.disable_interspersed_args()
+(options, args) = parser.parse_args()
+
+dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+bus = dbus.SystemBus()
+mainloop = gobject.MainLoop()
+alert = dbus.Interface(bus.get_object(BUS_NAME, BLUEZ_OBJECT_PATH),
+ ALERT_INTERFACE)
+alert_agent = AlertAgent(bus, TEST_OBJECT_PATH, alert)
+
+print_command_line(options)
+
+if not (options.register or options.new_alert or options.unread_alert or
+ options.wait):
+ parser.print_usage()
+ sys.exit(1)
+
+if options.register:
+ alert.RegisterAlert(options.register, TEST_OBJECT_PATH)
+
+times = 0
+while times < options.times:
+ times += 1
+
+ new_alert(alert, options.new_alert)
+ unread_alert(alert, options.unread_alert)
+
+if not options.wait:
+ sys.exit(0)
+
+try:
+ mainloop.run()
+except:
+ pass