From bca95cd537d65d8a3c2ef0d7e4209a4815a81deb Mon Sep 17 00:00:00 2001 From: Gergely Risko Date: Fri, 25 Sep 2009 11:01:17 +0300 Subject: libcontextsubscriber/contextkitplugin/waitforsubscription Qt 4.6 bugfix With Qt >= 4.6 if the provider is not on the D-Bus, then QDBus figures it out before even making the GetSubscriber call and you have to check for this explicitly, because they don't call the error callback. --- .../subscription/nonexistent.context | 7 + .../customer-tests/subscription/subscription.py | 1053 ++++++++++---------- libcontextsubscriber/src/contextkitplugin.cpp | 14 +- 3 files changed, 554 insertions(+), 520 deletions(-) create mode 100644 libcontextsubscriber/customer-tests/subscription/nonexistent.context (limited to 'libcontextsubscriber') diff --git a/libcontextsubscriber/customer-tests/subscription/nonexistent.context b/libcontextsubscriber/customer-tests/subscription/nonexistent.context new file mode 100644 index 00000000..12e1562f --- /dev/null +++ b/libcontextsubscriber/customer-tests/subscription/nonexistent.context @@ -0,0 +1,7 @@ + + + + INT + A property for a non-existent provider. + + diff --git a/libcontextsubscriber/customer-tests/subscription/subscription.py b/libcontextsubscriber/customer-tests/subscription/subscription.py index 98a38c67..a78fe694 100755 --- a/libcontextsubscriber/customer-tests/subscription/subscription.py +++ b/libcontextsubscriber/customer-tests/subscription/subscription.py @@ -31,547 +31,572 @@ import string from subprocess import Popen, PIPE import time import signal +from cltool import CLTool def proc_kill(pid): - os.system('../common/rec-kill.sh %d' % pid) + os.system('../common/rec-kill.sh %d' % pid) def timeoutHandler(signum, frame): - raise Exception('tests has been running for too long') + raise Exception('tests has been running for too long') def stdoutRead (object,lines): - list = [] - for i in range(lines): - list.append(object.stdout.readline().rstrip()) - return list + list = [] + for i in range(lines): + list.append(object.stdout.readline().rstrip()) + return list class Subscription(unittest.TestCase): - def setUp(self): - os.environ["CONTEXT_PROVIDE_REGISTRY_FILE"] = "./context-provide.context" - self.flexiprovider = Popen(["context-provide","session:com.nokia.test", - "int","test.int","1", - "string","test.string","foobar", - "double","test.double","2.5", - "truth","test.truth","True"], - stdin=PIPE,stderr=PIPE,stdout=PIPE) - os.environ["CONTEXT_PROVIDERS"] = "." - - print >>self.flexiprovider.stdin, "info()" - self.flexiprovider.stdout.readline() - self.context_client = Popen(["context-listen","test.int","test.double","test.string","test.truth"],stdin=PIPE,stdout=PIPE,stderr=PIPE) - - def tearDown(self): - proc_kill(self.flexiprovider.pid) - proc_kill(self.context_client.pid) - os.unlink('./context-provide.context') - - def testValue(self): - """ - Description - Subscribe to 4 properties covering basic data types - Query the value of the property - (when it's known or unknown, with and without a default value) - - Pre-conditions - Provider started via context-provide tool. - 4 data types supported int, bool, double and string - - Steps - Subscribe to the properties, int, bool, double, string - Change value of type int from the provider to a known value - Query the value (both with and without a default value) and assert the result - Change value of type int from the provider to unknown - Query the value (both with and without a default value) and assert the result - - Post-conditions - Kill provider - - References - None - """ - - actual = stdoutRead(self.context_client,4) - actual.sort() - expected = ["test.double = double:2.5", - "test.int = int:1", - "test.string = QString:foobar", - "test.truth = bool:true"] - self.assertEqual(actual,expected,"Actual key values pairs do not match expected") - print >> self.flexiprovider.stdin, "set('test.int',100)" - self.context_client.stdout.readline().rstrip() - print >> self.context_client.stdin, "value test.int" - actual = [self.context_client.stdout.readline().rstrip()] - actual.sort() - expected = ["value: int:100"] - self.assertEqual(actual,expected,"Actual key values pairs do not match expected") - - print >> self.context_client.stdin, "value test.int defaultValue" - actual = [self.context_client.stdout.readline().rstrip()] - actual.sort() - expected = ["value: int:100"] - self.assertEqual(actual,expected,"Actual key values pairs do not match expected") - - print >> self.flexiprovider.stdin, "set('test.int',None)" - self.context_client.stdout.readline().rstrip() - print >> self.context_client.stdin, "value test.int" - actual = [self.context_client.stdout.readline().rstrip()] - actual.sort() - expected = ["value is Unknown"] - self.assertEqual(actual,expected,"Actual key values pairs do not match expected") - - print >> self.context_client.stdin, "value test.int defaultValue" - actual = [self.context_client.stdout.readline().rstrip()] - actual.sort() - expected = ["value: QString:defaultValue"] - self.assertEqual(actual,expected,"Actual key values pairs do not match expected") - - print >> self.context_client.stdin, "key test.int" - actual = [self.context_client.stdout.readline().rstrip()] - actual.sort() - expected = ["key: test.int"] - self.assertEqual(actual,expected,"Actual key values pairs do not match expected") - - def testInfos(self): - """ - Description - Subscribe to 4 properties covering basic data types - - Pre-conditions - Provider started via context-provide tool. - 4 data types supported int, bool, double and string - - Steps - Subscribe to the properties, int, bool, double, string - Assert the returned information for key, description and type - - Post-conditions - Kill provider - - References - None - """ - - actual = stdoutRead(self.context_client,4) - print >> self.context_client.stdin, "ikey test.int" - actual = [self.context_client.stdout.readline().rstrip()] - expected = ["ikey: test.int"] - self.assertEqual(actual,expected,"Actual key values pairs do not match expected") - print >> self.context_client.stdin, "man test.truth" - actual = [self.context_client.stdout.readline().rstrip()] - expected = ["man: A phony but very flexible property."] - self.assertEqual(actual,expected,"Actual key values pairs do not match expected") - print >> self.context_client.stdin, "type test.double" - actual = [self.context_client.stdout.readline().rstrip()] - expected = ["type: DOUBLE"] - self.assertEqual(actual,expected,"Actual key values pairs do not match expected") - - def testAllDataTypes(self): - """ - Description - Subscribe to 4 properties covering basic data types - - Pre-conditions - Provider started via context-provide tool. - 4 data types supported int, bool, double and string - - Steps - Subscribe to the properties, int, bool, double, string - Properties values - - Post-conditions - Kill provider - - References - None - """ - - actual = stdoutRead(self.context_client,4) - - actual.sort() - expected = ["test.double = double:2.5", - "test.int = int:1", - "test.string = QString:foobar", - "test.truth = bool:true"] - self.assertEqual(actual,expected,"Actual key values pairs do not match expected") - - def testTruthTypePermutations(self): - """ - Description - Subscribe to 4 properties covering basic data types - - Pre-conditions - Provider started via context-provide tool. - 4 data types supported int, bool, double and string - - Steps - Subscribe to the properties, int, bool, double, string - Change property of type bool to False, None and True - Property value of type bool is updated to False, None and True - - Post-conditions - Kill provider - - References - None - """ - stdoutRead(self.context_client,4) - print >> self.flexiprovider.stdin, "set('test.truth',False)" - actual = [self.context_client.stdout.readline().rstrip()] - expected = ["test.truth = bool:false"] - self.assertEqual(actual,expected,"Actual key values pairs do not match expected %s %s" % (actual, expected)) - - print >> self.flexiprovider.stdin, "set('test.truth',None)" - actual = [self.context_client.stdout.readline().rstrip()] - expected = ["test.truth is Unknown"] - self.assertEqual(actual,expected,"Actual key values pairs do not match expected %s %s" % (actual, expected)) - - print >> self.flexiprovider.stdin, "set('test.truth',True)" - actual = [self.context_client.stdout.readline().rstrip()] - expected = ["test.truth = bool:true"] - self.assertEqual(actual,expected,"Actual key values pairs do not match expected %s %s" % (actual, expected)) - - def testStringTypePermutations(self): - """ - Description - Subscribe to 4 properties covering basic data types - - Pre-conditions - Provider started via context-provide tool. - 4 data types supported int, bool, double and string - - Steps - Subscribe to the properties, int, bool, double, string - Change property of type string to empty string and None - Property value of type bool is updated to empty string and None - - Post-conditions - Kill provider - - References - None - """ - stdoutRead(self.context_client,4) - print >> self.flexiprovider.stdin, "set('test.string','')" - actual = [self.context_client.stdout.readline().rstrip()] - expected = ["test.string = QString:"] - self.assertEqual(actual,expected,"Actual key values pairs do not match expected %s %s" % (actual, expected)) - - print >> self.flexiprovider.stdin, "set('test.string',None)" - actual = [self.context_client.stdout.readline().rstrip()] - expected = ["test.string is Unknown"] - self.assertEqual(actual,expected,"Actual key values pairs do not match expected %s %s" % (actual, expected)) + def setUp(self): + os.environ["CONTEXT_PROVIDE_REGISTRY_FILE"] = "./context-provide.context" + self.flexiprovider = Popen(["context-provide","session:com.nokia.test", + "int","test.int","1", + "string","test.string","foobar", + "double","test.double","2.5", + "truth","test.truth","True"], + stdin=PIPE,stderr=PIPE,stdout=PIPE) + os.environ["CONTEXT_PROVIDERS"] = "." + + print >>self.flexiprovider.stdin, "info()" + self.flexiprovider.stdout.readline() + self.context_client = Popen(["context-listen","test.int","test.double","test.string","test.truth"],stdin=PIPE,stdout=PIPE,stderr=PIPE) + + def tearDown(self): + proc_kill(self.flexiprovider.pid) + proc_kill(self.context_client.pid) + os.unlink('./context-provide.context') + + def testValue(self): + """ + Description + Subscribe to 4 properties covering basic data types + Query the value of the property + (when it's known or unknown, with and without a default value) + + Pre-conditions + Provider started via context-provide tool. + 4 data types supported int, bool, double and string + + Steps + Subscribe to the properties, int, bool, double, string + Change value of type int from the provider to a known value + Query the value (both with and without a default value) and assert the result + Change value of type int from the provider to unknown + Query the value (both with and without a default value) and assert the result + + Post-conditions + Kill provider + + References + None + """ + + actual = stdoutRead(self.context_client,4) + actual.sort() + expected = ["test.double = double:2.5", + "test.int = int:1", + "test.string = QString:foobar", + "test.truth = bool:true"] + self.assertEqual(actual,expected,"Actual key values pairs do not match expected") + print >> self.flexiprovider.stdin, "set('test.int',100)" + self.context_client.stdout.readline().rstrip() + print >> self.context_client.stdin, "value test.int" + actual = [self.context_client.stdout.readline().rstrip()] + actual.sort() + expected = ["value: int:100"] + self.assertEqual(actual,expected,"Actual key values pairs do not match expected") + + print >> self.context_client.stdin, "value test.int defaultValue" + actual = [self.context_client.stdout.readline().rstrip()] + actual.sort() + expected = ["value: int:100"] + self.assertEqual(actual,expected,"Actual key values pairs do not match expected") + + print >> self.flexiprovider.stdin, "set('test.int',None)" + self.context_client.stdout.readline().rstrip() + print >> self.context_client.stdin, "value test.int" + actual = [self.context_client.stdout.readline().rstrip()] + actual.sort() + expected = ["value is Unknown"] + self.assertEqual(actual,expected,"Actual key values pairs do not match expected") + + print >> self.context_client.stdin, "value test.int defaultValue" + actual = [self.context_client.stdout.readline().rstrip()] + actual.sort() + expected = ["value: QString:defaultValue"] + self.assertEqual(actual,expected,"Actual key values pairs do not match expected") + + print >> self.context_client.stdin, "key test.int" + actual = [self.context_client.stdout.readline().rstrip()] + actual.sort() + expected = ["key: test.int"] + self.assertEqual(actual,expected,"Actual key values pairs do not match expected") + + def testInfos(self): + """ + Description + Subscribe to 4 properties covering basic data types + + Pre-conditions + Provider started via context-provide tool. + 4 data types supported int, bool, double and string + + Steps + Subscribe to the properties, int, bool, double, string + Assert the returned information for key, description and type + + Post-conditions + Kill provider + + References + None + """ + + actual = stdoutRead(self.context_client,4) + print >> self.context_client.stdin, "ikey test.int" + actual = [self.context_client.stdout.readline().rstrip()] + expected = ["ikey: test.int"] + self.assertEqual(actual,expected,"Actual key values pairs do not match expected") + print >> self.context_client.stdin, "man test.truth" + actual = [self.context_client.stdout.readline().rstrip()] + expected = ["man: A phony but very flexible property."] + self.assertEqual(actual,expected,"Actual key values pairs do not match expected") + print >> self.context_client.stdin, "type test.double" + actual = [self.context_client.stdout.readline().rstrip()] + expected = ["type: DOUBLE"] + self.assertEqual(actual,expected,"Actual key values pairs do not match expected") + + def testAllDataTypes(self): + """ + Description + Subscribe to 4 properties covering basic data types + + Pre-conditions + Provider started via context-provide tool. + 4 data types supported int, bool, double and string + + Steps + Subscribe to the properties, int, bool, double, string + Properties values + + Post-conditions + Kill provider + + References + None + """ + + actual = stdoutRead(self.context_client,4) + + actual.sort() + expected = ["test.double = double:2.5", + "test.int = int:1", + "test.string = QString:foobar", + "test.truth = bool:true"] + self.assertEqual(actual,expected,"Actual key values pairs do not match expected") + + def testTruthTypePermutations(self): + """ + Description + Subscribe to 4 properties covering basic data types + + Pre-conditions + Provider started via context-provide tool. + 4 data types supported int, bool, double and string + + Steps + Subscribe to the properties, int, bool, double, string + Change property of type bool to False, None and True + Property value of type bool is updated to False, None and True + + Post-conditions + Kill provider + + References + None + """ + stdoutRead(self.context_client,4) + print >> self.flexiprovider.stdin, "set('test.truth',False)" + actual = [self.context_client.stdout.readline().rstrip()] + expected = ["test.truth = bool:false"] + self.assertEqual(actual,expected,"Actual key values pairs do not match expected %s %s" % (actual, expected)) + + print >> self.flexiprovider.stdin, "set('test.truth',None)" + actual = [self.context_client.stdout.readline().rstrip()] + expected = ["test.truth is Unknown"] + self.assertEqual(actual,expected,"Actual key values pairs do not match expected %s %s" % (actual, expected)) + + print >> self.flexiprovider.stdin, "set('test.truth',True)" + actual = [self.context_client.stdout.readline().rstrip()] + expected = ["test.truth = bool:true"] + self.assertEqual(actual,expected,"Actual key values pairs do not match expected %s %s" % (actual, expected)) + + def testStringTypePermutations(self): + """ + Description + Subscribe to 4 properties covering basic data types + + Pre-conditions + Provider started via context-provide tool. + 4 data types supported int, bool, double and string + + Steps + Subscribe to the properties, int, bool, double, string + Change property of type string to empty string and None + Property value of type bool is updated to empty string and None + + Post-conditions + Kill provider + + References + None + """ + stdoutRead(self.context_client,4) + print >> self.flexiprovider.stdin, "set('test.string','')" + actual = [self.context_client.stdout.readline().rstrip()] + expected = ["test.string = QString:"] + self.assertEqual(actual,expected,"Actual key values pairs do not match expected %s %s" % (actual, expected)) + + print >> self.flexiprovider.stdin, "set('test.string',None)" + actual = [self.context_client.stdout.readline().rstrip()] + expected = ["test.string is Unknown"] + self.assertEqual(actual,expected,"Actual key values pairs do not match expected %s %s" % (actual, expected)) class MultipleSubscribers(unittest.TestCase): - def initActual(self): - self.client1_actual = stdoutRead(self.context_client1,4) - self.client1_actual.sort() - self.client2_actual = stdoutRead(self.context_client2,2) - self.client2_actual.sort() - self.client3_actual = stdoutRead(self.context_client3,3) - self.client3_actual.sort() - self.client4_actual = stdoutRead(self.context_client4,3) - self.client4_actual.sort() - - def updateExpected(): - pass - - def setUp(self): - os.environ["CONTEXT_PROVIDE_REGISTRY_FILE"] = "./context-provide.context" - self.flexiprovider = Popen(["context-provide","session:com.nokia.test", - "int","test.int","1", - "string","test.string","foobar", - "double","test.double","2.5", - "truth","test.truth","True"], - stdin=PIPE,stderr=PIPE,stdout=PIPE) - os.environ["CONTEXT_PROVIDERS"] = "." - print >>self.flexiprovider.stdin, "info()" - self.flexiprovider.stdout.readline() - - self.context_client1 = Popen(["context-listen","test.int","test.double","test.string","test.truth"],stdin=PIPE,stdout=PIPE,stderr=PIPE) - self.context_client2 = Popen(["context-listen","test.int","test.double"],stdin=PIPE,stdout=PIPE,stderr=PIPE) - - self.context_client3 = Popen(["context-listen","test.int","test.string","test.truth"],stdin=PIPE,stdout=PIPE,stderr=PIPE) - - self.context_client4 = Popen(["context-listen","test.int","test.double","test.string"],stdin=PIPE,stdout=PIPE,stderr=PIPE) - - def tearDown(self): - proc_kill(self.flexiprovider.pid) - proc_kill(self.context_client1.pid) - proc_kill(self.context_client2.pid) - proc_kill(self.context_client3.pid) - proc_kill(self.context_client4.pid) - os.unlink('./context-provide.context') - - def testInitialSubscription(self): - """ - Description - 4 subscribers instantiate multiple properties of 4 basic data types - - Pre-conditions - Provider started via context-provide tool. - 4 data types supported int, bool, double and string - - Steps - Subscribe to the properties, int, bool, double, string - Subscribers receive initial values from provider - - Post-conditions - Kill provider - - References - None - """ - - self.initActual() - client1_expected = ["test.double = double:2.5", - "test.int = int:1", - "test.string = QString:foobar", - "test.truth = bool:true"] - client2_expected = ["test.double = double:2.5", - "test.int = int:1"] - client3_expected = ["test.int = int:1", - "test.string = QString:foobar", - "test.truth = bool:true"] - client4_expected = ["test.double = double:2.5", - "test.int = int:1", - "test.string = QString:foobar"] - - self.assertEqual(self.client1_actual,client1_expected,"Actual key values pairs do not match expected") - self.assertEqual(self.client2_actual,client2_expected,"Actual key values pairs do not match expected") - self.assertEqual(self.client3_actual,client3_expected,"Actual key values pairs do not match expected") - self.assertEqual(self.client4_actual,client4_expected,"Actual key values pairs do not match expected") - - def testValueChanged(self): - """ - Description - 4 subscribers instantiate multiple properties of 4 basic data types - - Pre-conditions - Provider started via context-provide tool. - 4 data types supported int, bool, double and string - - Steps - Subscribe to the properties, int, bool, double, string - Values are changed successively from the provider - Subscribers receive updated values - - Post-conditions - Kill provider - - References - None - """ - self.initActual() - client1_expected = ["test.double = double:2.5", - "test.int = int:1", - "test.string = QString:foobar", - "test.truth = bool:true"] - client2_expected = ["test.double = double:2.5", - "test.int = int:1"] - client3_expected = ["test.int = int:1", - "test.string = QString:foobar", - "test.truth = bool:true"] - client4_expected = ["test.double = double:2.5", - "test.int = int:1", - "test.string = QString:foobar"] - self.assertEqual(self.client1_actual,client1_expected,"Actual key values pairs do not match expected") - self.assertEqual(self.client2_actual,client2_expected,"Actual key values pairs do not match expected") - self.assertEqual(self.client3_actual,client3_expected,"Actual key values pairs do not match expected") - self.assertEqual(self.client4_actual,client4_expected,"Actual key values pairs do not match expected") - - print >> self.flexiprovider.stdin, "set('test.double',-5.3)" - - self.client1_actual = [self.context_client1.stdout.readline().rstrip()] - self.client1_actual.sort() - - self.client2_actual = [self.context_client2.stdout.readline().rstrip()] - self.client2_actual.sort() - - self.client4_actual = [self.context_client4.stdout.readline().rstrip()] - self.client4_actual.sort() - - client1_expected = ["test.double = double:-5.3"] - client2_expected = ["test.double = double:-5.3"] - client4_expected = ["test.double = double:-5.3"] - - self.assertEqual(self.client1_actual,client1_expected,"Actual key values pairs do not match expected") - self.assertEqual(self.client2_actual,client2_expected,"Actual key values pairs do not match expected") - self.assertEqual(self.client4_actual,client4_expected,"Actual key values pairs do not match expected") - - print >> self.context_client3.stdin, "type test.truth" - - client3_expected = "type: TRUTH" - - self.client3_actual = self.context_client3.stdout.readline().rstrip() - self.assertEqual(self.client3_actual,client3_expected, - "Actual key values pairs do not match expected %s %s " % (self.client3_actual,client3_expected)) - - - print >> self.flexiprovider.stdin, "set('test.truth',None)" - - self.client1_actual = [self.context_client1.stdout.readline().rstrip()] - self.client1_actual.sort() - - self.client3_actual = [self.context_client3.stdout.readline().rstrip()] - self.client3_actual.sort() - - client1_expected = ["test.truth is Unknown"] - client3_expected = ["test.truth is Unknown"] - - self.assertEqual(self.client1_actual,client1_expected, - "Actual key values pairs do not match expected %s %s " % (self.client1_actual,client1_expected)) - self.assertEqual(self.client3_actual,client3_expected, - "Actual key values pairs do not match expected %s %s " % (self.client3_actual,client3_expected)) + def initActual(self): + self.client1_actual = stdoutRead(self.context_client1,4) + self.client1_actual.sort() + self.client2_actual = stdoutRead(self.context_client2,2) + self.client2_actual.sort() + self.client3_actual = stdoutRead(self.context_client3,3) + self.client3_actual.sort() + self.client4_actual = stdoutRead(self.context_client4,3) + self.client4_actual.sort() + + def updateExpected(): + pass + + def setUp(self): + os.environ["CONTEXT_PROVIDE_REGISTRY_FILE"] = "./context-provide.context" + self.flexiprovider = Popen(["context-provide","session:com.nokia.test", + "int","test.int","1", + "string","test.string","foobar", + "double","test.double","2.5", + "truth","test.truth","True"], + stdin=PIPE,stderr=PIPE,stdout=PIPE) + os.environ["CONTEXT_PROVIDERS"] = "." + print >>self.flexiprovider.stdin, "info()" + self.flexiprovider.stdout.readline() + + self.context_client1 = Popen(["context-listen","test.int","test.double","test.string","test.truth"],stdin=PIPE,stdout=PIPE,stderr=PIPE) + self.context_client2 = Popen(["context-listen","test.int","test.double"],stdin=PIPE,stdout=PIPE,stderr=PIPE) + + self.context_client3 = Popen(["context-listen","test.int","test.string","test.truth"],stdin=PIPE,stdout=PIPE,stderr=PIPE) + + self.context_client4 = Popen(["context-listen","test.int","test.double","test.string"],stdin=PIPE,stdout=PIPE,stderr=PIPE) + + def tearDown(self): + proc_kill(self.flexiprovider.pid) + proc_kill(self.context_client1.pid) + proc_kill(self.context_client2.pid) + proc_kill(self.context_client3.pid) + proc_kill(self.context_client4.pid) + os.unlink('./context-provide.context') + + def testInitialSubscription(self): + """ + Description + 4 subscribers instantiate multiple properties of 4 basic data types + + Pre-conditions + Provider started via context-provide tool. + 4 data types supported int, bool, double and string + + Steps + Subscribe to the properties, int, bool, double, string + Subscribers receive initial values from provider + + Post-conditions + Kill provider + + References + None + """ + + self.initActual() + client1_expected = ["test.double = double:2.5", + "test.int = int:1", + "test.string = QString:foobar", + "test.truth = bool:true"] + client2_expected = ["test.double = double:2.5", + "test.int = int:1"] + client3_expected = ["test.int = int:1", + "test.string = QString:foobar", + "test.truth = bool:true"] + client4_expected = ["test.double = double:2.5", + "test.int = int:1", + "test.string = QString:foobar"] + + self.assertEqual(self.client1_actual,client1_expected,"Actual key values pairs do not match expected") + self.assertEqual(self.client2_actual,client2_expected,"Actual key values pairs do not match expected") + self.assertEqual(self.client3_actual,client3_expected,"Actual key values pairs do not match expected") + self.assertEqual(self.client4_actual,client4_expected,"Actual key values pairs do not match expected") + + def testValueChanged(self): + """ + Description + 4 subscribers instantiate multiple properties of 4 basic data types + + Pre-conditions + Provider started via context-provide tool. + 4 data types supported int, bool, double and string + + Steps + Subscribe to the properties, int, bool, double, string + Values are changed successively from the provider + Subscribers receive updated values + + Post-conditions + Kill provider + + References + None + """ + self.initActual() + client1_expected = ["test.double = double:2.5", + "test.int = int:1", + "test.string = QString:foobar", + "test.truth = bool:true"] + client2_expected = ["test.double = double:2.5", + "test.int = int:1"] + client3_expected = ["test.int = int:1", + "test.string = QString:foobar", + "test.truth = bool:true"] + client4_expected = ["test.double = double:2.5", + "test.int = int:1", + "test.string = QString:foobar"] + self.assertEqual(self.client1_actual,client1_expected,"Actual key values pairs do not match expected") + self.assertEqual(self.client2_actual,client2_expected,"Actual key values pairs do not match expected") + self.assertEqual(self.client3_actual,client3_expected,"Actual key values pairs do not match expected") + self.assertEqual(self.client4_actual,client4_expected,"Actual key values pairs do not match expected") + + print >> self.flexiprovider.stdin, "set('test.double',-5.3)" + + self.client1_actual = [self.context_client1.stdout.readline().rstrip()] + self.client1_actual.sort() + + self.client2_actual = [self.context_client2.stdout.readline().rstrip()] + self.client2_actual.sort() + + self.client4_actual = [self.context_client4.stdout.readline().rstrip()] + self.client4_actual.sort() + + client1_expected = ["test.double = double:-5.3"] + client2_expected = ["test.double = double:-5.3"] + client4_expected = ["test.double = double:-5.3"] + + self.assertEqual(self.client1_actual,client1_expected,"Actual key values pairs do not match expected") + self.assertEqual(self.client2_actual,client2_expected,"Actual key values pairs do not match expected") + self.assertEqual(self.client4_actual,client4_expected,"Actual key values pairs do not match expected") + + print >> self.context_client3.stdin, "type test.truth" + + client3_expected = "type: TRUTH" + + self.client3_actual = self.context_client3.stdout.readline().rstrip() + self.assertEqual(self.client3_actual,client3_expected, + "Actual key values pairs do not match expected %s %s " % (self.client3_actual,client3_expected)) + + + print >> self.flexiprovider.stdin, "set('test.truth',None)" + + self.client1_actual = [self.context_client1.stdout.readline().rstrip()] + self.client1_actual.sort() + + self.client3_actual = [self.context_client3.stdout.readline().rstrip()] + self.client3_actual.sort() + + client1_expected = ["test.truth is Unknown"] + client3_expected = ["test.truth is Unknown"] + + self.assertEqual(self.client1_actual,client1_expected, + "Actual key values pairs do not match expected %s %s " % (self.client1_actual,client1_expected)) + self.assertEqual(self.client3_actual,client3_expected, + "Actual key values pairs do not match expected %s %s " % (self.client3_actual,client3_expected)) class MultipleProviders(unittest.TestCase): - def setUp(self): - os.environ["CONTEXT_PROVIDE_REGISTRY_FILE"] = "./context-provide1.context" - self.flexiprovider1 = Popen(["context-provide","session:com.nokia.test", - "truth","test.truth","True"], - stdin=PIPE,stderr=PIPE,stdout=PIPE) + def setUp(self): + os.environ["CONTEXT_PROVIDE_REGISTRY_FILE"] = "./context-provide1.context" + self.flexiprovider1 = Popen(["context-provide","session:com.nokia.test", + "truth","test.truth","True"], + stdin=PIPE,stderr=PIPE,stdout=PIPE) - os.environ["CONTEXT_PROVIDE_REGISTRY_FILE"] = "./context-provide2.context" - self.flexiprovider2 = Popen(["context-provide","session:com.nokia.test2", - "int","test.int","24"], - stdin=PIPE,stderr=PIPE,stdout=PIPE) + os.environ["CONTEXT_PROVIDE_REGISTRY_FILE"] = "./context-provide2.context" + self.flexiprovider2 = Popen(["context-provide","session:com.nokia.test2", + "int","test.int","24"], + stdin=PIPE,stderr=PIPE,stdout=PIPE) - os.environ["CONTEXT_PROVIDERS"] = "." + os.environ["CONTEXT_PROVIDERS"] = "." - print >> self.flexiprovider1.stdin, "info()" - self.flexiprovider1.stdout.readline() + print >> self.flexiprovider1.stdin, "info()" + self.flexiprovider1.stdout.readline() - self.context_client = Popen(["context-listen","test.int","test.truth"] - ,stdin=PIPE,stdout=PIPE,stderr=PIPE) + self.context_client = Popen(["context-listen","test.int","test.truth"] + ,stdin=PIPE,stdout=PIPE,stderr=PIPE) - def tearDown(self): - proc_kill(self.context_client.pid) - proc_kill(self.flexiprovider1.pid) - proc_kill(self.flexiprovider2.pid) - os.unlink('./context-provide1.context') - os.unlink('./context-provide2.context') + def tearDown(self): + proc_kill(self.context_client.pid) + proc_kill(self.flexiprovider1.pid) + proc_kill(self.flexiprovider2.pid) + os.unlink('./context-provide1.context') + os.unlink('./context-provide2.context') - def testTwoProviders(self): - stdoutRead(self.context_client,2) - print >>self.flexiprovider2.stdin, "set('test.int',-68)" + def testTwoProviders(self): + stdoutRead(self.context_client,2) + print >>self.flexiprovider2.stdin, "set('test.int',-68)" - actual = self.context_client.stdout.readline().rstrip() - expected = "test.int = int:-68" - self.assertEqual(actual,expected,"Actual key values pairs do not match expected") + actual = self.context_client.stdout.readline().rstrip() + expected = "test.int = int:-68" + self.assertEqual(actual,expected,"Actual key values pairs do not match expected") - print >>self.flexiprovider1.stdin, "set('test.truth',False)" + print >>self.flexiprovider1.stdin, "set('test.truth',False)" - actual = self.context_client.stdout.readline().rstrip() - expected = "test.truth = bool:false" - self.assertEqual(actual,expected,"Actual key values pairs do not match expected") + actual = self.context_client.stdout.readline().rstrip() + expected = "test.truth = bool:false" + self.assertEqual(actual,expected,"Actual key values pairs do not match expected") class SubscriptionPause (unittest.TestCase): - def setUp(self): - os.environ["CONTEXT_PROVIDE_REGISTRY_FILE"] = "./context-provide.context" - self.flexiprovider = Popen(["context-provide","session:com.nokia.test", - "int","test.int","1", - "int","test.int.second","-1" ], - stdin=PIPE,stderr=PIPE,stdout=PIPE) - - os.environ["CONTEXT_PROVIDERS"] = "." - - print >> self.flexiprovider.stdin, "info()" - self.flexiprovider.stdout.readline() - - self.context_client = Popen(["context-listen","test.int"],stdin=PIPE,stdout=PIPE,stderr=PIPE) - - def tearDown(self): - proc_kill(self.flexiprovider.pid) - proc_kill(self.context_client.pid) - os.unlink('context-provide.context') - - def testPause(self): - """ - Description - A subscriber successively subscribes and unsubscribes from a property - - Pre-conditions - Provider started via context-provide tool. - 2 properties of data type int - - Steps - Subscribe to a property - Subscriber receives updated value - Unsubscribe from the property - Subscriber does not receive updated value - Resubscribe to the property - Subscriber receives updated value - - Post-conditions - Kill provider - - References - None - """ - - actual = [self.context_client.stdout.readline().rstrip()] - actual.sort() - expected = ["test.int = int:1"] - self.assertEqual(actual,expected,"Actual key values pairs do not match expected") - print >> self.flexiprovider.stdin, "set('test.int',-5)" - actual = [self.context_client.stdout.readline().rstrip()] - actual.sort() - expected = ["test.int = int:-5"] - self.assertEqual(actual,expected,"Actual key values pairs do not match expected") - - print >> self.context_client.stdin, "unsubscribe test.int" - print >> self.flexiprovider.stdin, "set('test.int',3)" - - print >> self.context_client.stdin, "subscribe test.int" - actual = [self.context_client.stdout.readline().rstrip()] - expected = ["test.int = int:3"] - self.assertEqual(actual,expected,"Actual key values pairs do not match expected") - print >> self.flexiprovider.stdin, "set('test.int',6)" - actual = [self.context_client.stdout.readline().rstrip()] - - expected = ["test.int = int:6"] - self.assertEqual(actual,expected,"Actual key values pairs do not match expected") - - - def testWaitForSubscribe(self): - """ - Description - Subscriber blocks until WaitForSubsciption returns - - Pre-conditions - Provider started via context-provide tool. - 1 data type supported int - - Steps - Delete the property test.int - Delay the provider - Subscribe to the property test.int - Subscriber blocks until the subscription is complete - - Post-conditions - Kill provider - - References - None - """ - print >> self.context_client.stdin, "delete test.int" - print >>self.flexiprovider.stdin, "import time ; time.sleep(3)" - - print >> self.context_client.stdin, "new test.int" - print >> self.context_client.stdin, "waitforsubscription test.int" - - - actual = stdoutRead(self.context_client, 2) - actual.sort() - expected = ["test.int = int:1", - "wait finished for test.int"] - self.assertEqual(actual, expected, "Actual key values pairs do not match expected") + def setUp(self): + os.environ["CONTEXT_PROVIDE_REGISTRY_FILE"] = "./context-provide.context" + self.flexiprovider = Popen(["context-provide","session:com.nokia.test", + "int","test.int","1", + "int","test.int.second","-1" ], + stdin=PIPE,stderr=PIPE,stdout=PIPE) + + os.environ["CONTEXT_PROVIDERS"] = "." + + print >> self.flexiprovider.stdin, "info()" + self.flexiprovider.stdout.readline() + + self.context_client = Popen(["context-listen","test.int"],stdin=PIPE,stdout=PIPE,stderr=PIPE) + + def tearDown(self): + proc_kill(self.flexiprovider.pid) + proc_kill(self.context_client.pid) + os.unlink('context-provide.context') + + def testPause(self): + """ + Description + A subscriber successively subscribes and unsubscribes from a property + + Pre-conditions + Provider started via context-provide tool. + 2 properties of data type int + + Steps + Subscribe to a property + Subscriber receives updated value + Unsubscribe from the property + Subscriber does not receive updated value + Resubscribe to the property + Subscriber receives updated value + + Post-conditions + Kill provider + + References + None + """ + + actual = [self.context_client.stdout.readline().rstrip()] + actual.sort() + expected = ["test.int = int:1"] + self.assertEqual(actual,expected,"Actual key values pairs do not match expected") + print >> self.flexiprovider.stdin, "set('test.int',-5)" + actual = [self.context_client.stdout.readline().rstrip()] + actual.sort() + expected = ["test.int = int:-5"] + self.assertEqual(actual,expected,"Actual key values pairs do not match expected") + + print >> self.context_client.stdin, "unsubscribe test.int" + print >> self.flexiprovider.stdin, "set('test.int',3)" + + print >> self.context_client.stdin, "subscribe test.int" + actual = [self.context_client.stdout.readline().rstrip()] + expected = ["test.int = int:3"] + self.assertEqual(actual,expected,"Actual key values pairs do not match expected") + print >> self.flexiprovider.stdin, "set('test.int',6)" + actual = [self.context_client.stdout.readline().rstrip()] + + expected = ["test.int = int:6"] + self.assertEqual(actual,expected,"Actual key values pairs do not match expected") + + + def testWaitForSubscribe(self): + """ + Description + Subscriber blocks until WaitForSubsciption returns + + Pre-conditions + Provider started via context-provide tool. + 1 data type supported int + + Steps + Delete the property test.int + Delay the provider + Subscribe to the property test.int + Subscriber blocks until the subscription is complete + + Post-conditions + Kill provider + + References + None + """ + print >> self.context_client.stdin, "delete test.int" + print >>self.flexiprovider.stdin, "import time ; time.sleep(3)" + + print >> self.context_client.stdin, "new test.int" + print >> self.context_client.stdin, "waitforsubscription test.int" + + + actual = stdoutRead(self.context_client, 2) + actual.sort() + expected = ["test.int = int:1", + "wait finished for test.int"] + self.assertEqual(actual, expected, "Actual key values pairs do not match expected") + +class SubscriptionWaitError (unittest.TestCase): + def testWaitForSubscribeFail(self): + """ + Description + Subscriber blocks until WaitForSubsciption returns, even if provider is not on DBus (specific to ContextKitPlugin) + + Pre-conditions + Provider does exist for the property in the registry but it is not running + + Steps + Subscribe and wait for the property + + Post-conditions + The wait returned in 3 seconds (enough for testing that provider is not on D-Bus) + """ + os.environ["CONTEXT_PROVIDERS"] = "." + context_client = CLTool("context-listen") + context_client.send("n test.nonexistent") + context_client.send("w test.nonexistent") + self.assert_(context_client.expect(CLTool.STDOUT, + "wait finished for test.nonexistent", + 3), + "Wait for subscription is probably in a dead state") if __name__ == "__main__": - sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 1) - signal.signal(signal.SIGALRM, timeoutHandler) - signal.alarm(30) - unittest.main() + sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 1) + signal.signal(signal.SIGALRM, timeoutHandler) + signal.alarm(30) + unittest.main() diff --git a/libcontextsubscriber/src/contextkitplugin.cpp b/libcontextsubscriber/src/contextkitplugin.cpp index 08005933..1b3f1049 100644 --- a/libcontextsubscriber/src/contextkitplugin.cpp +++ b/libcontextsubscriber/src/contextkitplugin.cpp @@ -73,7 +73,7 @@ ContextKitPlugin::ContextKitPlugin(const QDBusConnection bus, const QString& bus // perform the initial NameHasOwner check. We try to connect to // the provider at startup, whether it's present or not. providerListener->startListening(false); - onProviderAppeared(); + QMetaObject::invokeMethod(this, "onProviderAppeared", Qt::QueuedConnection); } /// Gets a new subscriber interface from manager when the provider @@ -83,11 +83,13 @@ void ContextKitPlugin::onProviderAppeared() contextDebug() << "ContextKitPlugin::onProviderAppeared"; delete subscriberInterface; subscriberInterface = 0; - managerInterface->callWithCallback("GetSubscriber", - QList(), - this, - SLOT(onDBusGetSubscriberFinished(QDBusObjectPath)), - SLOT(onDBusGetSubscriberFailed(QDBusError))); + if (!managerInterface->callWithCallback("GetSubscriber", + QList(), + this, + SLOT(onDBusGetSubscriberFinished(QDBusObjectPath)), + SLOT(onDBusGetSubscriberFailed(QDBusError)))) { + emit failed("Wasn't able to call GetSubscriber on the managerinterface"); + } } /// Delete our subscriber interface when the provider goes away. -- cgit v1.2.3