vines 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +5 -9
- data/Rakefile +11 -9
- data/conf/config.rb +30 -4
- data/lib/vines/cluster/connection.rb +26 -0
- data/lib/vines/cluster/publisher.rb +55 -0
- data/lib/vines/cluster/pubsub.rb +92 -0
- data/lib/vines/cluster/sessions.rb +125 -0
- data/lib/vines/cluster/subscriber.rb +108 -0
- data/lib/vines/cluster.rb +246 -0
- data/lib/vines/command/init.rb +21 -24
- data/lib/vines/config/host.rb +48 -8
- data/lib/vines/config/port.rb +5 -0
- data/lib/vines/config/pubsub.rb +108 -0
- data/lib/vines/config.rb +74 -20
- data/lib/vines/jid.rb +14 -0
- data/lib/vines/router.rb +69 -55
- data/lib/vines/stanza/iq/disco_info.rb +22 -9
- data/lib/vines/stanza/iq/disco_items.rb +6 -3
- data/lib/vines/stanza/iq/ping.rb +1 -1
- data/lib/vines/stanza/iq/private_storage.rb +4 -8
- data/lib/vines/stanza/iq/roster.rb +6 -14
- data/lib/vines/stanza/iq/session.rb +2 -7
- data/lib/vines/stanza/iq/vcard.rb +4 -6
- data/lib/vines/stanza/iq/version.rb +1 -1
- data/lib/vines/stanza/iq.rb +8 -10
- data/lib/vines/stanza/presence/subscribe.rb +3 -11
- data/lib/vines/stanza/presence/subscribed.rb +16 -29
- data/lib/vines/stanza/presence/unsubscribe.rb +3 -15
- data/lib/vines/stanza/presence/unsubscribed.rb +3 -16
- data/lib/vines/stanza/presence.rb +30 -0
- data/lib/vines/stanza/pubsub/create.rb +39 -0
- data/lib/vines/stanza/pubsub/delete.rb +41 -0
- data/lib/vines/stanza/pubsub/publish.rb +66 -0
- data/lib/vines/stanza/pubsub/subscribe.rb +44 -0
- data/lib/vines/stanza/pubsub/unsubscribe.rb +30 -0
- data/lib/vines/stanza/pubsub.rb +22 -0
- data/lib/vines/stanza.rb +72 -22
- data/lib/vines/storage/couchdb.rb +46 -65
- data/lib/vines/storage/local.rb +20 -14
- data/lib/vines/storage/mongodb.rb +132 -0
- data/lib/vines/storage/null.rb +39 -0
- data/lib/vines/storage/redis.rb +61 -68
- data/lib/vines/storage/sql.rb +73 -69
- data/lib/vines/storage.rb +1 -1
- data/lib/vines/stream/client/bind.rb +2 -2
- data/lib/vines/stream/client/session.rb +71 -16
- data/lib/vines/stream/component/handshake.rb +1 -0
- data/lib/vines/stream/component/ready.rb +2 -2
- data/lib/vines/stream/http/session.rb +2 -0
- data/lib/vines/stream/http.rb +0 -6
- data/lib/vines/stream/server/final_restart.rb +1 -0
- data/lib/vines/stream/server/outbound/final_features.rb +1 -0
- data/lib/vines/stream/server/ready.rb +6 -2
- data/lib/vines/stream/server.rb +4 -3
- data/lib/vines/stream.rb +10 -6
- data/lib/vines/version.rb +1 -1
- data/lib/vines.rb +48 -22
- data/test/cluster/publisher_test.rb +45 -0
- data/test/cluster/sessions_test.rb +54 -0
- data/test/cluster/subscriber_test.rb +94 -0
- data/test/config/host_test.rb +100 -21
- data/test/config/pubsub_test.rb +181 -0
- data/test/config_test.rb +225 -43
- data/test/jid_test.rb +7 -0
- data/test/router_test.rb +181 -9
- data/test/stanza/iq/disco_info_test.rb +8 -6
- data/test/stanza/iq/disco_items_test.rb +3 -3
- data/test/stanza/iq/private_storage_test.rb +8 -19
- data/test/stanza/iq/roster_test.rb +1 -1
- data/test/stanza/iq/session_test.rb +3 -6
- data/test/stanza/iq/vcard_test.rb +6 -2
- data/test/stanza/iq/version_test.rb +3 -2
- data/test/stanza/iq_test.rb +5 -5
- data/test/stanza/message_test.rb +3 -2
- data/test/stanza/presence/probe_test.rb +2 -1
- data/test/stanza/pubsub/create_test.rb +138 -0
- data/test/stanza/pubsub/delete_test.rb +142 -0
- data/test/stanza/pubsub/publish_test.rb +373 -0
- data/test/stanza/pubsub/subscribe_test.rb +186 -0
- data/test/stanza/pubsub/unsubscribe_test.rb +179 -0
- data/test/stanza_test.rb +2 -1
- data/test/storage/local_test.rb +26 -25
- data/test/storage/mock_mongo.rb +40 -0
- data/test/storage/mock_redis.rb +98 -0
- data/test/storage/mongodb_test.rb +81 -0
- data/test/storage/null_test.rb +30 -0
- data/test/storage/redis_test.rb +3 -36
- data/test/stream/component/handshake_test.rb +4 -0
- data/test/stream/component/ready_test.rb +2 -1
- data/test/stream/server/ready_test.rb +7 -1
- data/web/404.html +5 -3
- data/web/chat/coffeescripts/chat.coffee +9 -5
- data/web/chat/javascripts/app.js +1 -1
- data/web/chat/javascripts/chat.js +14 -8
- data/web/chat/stylesheets/chat.css +4 -1
- data/web/lib/coffeescripts/button.coffee +9 -5
- data/web/lib/coffeescripts/filter.coffee +1 -1
- data/web/lib/coffeescripts/login.coffee +14 -1
- data/web/lib/coffeescripts/session.coffee +8 -11
- data/web/lib/images/dark-gray.png +0 -0
- data/web/lib/images/light-gray.png +0 -0
- data/web/lib/images/logo-large.png +0 -0
- data/web/lib/images/logo-small.png +0 -0
- data/web/lib/images/white.png +0 -0
- data/web/lib/javascripts/base.js +9 -8
- data/web/lib/javascripts/button.js +20 -12
- data/web/lib/javascripts/filter.js +1 -1
- data/web/lib/javascripts/icons.js +7 -1
- data/web/lib/javascripts/jquery.js +4 -4
- data/web/lib/javascripts/login.js +16 -2
- data/web/lib/javascripts/raphael.js +5 -7
- data/web/lib/javascripts/session.js +10 -14
- data/web/lib/stylesheets/base.css +7 -11
- data/web/lib/stylesheets/login.css +31 -27
- metadata +100 -34
data/lib/vines.rb
CHANGED
@@ -2,26 +2,34 @@
|
|
2
2
|
|
3
3
|
module Vines
|
4
4
|
NAMESPACES = {
|
5
|
-
:stream
|
6
|
-
:client
|
7
|
-
:server
|
8
|
-
:component
|
9
|
-
:roster
|
10
|
-
:non_sasl
|
11
|
-
:storage
|
12
|
-
:version
|
13
|
-
:sasl
|
14
|
-
:tls
|
15
|
-
:bind
|
16
|
-
:session
|
17
|
-
:ping
|
18
|
-
:
|
19
|
-
:
|
20
|
-
:
|
21
|
-
:
|
22
|
-
:
|
23
|
-
:
|
24
|
-
:
|
5
|
+
:stream => 'http://etherx.jabber.org/streams'.freeze,
|
6
|
+
:client => 'jabber:client'.freeze,
|
7
|
+
:server => 'jabber:server'.freeze,
|
8
|
+
:component => 'jabber:component:accept'.freeze,
|
9
|
+
:roster => 'jabber:iq:roster'.freeze,
|
10
|
+
:non_sasl => 'jabber:iq:auth'.freeze,
|
11
|
+
:storage => 'jabber:iq:private'.freeze,
|
12
|
+
:version => 'jabber:iq:version'.freeze,
|
13
|
+
:sasl => 'urn:ietf:params:xml:ns:xmpp-sasl'.freeze,
|
14
|
+
:tls => 'urn:ietf:params:xml:ns:xmpp-tls'.freeze,
|
15
|
+
:bind => 'urn:ietf:params:xml:ns:xmpp-bind'.freeze,
|
16
|
+
:session => 'urn:ietf:params:xml:ns:xmpp-session'.freeze,
|
17
|
+
:ping => 'urn:xmpp:ping'.freeze,
|
18
|
+
:pubsub => 'http://jabber.org/protocol/pubsub'.freeze,
|
19
|
+
:pubsub_event => 'http://jabber.org/protocol/pubsub#event'.freeze,
|
20
|
+
:pubsub_create => 'http://jabber.org/protocol/pubsub#create-nodes'.freeze,
|
21
|
+
:pubsub_delete => 'http://jabber.org/protocol/pubsub#delete-nodes'.freeze,
|
22
|
+
:pubsub_instant => 'http://jabber.org/protocol/pubsub#instant-nodes'.freeze,
|
23
|
+
:pubsub_item_ids => 'http://jabber.org/protocol/pubsub#item-ids'.freeze,
|
24
|
+
:pubsub_publish => 'http://jabber.org/protocol/pubsub#publish'.freeze,
|
25
|
+
:pubsub_subscribe => 'http://jabber.org/protocol/pubsub#subscribe'.freeze,
|
26
|
+
:disco_items => 'http://jabber.org/protocol/disco#items'.freeze,
|
27
|
+
:disco_info => 'http://jabber.org/protocol/disco#info'.freeze,
|
28
|
+
:http_bind => 'http://jabber.org/protocol/httpbind'.freeze,
|
29
|
+
:bosh => 'urn:xmpp:xbosh'.freeze,
|
30
|
+
:vcard => 'vcard-temp'.freeze,
|
31
|
+
:si => 'http://jabber.org/protocol/si'.freeze,
|
32
|
+
:byte_streams => 'http://jabber.org/protocol/bytestreams'.freeze
|
25
33
|
}.freeze
|
26
34
|
|
27
35
|
module Log
|
@@ -47,21 +55,23 @@ module Vines
|
|
47
55
|
end
|
48
56
|
|
49
57
|
%w[
|
50
|
-
resolv-replace
|
51
58
|
active_record
|
52
59
|
base64
|
53
60
|
bcrypt
|
54
61
|
digest/sha1
|
55
62
|
em-http
|
56
|
-
em-
|
63
|
+
em-hiredis
|
57
64
|
eventmachine
|
58
65
|
fiber
|
59
66
|
fileutils
|
60
67
|
http/parser
|
61
68
|
logger
|
69
|
+
mongo
|
62
70
|
net/ldap
|
63
71
|
nokogiri
|
64
72
|
openssl
|
73
|
+
resolv
|
74
|
+
set
|
65
75
|
socket
|
66
76
|
uri
|
67
77
|
yaml
|
@@ -92,17 +102,26 @@ end
|
|
92
102
|
vines/stanza/presence/unavailable
|
93
103
|
vines/stanza/presence/unsubscribe
|
94
104
|
vines/stanza/presence/unsubscribed
|
105
|
+
vines/stanza/pubsub
|
106
|
+
vines/stanza/pubsub/create
|
107
|
+
vines/stanza/pubsub/delete
|
108
|
+
vines/stanza/pubsub/publish
|
109
|
+
vines/stanza/pubsub/subscribe
|
110
|
+
vines/stanza/pubsub/unsubscribe
|
95
111
|
|
96
112
|
vines/storage
|
97
113
|
vines/storage/couchdb
|
98
114
|
vines/storage/ldap
|
99
115
|
vines/storage/local
|
116
|
+
vines/storage/mongodb
|
117
|
+
vines/storage/null
|
100
118
|
vines/storage/redis
|
101
119
|
vines/storage/sql
|
102
120
|
|
103
121
|
vines/config
|
104
122
|
vines/config/host
|
105
123
|
vines/config/port
|
124
|
+
vines/config/pubsub
|
106
125
|
|
107
126
|
vines/store
|
108
127
|
vines/contact
|
@@ -115,6 +134,13 @@ end
|
|
115
134
|
vines/version
|
116
135
|
vines/xmpp_server
|
117
136
|
|
137
|
+
vines/cluster
|
138
|
+
vines/cluster/connection
|
139
|
+
vines/cluster/publisher
|
140
|
+
vines/cluster/pubsub
|
141
|
+
vines/cluster/sessions
|
142
|
+
vines/cluster/subscriber
|
143
|
+
|
118
144
|
vines/stream
|
119
145
|
vines/stream/state
|
120
146
|
vines/stream/parser
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'vines'
|
4
|
+
require 'minitest/autorun'
|
5
|
+
|
6
|
+
class ClusterPublisherTest < MiniTest::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
@connection = MiniTest::Mock.new
|
9
|
+
@cluster = MiniTest::Mock.new
|
10
|
+
@cluster.expect(:id, 'abc')
|
11
|
+
@cluster.expect(:connection, @connection)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_broadcast
|
15
|
+
msg = {from: 'abc', type: 'online', time: Time.now.to_i}.to_json
|
16
|
+
@connection.expect(:publish, nil, ["cluster:nodes:all", msg])
|
17
|
+
|
18
|
+
publisher = Vines::Cluster::Publisher.new(@cluster)
|
19
|
+
publisher.broadcast(:online)
|
20
|
+
assert @connection.verify
|
21
|
+
assert @cluster.verify
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_route
|
25
|
+
stanza = "<message>hello</message>"
|
26
|
+
msg = {from: 'abc', type: 'stanza', stanza: stanza}.to_json
|
27
|
+
@connection.expect(:publish, nil, ["cluster:nodes:node-42", msg])
|
28
|
+
|
29
|
+
publisher = Vines::Cluster::Publisher.new(@cluster)
|
30
|
+
publisher.route(stanza, "node-42")
|
31
|
+
assert @connection.verify
|
32
|
+
assert @cluster.verify
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_update_user
|
36
|
+
jid = Vines::JID.new('alice@wonderland.lit')
|
37
|
+
msg = {from: 'abc', type: 'user', jid: jid.to_s}.to_json
|
38
|
+
@connection.expect(:publish, nil, ["cluster:nodes:node-42", msg])
|
39
|
+
|
40
|
+
publisher = Vines::Cluster::Publisher.new(@cluster)
|
41
|
+
publisher.update_user(jid, "node-42")
|
42
|
+
assert @connection.verify
|
43
|
+
assert @cluster.verify
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'vines'
|
4
|
+
require 'ext/nokogiri'
|
5
|
+
require 'storage/storage_tests'
|
6
|
+
require 'storage/mock_redis'
|
7
|
+
require 'minitest/autorun'
|
8
|
+
|
9
|
+
class ClusterSessionsTest < MiniTest::Unit::TestCase
|
10
|
+
def setup
|
11
|
+
@connection = MockRedis.new
|
12
|
+
@cluster = MiniTest::Mock.new
|
13
|
+
@cluster.expect(:connection, @connection)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_save
|
17
|
+
StorageTests::EMLoop.new do
|
18
|
+
@cluster.expect(:id, 'abc')
|
19
|
+
jid1 = 'alice@wonderland.lit/tea'
|
20
|
+
jid2 = 'alice@wonderland.lit/cake'
|
21
|
+
sessions = Vines::Cluster::Sessions.new(@cluster)
|
22
|
+
sessions.save(jid1, {available: true, interested: true})
|
23
|
+
sessions.save(jid2, {available: false, interested: false})
|
24
|
+
EM.next_tick do
|
25
|
+
session1 = {node: 'abc', available: true, interested: true}
|
26
|
+
session2 = {node: 'abc', available: false, interested: false}
|
27
|
+
assert_equal 2, @connection.db["sessions:alice@wonderland.lit"].size
|
28
|
+
assert_equal session1.to_json, @connection.db["sessions:alice@wonderland.lit"]['tea']
|
29
|
+
assert_equal session2.to_json, @connection.db["sessions:alice@wonderland.lit"]['cake']
|
30
|
+
assert_equal [jid1, jid2], @connection.db["cluster:nodes:abc"].to_a
|
31
|
+
assert @cluster.verify
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_delete
|
37
|
+
StorageTests::EMLoop.new do
|
38
|
+
jid1 = 'alice@wonderland.lit/tea'
|
39
|
+
jid2 = 'alice@wonderland.lit/cake'
|
40
|
+
@connection.db["sessions:alice@wonderland.lit"] = {}
|
41
|
+
@connection.db["sessions:alice@wonderland.lit"]['tea'] = {node: 'abc', available: true}.to_json
|
42
|
+
@connection.db["sessions:alice@wonderland.lit"]['cake'] = {node: 'abc', available: true}.to_json
|
43
|
+
@connection.db["cluster:nodes:abc"] = Set.new([jid1, jid2])
|
44
|
+
|
45
|
+
sessions = Vines::Cluster::Sessions.new(@cluster)
|
46
|
+
sessions.delete(jid1)
|
47
|
+
EM.next_tick do
|
48
|
+
assert_equal 1, @connection.db["sessions:alice@wonderland.lit"].size
|
49
|
+
assert_equal [jid2], @connection.db["cluster:nodes:abc"].to_a
|
50
|
+
assert @cluster.verify
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'vines'
|
4
|
+
require 'ext/nokogiri'
|
5
|
+
require 'minitest/autorun'
|
6
|
+
|
7
|
+
class ClusterSubscriberTest < MiniTest::Unit::TestCase
|
8
|
+
def setup
|
9
|
+
@connection = MiniTest::Mock.new
|
10
|
+
@cluster = MiniTest::Mock.new
|
11
|
+
@cluster.expect(:id, 'abc')
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_subscribe
|
15
|
+
@cluster.expect(:connect, @connection)
|
16
|
+
@connection.expect(:subscribe, nil, ['cluster:nodes:all'])
|
17
|
+
@connection.expect(:subscribe, nil, ['cluster:nodes:abc'])
|
18
|
+
@connection.expect(:on, nil, [:message])
|
19
|
+
subscriber = Vines::Cluster::Subscriber.new(@cluster)
|
20
|
+
subscriber.subscribe
|
21
|
+
assert @connection.verify
|
22
|
+
assert @cluster.verify
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_heartbeat
|
26
|
+
now = Time.now.to_i
|
27
|
+
msg = {from: 'node-42', type: 'heartbeat', time: now}.to_json
|
28
|
+
@cluster.expect(:poke, nil, ['node-42', now])
|
29
|
+
|
30
|
+
subscriber = Vines::Cluster::Subscriber.new(@cluster)
|
31
|
+
subscriber.send(:on_message, 'cluster:nodes:all', msg)
|
32
|
+
assert @connection.verify
|
33
|
+
assert @cluster.verify
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_online
|
37
|
+
now = Time.now.to_i
|
38
|
+
msg = {from: 'node-42', type: 'online', time: now}.to_json
|
39
|
+
@cluster.expect(:poke, nil, ['node-42', now])
|
40
|
+
|
41
|
+
subscriber = Vines::Cluster::Subscriber.new(@cluster)
|
42
|
+
subscriber.send(:on_message, 'cluster:nodes:all', msg)
|
43
|
+
assert @connection.verify
|
44
|
+
assert @cluster.verify
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_offline
|
48
|
+
now = Time.now.to_i
|
49
|
+
msg = {from: 'node-42', type: 'offline', time: now}.to_json
|
50
|
+
@cluster.expect(:delete_sessions, nil, ['node-42'])
|
51
|
+
|
52
|
+
subscriber = Vines::Cluster::Subscriber.new(@cluster)
|
53
|
+
subscriber.send(:on_message, 'cluster:nodes:all', msg)
|
54
|
+
assert @connection.verify
|
55
|
+
assert @cluster.verify
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_route_stanza
|
59
|
+
stanza = "<message to='alice@wonderland.lit/tea'>hello</message>"
|
60
|
+
node = Nokogiri::XML(stanza).root rescue nil
|
61
|
+
msg = {from: 'node-42', type: 'stanza', stanza: stanza}.to_json
|
62
|
+
|
63
|
+
stream = MiniTest::Mock.new
|
64
|
+
stream.expect(:write, nil, [node])
|
65
|
+
@cluster.expect(:connected_resources, [stream], ['alice@wonderland.lit/tea'])
|
66
|
+
|
67
|
+
subscriber = Vines::Cluster::Subscriber.new(@cluster)
|
68
|
+
subscriber.send(:on_message, 'cluster:nodes:abc', msg)
|
69
|
+
assert stream.verify
|
70
|
+
assert @connection.verify
|
71
|
+
assert @cluster.verify
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_update_user
|
75
|
+
alice = Vines::User.new(jid: 'alice@wonderland.lit/tea')
|
76
|
+
msg = {from: 'node-42', type: 'user', jid: alice.jid.to_s}.to_json
|
77
|
+
|
78
|
+
storage = MiniTest::Mock.new
|
79
|
+
storage.expect(:find_user, alice, [alice.jid.bare])
|
80
|
+
|
81
|
+
stream = MiniTest::Mock.new
|
82
|
+
stream.expect(:user, alice)
|
83
|
+
|
84
|
+
@cluster.expect(:storage, storage, ['wonderland.lit'])
|
85
|
+
@cluster.expect(:connected_resources, [stream], [alice.jid.bare])
|
86
|
+
|
87
|
+
subscriber = Vines::Cluster::Subscriber.new(@cluster)
|
88
|
+
subscriber.send(:on_message, 'cluster:nodes:abc', msg)
|
89
|
+
assert storage.verify
|
90
|
+
assert stream.verify
|
91
|
+
assert @connection.verify
|
92
|
+
assert @cluster.verify
|
93
|
+
end
|
94
|
+
end
|
data/test/config/host_test.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
|
+
require 'tmpdir'
|
3
4
|
require 'vines'
|
4
5
|
require 'minitest/autorun'
|
5
6
|
|
@@ -30,8 +31,8 @@ class HostTest < MiniTest::Unit::TestCase
|
|
30
31
|
assert_raises(RuntimeError) do
|
31
32
|
Vines::Config.new do
|
32
33
|
host 'wonderland.lit' do
|
33
|
-
storage('fs') { dir
|
34
|
-
storage('fs') { dir
|
34
|
+
storage('fs') { dir Dir.tmpdir }
|
35
|
+
storage('fs') { dir Dir.tmpdir }
|
35
36
|
end
|
36
37
|
end
|
37
38
|
end
|
@@ -41,7 +42,7 @@ class HostTest < MiniTest::Unit::TestCase
|
|
41
42
|
config = Vines::Config.new do
|
42
43
|
host 'wonderland.lit' do
|
43
44
|
storage 'fs' do
|
44
|
-
dir
|
45
|
+
dir Dir.tmpdir
|
45
46
|
end
|
46
47
|
end
|
47
48
|
end
|
@@ -51,7 +52,7 @@ class HostTest < MiniTest::Unit::TestCase
|
|
51
52
|
def test_ldap_added_to_storage
|
52
53
|
config = Vines::Config.new do
|
53
54
|
host 'wonderland.lit' do
|
54
|
-
storage(:fs) { dir
|
55
|
+
storage(:fs) { dir Dir.tmpdir }
|
55
56
|
# added after storage
|
56
57
|
ldap 'ldap.wonderland.lit', 1636 do
|
57
58
|
tls true
|
@@ -76,7 +77,7 @@ class HostTest < MiniTest::Unit::TestCase
|
|
76
77
|
name_attr 'cn'
|
77
78
|
end
|
78
79
|
# added before storage
|
79
|
-
storage(:fs) { dir
|
80
|
+
storage(:fs) { dir Dir.tmpdir }
|
80
81
|
end
|
81
82
|
end
|
82
83
|
%w[wonderland.lit verona.lit].each do |domain|
|
@@ -89,7 +90,7 @@ class HostTest < MiniTest::Unit::TestCase
|
|
89
90
|
assert_raises(RuntimeError) do
|
90
91
|
Vines::Config.new do
|
91
92
|
host 'wonderland.lit' do
|
92
|
-
storage(:fs) { dir
|
93
|
+
storage(:fs) { dir Dir.tmpdir }
|
93
94
|
components '' => 'secr3t'
|
94
95
|
end
|
95
96
|
end
|
@@ -100,7 +101,7 @@ class HostTest < MiniTest::Unit::TestCase
|
|
100
101
|
assert_raises(RuntimeError) do
|
101
102
|
Vines::Config.new do
|
102
103
|
host 'wonderland.lit' do
|
103
|
-
storage(:fs) { dir
|
104
|
+
storage(:fs) { dir Dir.tmpdir }
|
104
105
|
components nil => 'secr3t'
|
105
106
|
end
|
106
107
|
end
|
@@ -111,7 +112,7 @@ class HostTest < MiniTest::Unit::TestCase
|
|
111
112
|
assert_raises(RuntimeError) do
|
112
113
|
Vines::Config.new do
|
113
114
|
host 'wonderland.lit' do
|
114
|
-
storage(:fs) { dir
|
115
|
+
storage(:fs) { dir Dir.tmpdir }
|
115
116
|
components 'tea' => ''
|
116
117
|
end
|
117
118
|
end
|
@@ -122,7 +123,7 @@ class HostTest < MiniTest::Unit::TestCase
|
|
122
123
|
assert_raises(RuntimeError) do
|
123
124
|
Vines::Config.new do
|
124
125
|
host 'wonderland.lit' do
|
125
|
-
storage(:fs) { dir
|
126
|
+
storage(:fs) { dir Dir.tmpdir }
|
126
127
|
components 'tea' => nil
|
127
128
|
end
|
128
129
|
end
|
@@ -133,7 +134,7 @@ class HostTest < MiniTest::Unit::TestCase
|
|
133
134
|
assert_raises(RuntimeError) do
|
134
135
|
Vines::Config.new do
|
135
136
|
host 'wonderland.lit' do
|
136
|
-
storage(:fs) { dir
|
137
|
+
storage(:fs) { dir Dir.tmpdir }
|
137
138
|
components 'tea' => 'one'
|
138
139
|
components 'TEA' => 'two'
|
139
140
|
end
|
@@ -145,7 +146,7 @@ class HostTest < MiniTest::Unit::TestCase
|
|
145
146
|
assert_raises(RuntimeError) do
|
146
147
|
Vines::Config.new do
|
147
148
|
host 'wonderland.lit' do
|
148
|
-
storage(:fs) { dir
|
149
|
+
storage(:fs) { dir Dir.tmpdir }
|
149
150
|
components 'tea' => 'one', 'TEA' => 'two'
|
150
151
|
end
|
151
152
|
end
|
@@ -156,7 +157,7 @@ class HostTest < MiniTest::Unit::TestCase
|
|
156
157
|
assert_raises(RuntimeError) do
|
157
158
|
Vines::Config.new do
|
158
159
|
host 'wonderland.lit' do
|
159
|
-
storage(:fs) { dir
|
160
|
+
storage(:fs) { dir Dir.tmpdir }
|
160
161
|
components 'tea' => 'one'
|
161
162
|
components :TEA => 'two'
|
162
163
|
end
|
@@ -168,7 +169,7 @@ class HostTest < MiniTest::Unit::TestCase
|
|
168
169
|
assert_raises(ArgumentError) do
|
169
170
|
Vines::Config.new do
|
170
171
|
host 'wonderland.lit ' do
|
171
|
-
storage(:fs) { dir
|
172
|
+
storage(:fs) { dir Dir.tmpdir }
|
172
173
|
end
|
173
174
|
end
|
174
175
|
end
|
@@ -178,7 +179,7 @@ class HostTest < MiniTest::Unit::TestCase
|
|
178
179
|
assert_raises(RuntimeError) do
|
179
180
|
Vines::Config.new do
|
180
181
|
host 'alice@wonderland.lit' do
|
181
|
-
storage(:fs) { dir
|
182
|
+
storage(:fs) { dir Dir.tmpdir }
|
182
183
|
end
|
183
184
|
end
|
184
185
|
end
|
@@ -188,7 +189,7 @@ class HostTest < MiniTest::Unit::TestCase
|
|
188
189
|
assert_raises(ArgumentError) do
|
189
190
|
Vines::Config.new do
|
190
191
|
host 'wonderland.lit' do
|
191
|
-
storage(:fs) { dir
|
192
|
+
storage(:fs) { dir Dir.tmpdir }
|
192
193
|
components 'exam ple' => 'one'
|
193
194
|
end
|
194
195
|
end
|
@@ -199,7 +200,7 @@ class HostTest < MiniTest::Unit::TestCase
|
|
199
200
|
assert_raises(RuntimeError) do
|
200
201
|
Vines::Config.new do
|
201
202
|
host 'wonderland.lit' do
|
202
|
-
storage(:fs) { dir
|
203
|
+
storage(:fs) { dir Dir.tmpdir }
|
203
204
|
components 'alice@example' => 'one'
|
204
205
|
end
|
205
206
|
end
|
@@ -210,7 +211,7 @@ class HostTest < MiniTest::Unit::TestCase
|
|
210
211
|
assert_raises(RuntimeError) do
|
211
212
|
Vines::Config.new do
|
212
213
|
host 'wonderland.lit' do
|
213
|
-
storage(:fs) { dir
|
214
|
+
storage(:fs) { dir Dir.tmpdir }
|
214
215
|
components 'exam.ple' => 'one'
|
215
216
|
end
|
216
217
|
end
|
@@ -220,7 +221,7 @@ class HostTest < MiniTest::Unit::TestCase
|
|
220
221
|
def test_case_insensitive_component_name
|
221
222
|
config = Vines::Config.new do
|
222
223
|
host 'WONDERLAND.LIT' do
|
223
|
-
storage(:fs) { dir
|
224
|
+
storage(:fs) { dir Dir.tmpdir }
|
224
225
|
components 'TEA' => 'secr3t', CAKE: 'Passw0rd'
|
225
226
|
end
|
226
227
|
end
|
@@ -234,7 +235,7 @@ class HostTest < MiniTest::Unit::TestCase
|
|
234
235
|
def test_component?
|
235
236
|
config = Vines::Config.new do
|
236
237
|
host 'wonderland.lit' do
|
237
|
-
storage(:fs) { dir
|
238
|
+
storage(:fs) { dir Dir.tmpdir }
|
238
239
|
components 'tea' => 'secr3t', cake: 'passw0rd'
|
239
240
|
end
|
240
241
|
end
|
@@ -244,6 +245,7 @@ class HostTest < MiniTest::Unit::TestCase
|
|
244
245
|
refute host.component?('tea')
|
245
246
|
refute host.component?(:cake)
|
246
247
|
assert host.component?('tea.wonderland.lit')
|
248
|
+
assert host.component?(Vines::JID.new('tea.wonderland.lit'))
|
247
249
|
assert host.component?('cake.wonderland.lit')
|
248
250
|
assert_nil host.password(nil)
|
249
251
|
assert_nil host.password('bogus')
|
@@ -256,6 +258,7 @@ class HostTest < MiniTest::Unit::TestCase
|
|
256
258
|
refute config.component?('tea')
|
257
259
|
refute config.component?('bogus')
|
258
260
|
assert config.component?('tea.wonderland.lit')
|
261
|
+
assert config.component?(Vines::JID.new('tea.wonderland.lit'))
|
259
262
|
assert config.component?('cake.wonderland.lit')
|
260
263
|
assert config.component?('tea.wonderland.lit', 'cake.wonderland.lit')
|
261
264
|
refute config.component?('tea.wonderland.lit', 'bogus.wonderland.lit')
|
@@ -266,10 +269,83 @@ class HostTest < MiniTest::Unit::TestCase
|
|
266
269
|
assert_equal 'passw0rd', config.component_password('cake.wonderland.lit')
|
267
270
|
end
|
268
271
|
|
272
|
+
def test_invalid_pubsub_domain_raises
|
273
|
+
assert_raises(ArgumentError) do
|
274
|
+
Vines::Config.new do
|
275
|
+
host 'wonderland.lit' do
|
276
|
+
storage(:fs) { dir Dir.tmpdir }
|
277
|
+
pubsub 'exam ple'
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
def test_invalid_jid_pubsub_domain_raises
|
284
|
+
assert_raises(RuntimeError) do
|
285
|
+
Vines::Config.new do
|
286
|
+
host 'wonderland.lit' do
|
287
|
+
storage(:fs) { dir Dir.tmpdir }
|
288
|
+
pubsub 'alice@example'
|
289
|
+
end
|
290
|
+
end
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
def test_multi_subdomain_pubsub_raises
|
295
|
+
assert_raises(RuntimeError) do
|
296
|
+
Vines::Config.new do
|
297
|
+
host 'wonderland.lit' do
|
298
|
+
storage(:fs) { dir Dir.tmpdir }
|
299
|
+
pubsub 'exam.ple'
|
300
|
+
end
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
def test_case_insensitive_pubsub_name
|
306
|
+
config = Vines::Config.new do
|
307
|
+
host 'WONDERLAND.LIT' do
|
308
|
+
storage(:fs) { dir Dir.tmpdir }
|
309
|
+
pubsub 'TEA', :CAKE
|
310
|
+
end
|
311
|
+
end
|
312
|
+
host = config.vhosts['wonderland.lit']
|
313
|
+
refute_nil host
|
314
|
+
assert_equal 2, host.pubsubs.size
|
315
|
+
refute_nil host.pubsubs['tea.wonderland.lit']
|
316
|
+
refute_nil host.pubsubs['cake.wonderland.lit']
|
317
|
+
end
|
318
|
+
|
319
|
+
def test_pubsub?
|
320
|
+
config = Vines::Config.new do
|
321
|
+
host 'wonderland.lit' do
|
322
|
+
storage(:fs) { dir Dir.tmpdir }
|
323
|
+
pubsub 'tea', :cake
|
324
|
+
end
|
325
|
+
end
|
326
|
+
host = config.vhosts['wonderland.lit']
|
327
|
+
refute_nil host
|
328
|
+
refute host.pubsub?(nil)
|
329
|
+
refute host.pubsub?('tea')
|
330
|
+
refute host.pubsub?(:cake)
|
331
|
+
assert host.pubsub?('tea.wonderland.lit')
|
332
|
+
assert host.pubsub?(Vines::JID.new('tea.wonderland.lit'))
|
333
|
+
assert host.pubsub?('cake.wonderland.lit')
|
334
|
+
assert_equal ['tea.wonderland.lit', 'cake.wonderland.lit'], host.pubsubs.keys
|
335
|
+
|
336
|
+
refute config.pubsub?(nil)
|
337
|
+
refute config.pubsub?('tea')
|
338
|
+
refute config.pubsub?('bogus')
|
339
|
+
assert config.pubsub?('tea.wonderland.lit')
|
340
|
+
assert config.pubsub?(Vines::JID.new('tea.wonderland.lit'))
|
341
|
+
assert config.pubsub?('cake.wonderland.lit')
|
342
|
+
refute config.pubsub?('alice@cake.wonderland.lit')
|
343
|
+
end
|
344
|
+
|
269
345
|
def test_default_private_storage_is_off
|
270
346
|
config = Vines::Config.new do
|
271
347
|
host 'wonderland.lit' do
|
272
|
-
storage(:fs) { dir
|
348
|
+
storage(:fs) { dir Dir.tmpdir }
|
273
349
|
end
|
274
350
|
end
|
275
351
|
host = config.vhosts['wonderland.lit']
|
@@ -281,12 +357,15 @@ class HostTest < MiniTest::Unit::TestCase
|
|
281
357
|
config = Vines::Config.new do
|
282
358
|
host 'wonderland.lit' do
|
283
359
|
private_storage true
|
284
|
-
storage(:fs) { dir
|
360
|
+
storage(:fs) { dir Dir.tmpdir }
|
285
361
|
end
|
286
362
|
end
|
287
363
|
host = config.vhosts['wonderland.lit']
|
288
364
|
refute_nil host
|
289
365
|
assert host.private_storage?
|
290
366
|
assert config.private_storage?('wonderland.lit')
|
367
|
+
assert config.private_storage?(Vines::JID.new('wonderland.lit'))
|
368
|
+
refute config.private_storage?(Vines::JID.new('alice@wonderland.lit'))
|
369
|
+
refute config.private_storage?(nil)
|
291
370
|
end
|
292
371
|
end
|