summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/QA/ScriptedTests/PubSub.lua')
-rw-r--r--Swiften/QA/ScriptedTests/PubSub.lua340
1 files changed, 340 insertions, 0 deletions
diff --git a/Swiften/QA/ScriptedTests/PubSub.lua b/Swiften/QA/ScriptedTests/PubSub.lua
new file mode 100644
index 0000000..43cce14
--- /dev/null
+++ b/Swiften/QA/ScriptedTests/PubSub.lua
@@ -0,0 +1,340 @@
+ --[[
+ Copyright (c) 2013 Remko Tronçon
+ Licensed under the GNU General Public License.
+ See the COPYING file for more information.
+--]]
+
+require 'sluift'
+
+sluift.debug = os.getenv("SLUIFT_DEBUG")
+
+local publisher
+local publisher_jid = os.getenv("SLUIFT_JID")
+local pubsub_jid = os.getenv("SLUIFT_PUBSUB_SERVICE") or sluift.jid.to_bare(publisher_jid)
+local pubsub
+local node_id = os.getenv("SLUIFT_PUBSUB_NODE") or "http://swift.im/Swiften/QA/PubSub"
+local node
+
+local subscriber
+local subscriber_jid = os.getenv("SLUIFT_JID2")
+local subscriber_pubsub
+local subscriber_node
+
+local publish_item = {id = 'item_id', data = {{ _type = 'software_version', name = 'MyTest', os = 'Lua' }} }
+local publish_item2 = {id = 'item_id2', data = {{ _type = 'software_version', name = 'MyTest2', os = 'Lua' }} }
+local publish_item3 = {id = 'item_id3', data = {{ _type = 'software_version', name = 'MyTest3', os = 'Lua' }} }
+
+--------------------------------------------------------------------------------
+-- Helper methods
+--------------------------------------------------------------------------------
+
+function purge_pubsub_events(client)
+ client:for_each_pubsub_event({timeout = 2000}, function() end)
+end
+
+--------------------------------------------------------------------------------
+-- 5. Entity use cases
+--------------------------------------------------------------------------------
+function test_entity_use_cases()
+ node:delete()
+
+ -- 5.2 List nodes
+ assert(node:create())
+ local nodes = assert(pubsub:list_nodes()).items
+ local found_item = false
+ for _, node in ipairs(nodes) do
+ if node.node == node_id then found_item = true end
+ end
+ assert(found_item)
+ assert(node:delete())
+
+
+ -- 5.5 Discover items of node
+ assert(node:create())
+ assert(node:publish {items = {publish_item}})
+ local items = assert(node:list_items()).items
+ assert(#items == 1)
+ assert(items[1].name == 'item_id')
+ assert(node:delete())
+
+ -- 5.6 Subscriptions
+ assert(node:create())
+ assert(subscriber_node:subscribe({ jid = subscriber_jid }))
+ local service_subscriptions = assert(subscriber_pubsub:get_subscriptions())
+ assert(#service_subscriptions == 1)
+ assert(service_subscriptions[1].node == node_id)
+ assert(service_subscriptions[1].jid == subscriber_jid)
+ assert(service_subscriptions[1].subscription == 'subscribed')
+ local node_subscriptions = assert(subscriber_node:get_subscriptions())
+ assert(#node_subscriptions == 1)
+ assert(node_subscriptions[1].jid == subscriber_jid)
+ assert(node_subscriptions[1].subscription == 'subscribed')
+ assert(node:delete())
+
+ -- 5.7 Retrieve affiliations
+ --print(pubsub:get_affiliations()) -- Freezes Isode
+ --print(node:get_affiliations()) -- Freezes isode
+end
+
+--------------------------------------------------------------------------------
+-- 6. Subscriber use cases
+--------------------------------------------------------------------------------
+
+function test_subscriber_use_cases()
+ node:delete()
+
+ -- 6.1 Subscribe to a node
+ assert(node:create())
+ local subscription = assert(subscriber_node:subscribe({ jid = subscriber_jid }))
+ -- TODO: Test subscription id etc. Doesn't work with M-link atm
+ -- TODO: Test pending subscription
+ -- TODO: Test configuration required
+ assert(node:delete())
+
+ -- 6.2 Unsubscribe from a node
+ assert(node:create())
+ assert(subscriber_node:subscribe({ jid = subscriber_jid }))
+ assert(subscriber_node:unsubscribe({ jid = subscriber_jid }))
+ assert(node:delete())
+
+ -- 6.3 Configure subscription options
+ -- TODO: Not supported by M-Link? Finish it later
+ --assert(node:create())
+ --assert(subscriber_node:subscribe({ jid = subscriber_jid }))
+ --local options = assert(subscriber_node:get_subscription_options({ jid = subscriber_jid }))
+ --print(options)
+ --assert(node:delete())
+
+ -- 6.4 Request default subscription configuration options
+ -- TODO: Not supported by M-Link? Finish it later
+ --local options = assert(subscriber_pubsub:get_default_subscription_options())
+ --print(options)
+ --local options = assert(subscriber_node:get_default_subscription_options())
+ --print(options)
+
+ -- 6.5 Retrieve items of a node
+ assert(node:create())
+ assert(node:set_configuration{configuration = {['pubsub#max_items'] = '10'}})
+ assert(node:publish{item = publish_item})
+ assert(node:publish{item = publish_item2})
+ local items = assert(subscriber_node:get_items())
+ assert(#items == 2)
+ assert(items[1].id == 'item_id')
+ assert(items[1].data[1].name == 'MyTest')
+ assert(items[2].id == 'item_id2')
+ assert(items[2].data[1].name == 'MyTest2')
+ assert(node:delete())
+
+ -- 6.5.7 Requesting most recent items
+ assert(node:create())
+ assert(node:set_configuration{configuration = {['pubsub#max_items'] = '10'}})
+ assert(node:publish{item = publish_item})
+ assert(node:publish{item = publish_item2})
+ assert(node:publish{item = publish_item3})
+ local items = assert(subscriber_node:get_items{maximum_items = 2})
+ assert(#items == 2)
+ assert(items[1].id == 'item_id2')
+ assert(items[1].data[1].name == 'MyTest2')
+ assert(items[2].id == 'item_id3')
+ assert(items[2].data[1].name == 'MyTest3')
+ assert(node:delete())
+
+ -- 6.5.8 requesting specific item
+ assert(node:create())
+ assert(node:set_configuration{configuration = {['pubsub#max_items'] = '10'}})
+ assert(node:publish{item = publish_item})
+ assert(node:publish{item = publish_item2})
+ local items = assert(subscriber_node:get_item{id = 'item_id2'})
+ assert(#items == 1)
+ assert(items[1].id == 'item_id2')
+ assert(items[1].data[1].name == 'MyTest2')
+ assert(node:delete())
+end
+
+--------------------------------------------------------------------------------
+-- 7. Publisher use cases
+--------------------------------------------------------------------------------
+
+function test_publisher_use_cases()
+ node:delete()
+
+ -- 7.1 Publish item to a node
+ assert(node:create())
+ assert(subscriber_node:subscribe({ jid = subscriber_jid }))
+ purge_pubsub_events(subscriber)
+ assert(node:publish {items = {publish_item}})
+ local event = assert(subscriber:get_next_event { type = 'pubsub' })
+ assert(event.from == publisher_jid)
+ assert(event._type == 'pubsub_event_items')
+ assert(event.items[1].id == publish_item.id)
+ assert(event.items[1].data[1].os == publish_item.data[1].os)
+ assert(event.item.os == publish_item.data[1].os)
+ assert(node:delete())
+
+ -- 7.2 Delete item from a node
+ assert(node:create())
+ assert(subscriber_node:subscribe({ jid = subscriber_jid }))
+ assert(node:publish {items = {publish_item}})
+ assert(node:retract { id = 'item_id', notify = true })
+ assert(node:delete())
+
+ -- 7.2.2.1 Delete and notify
+ assert(node:create())
+ assert(subscriber_node:subscribe({ jid = subscriber_jid }))
+ assert(node:publish {items = {publish_item}})
+ purge_pubsub_events(subscriber)
+ assert(node:retract { id = 'item_id', notify = true })
+ local event = assert(subscriber:get_next_event { type = 'pubsub' })
+ assert(event._type == 'pubsub_event_items')
+ assert(event.retracts[1].id == 'item_id')
+ assert(node:delete())
+
+ -- Publish an unknown element type
+ atom = [[
+ <entry xmlns='http://www.w3.org/2005/Atom'>
+ <title>Down the Rabbit Hole</title>
+ <summary>
+ Alice was beginning to get very tired of sitting by her sister on the
+ bank and of having nothing to do: once or twice she had peeped into the
+ book her sister was reading, but it had no pictures or conversations in
+ it, "and what is the use of a book," thought Alice, "without pictures
+ or conversations?'
+ </summary>
+ <link rel='alternate' type='text/html'
+ href='http://www.gutenberg.org/files/11/11-h/11-h.htm#link2HCH0001'/>
+ <id>tag:gutenberg.org,2008:entry-1234</id>
+ <published>2008-06-25T18:30:02Z</published>
+ <updated>2008-06-25T18:30:02Z</updated>
+ </entry>
+ ]]
+ assert(node:create())
+ assert(subscriber_node:subscribe({ jid = subscriber_jid }))
+ purge_pubsub_events(subscriber)
+ assert(node:publish { item = atom })
+ local event_item = assert(subscriber:get_next_event { type = 'pubsub' }).item
+ assert(event_item._type == 'dom')
+ assert(event_item.ns == 'http://www.w3.org/2005/Atom')
+ assert(event_item.tag == 'entry')
+ assert(node:delete())
+end
+
+--------------------------------------------------------------------------------
+-- 8 Owner Use Cases
+--------------------------------------------------------------------------------
+
+function test_owner_use_cases()
+ node:delete()
+
+ -- 8.1 Create a node
+ -- Create node with default config
+ assert(node:create())
+ configuration = assert(node:get_configuration())['data']
+ assert(node:delete())
+
+ -- Create node with custom config
+ print("Creating with configuration")
+ assert(node:create { configuration = { ['pubsub#access_model'] = 'whitelist' } })
+ configuration = assert(node:get_configuration())['data']
+ assert(configuration['pubsub#access_model']['value'] == 'whitelist')
+ assert(node:delete())
+
+ -- 8.2 Configure node
+ -- Set configuration
+ assert(node:create())
+ assert(node:set_configuration {configuration = {['pubsub#access_model'] = 'whitelist'}})
+ configuration = assert(node:get_configuration())['data']
+ assert(configuration['pubsub#access_model']['value'] == 'whitelist')
+ assert(node:delete())
+
+ -- Untested: 8.2.5.3 Success With Notifications
+
+ -- 8.3 Request Default Node Configuration Options
+ configuration = assert(pubsub:get_default_configuration())['data']
+ assert(configuration['pubsub#access_model'] ~= nil)
+
+ -- 8.4 Delete node
+ -- Without redirection (see above)
+ -- With redirection
+ assert(node:create())
+ assert(subscriber_node:subscribe({ jid = subscriber_jid }))
+ purge_pubsub_events(subscriber)
+ assert(node:delete {redirect = 'foo@bar.com'})
+ -- FIXME: M-Link doesn't send out an event. Test this later.
+ --local event = assert(subscriber:get_next_event { type = 'pubsub' })
+ --print(event)
+ --assert(event._type == 'pubsub_event_items')
+ --assert(event.retracts[1].id == 'item_id')
+
+ -- 8.5 Purge node items
+ assert(node:create())
+ assert(subscriber_node:subscribe({ jid = subscriber_jid }))
+ -- Publishing multiple items doesn't seem to work in M-Link
+ --assert(node:publish {items = { publish_item, publish_item2 }})
+ assert(node:publish {items = {publish_item} })
+ assert(node:publish {items = {publish_item2} })
+ purge_pubsub_events(subscriber)
+ if node:purge() then
+ -- Hasn't worked yet. Add more to this test later (including notifications)
+ else
+ print("Warning: Purge not supported. Skipping test")
+ end
+ assert(node:delete())
+
+ -- 8.6 Manage subscription requests
+ -- TODO
+
+ -- 8.7 Process pending subscription requests
+ -- TODO
+
+ -- 8.8 Manage Subscriptions
+ assert(node:create())
+ assert(subscriber_node:subscribe({ jid = subscriber_jid }))
+ local items = assert(node:get_owner_subscriptions())
+ assert(#items == 1)
+ assert(items[1].jid == subscriber_jid)
+ assert(items[1].subscription == "subscribed")
+ assert(node:delete())
+
+ -- 8.9 Manage Affiliations
+ assert(node:create())
+ assert(node:set_owner_affiliations{affiliations = {{jid = subscriber_jid, type = 'publisher'}}})
+ local items = assert(node:get_owner_affiliations())
+ assert(#items == 2)
+ assert(items[1].jid == publisher_jid)
+ assert(items[1].type == "owner")
+ assert(items[2].jid == subscriber_jid)
+ assert(items[2].type == "publisher")
+ assert(node:delete())
+end
+
+function run_tests()
+ connect_options = {}
+
+ -- Set up publisher & subscriber
+ publisher = sluift.new_client(publisher_jid, os.getenv("SLUIFT_PASS"))
+ assert(publisher:connect(connect_options))
+ subscriber = sluift.new_client(subscriber_jid, os.getenv("SLUIFT_PASS2"))
+ assert(subscriber:connect(connect_options))
+
+ pubsub = publisher:pubsub(pubsub_jid)
+ node = pubsub:node(node_id)
+
+ subscriber_pubsub = subscriber:pubsub(pubsub_jid)
+ subscriber_node = subscriber_pubsub:node(node_id)
+
+ -- The tests
+ test_entity_use_cases()
+ test_subscriber_use_cases()
+ test_publisher_use_cases()
+ test_owner_use_cases()
+end
+
+success, err = pcall(run_tests)
+
+if subscriber then subscriber:disconnect() end
+if publisher then publisher:disconnect() end
+
+if not success then
+ print(err)
+ os.exit(-1)
+end