vines 0.4.5 → 0.4.6

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.
Files changed (89) hide show
  1. data/Gemfile +3 -0
  2. data/README.md +48 -0
  3. data/Rakefile +6 -58
  4. data/bin/vines +12 -2
  5. data/conf/certs/ca-bundle.crt +568 -39
  6. data/conf/config.rb +9 -42
  7. data/lib/vines.rb +1 -8
  8. data/lib/vines/command/cert.rb +4 -4
  9. data/lib/vines/command/init.rb +3 -3
  10. data/lib/vines/config.rb +9 -0
  11. data/lib/vines/kit.rb +2 -7
  12. data/lib/vines/storage/local.rb +50 -17
  13. data/lib/vines/store.rb +6 -4
  14. data/lib/vines/stream.rb +1 -1
  15. data/lib/vines/stream/http/session.rb +0 -0
  16. data/lib/vines/stream/http/sessions.rb +0 -0
  17. data/lib/vines/stream/parser.rb +3 -2
  18. data/lib/vines/token_bucket.rb +19 -10
  19. data/lib/vines/version.rb +1 -1
  20. data/test/cluster/publisher_test.rb +45 -33
  21. data/test/cluster/sessions_test.rb +32 -39
  22. data/test/cluster/subscriber_test.rb +93 -78
  23. data/test/config/host_test.rb +2 -4
  24. data/test/config/pubsub_test.rb +132 -126
  25. data/test/config_test.rb +2 -4
  26. data/test/contact_test.rb +80 -66
  27. data/test/error_test.rb +54 -55
  28. data/test/jid_test.rb +1 -2
  29. data/test/kit_test.rb +22 -17
  30. data/test/router_test.rb +187 -146
  31. data/test/stanza/iq/disco_info_test.rb +59 -59
  32. data/test/stanza/iq/disco_items_test.rb +36 -34
  33. data/test/stanza/iq/private_storage_test.rb +138 -143
  34. data/test/stanza/iq/roster_test.rb +198 -175
  35. data/test/stanza/iq/session_test.rb +17 -18
  36. data/test/stanza/iq/vcard_test.rb +117 -116
  37. data/test/stanza/iq/version_test.rb +47 -46
  38. data/test/stanza/iq_test.rb +53 -49
  39. data/test/stanza/message_test.rb +92 -89
  40. data/test/stanza/presence/probe_test.rb +2 -5
  41. data/test/stanza/presence/subscribe_test.rb +67 -54
  42. data/test/stanza/pubsub/create_test.rb +86 -108
  43. data/test/stanza/pubsub/delete_test.rb +141 -114
  44. data/test/stanza/pubsub/publish_test.rb +256 -320
  45. data/test/stanza/pubsub/subscribe_test.rb +169 -150
  46. data/test/stanza/pubsub/unsubscribe_test.rb +111 -142
  47. data/test/stanza_test.rb +61 -54
  48. data/test/storage/ldap_test.rb +1 -2
  49. data/test/storage/local_test.rb +3 -5
  50. data/test/storage/null_test.rb +3 -4
  51. data/test/storage/storage_tests.rb +1 -3
  52. data/test/storage_test.rb +1 -2
  53. data/test/store_test.rb +1 -2
  54. data/test/stream/client/auth_test.rb +61 -63
  55. data/test/stream/client/ready_test.rb +7 -8
  56. data/test/stream/client/session_test.rb +19 -18
  57. data/test/stream/component/handshake_test.rb +40 -37
  58. data/test/stream/component/ready_test.rb +76 -61
  59. data/test/stream/component/start_test.rb +7 -8
  60. data/test/stream/http/auth_test.rb +3 -4
  61. data/test/stream/http/ready_test.rb +52 -60
  62. data/test/stream/http/request_test.rb +1 -3
  63. data/test/stream/http/sessions_test.rb +2 -3
  64. data/test/stream/http/start_test.rb +3 -4
  65. data/test/stream/parser_test.rb +3 -4
  66. data/test/stream/sasl_test.rb +105 -86
  67. data/test/stream/server/auth_test.rb +40 -36
  68. data/test/stream/server/outbound/auth_test.rb +3 -4
  69. data/test/stream/server/ready_test.rb +51 -51
  70. data/test/test_helper.rb +42 -0
  71. data/test/token_bucket_test.rb +38 -18
  72. data/test/user_test.rb +79 -49
  73. data/vines.gemspec +33 -0
  74. data/web/chat/javascripts/app.js +1 -1
  75. data/web/lib/coffeescripts/layout.coffee +1 -1
  76. data/web/lib/javascripts/base.js +10 -10
  77. data/web/lib/javascripts/jquery.js +4 -4
  78. metadata +31 -128
  79. data/README +0 -35
  80. data/lib/vines/storage/couchdb.rb +0 -129
  81. data/lib/vines/storage/mongodb.rb +0 -132
  82. data/lib/vines/storage/redis.rb +0 -127
  83. data/lib/vines/storage/sql.rb +0 -220
  84. data/test/rake_test_loader.rb +0 -17
  85. data/test/storage/couchdb_test.rb +0 -107
  86. data/test/storage/mock_mongo.rb +0 -40
  87. data/test/storage/mongodb_test.rb +0 -81
  88. data/test/storage/redis_test.rb +0 -51
  89. data/test/storage/sql_test.rb +0 -62
@@ -1,17 +0,0 @@
1
- require 'rake'
2
-
3
- # Use the latest MiniTest gem instead of the buggy
4
- # version included with Ruby 1.9.2.
5
- gem 'minitest', '~> 2.12.1'
6
-
7
- # Load the test files from the command line.
8
-
9
- ARGV.each do |f|
10
- next if f =~ /^-/
11
-
12
- if f =~ /\*/
13
- FileList[f].to_a.each { |fn| require File.expand_path(fn) }
14
- else
15
- require File.expand_path(f)
16
- end
17
- end
@@ -1,107 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require 'storage_tests'
4
- require 'vines'
5
- require 'minitest/autorun'
6
-
7
- class CouchDBTest < MiniTest::Unit::TestCase
8
- include StorageTests
9
-
10
- URL = 'http://localhost:5984/xmpp_testcase'.freeze
11
-
12
- def setup
13
- EMLoop.new do
14
- database(:put)
15
- save_doc({'_id' => 'user:empty@wonderland.lit'})
16
-
17
- save_doc({
18
- '_id' => 'user:no_password@wonderland.lit',
19
- 'type' => 'User',
20
- 'foo' => 'bar'})
21
-
22
- save_doc({
23
- '_id' => 'user:clear_password@wonderland.lit',
24
- 'type' => 'User',
25
- 'password' => 'secret'})
26
-
27
- save_doc({
28
- '_id' => 'user:bcrypt_password@wonderland.lit',
29
- 'type' => 'User',
30
- 'password' => BCrypt::Password.create('secret')})
31
-
32
- save_doc({
33
- '_id' => 'user:full@wonderland.lit',
34
- 'type' => 'User',
35
- 'password' => BCrypt::Password.create('secret'),
36
- 'name' => 'Tester',
37
- 'roster' => {
38
- 'contact1@wonderland.lit' => {
39
- 'name' => 'Contact1',
40
- 'groups' => %w[Group1 Group2]
41
- },
42
- 'contact2@wonderland.lit' => {
43
- 'name' => 'Contact2',
44
- 'groups' => %w[Group3 Group4]
45
- }
46
- }
47
- })
48
-
49
- save_doc({
50
- '_id' => 'vcard:full@wonderland.lit',
51
- 'type' => 'Vcard',
52
- 'card' => VCARD.to_xml
53
- })
54
-
55
- save_doc({
56
- '_id' => "fragment:full@wonderland.lit:#{FRAGMENT_ID}",
57
- 'type' => 'Fragment',
58
- 'xml' => FRAGMENT.to_xml
59
- })
60
- end
61
- end
62
-
63
- def teardown
64
- EMLoop.new do
65
- database(:delete)
66
- end
67
- end
68
-
69
- def save_doc(doc)
70
- fiber = Fiber.current
71
- http = EM::HttpRequest.new(URL).post(
72
- :head => {'Content-Type' => 'application/json'},
73
- :body => doc.to_json)
74
- http.callback { fiber.resume }
75
- http.errback { raise 'save_doc failed' }
76
- Fiber.yield
77
- end
78
-
79
- def database(method=:put)
80
- fiber = Fiber.current
81
- http = EM::HttpRequest.new(URL).send(method)
82
- http.callback { fiber.resume }
83
- http.errback { raise "#{method} database failed" }
84
- Fiber.yield
85
- end
86
-
87
- def storage
88
- Vines::Storage::CouchDB.new do
89
- host 'localhost'
90
- port 5984
91
- database 'xmpp_testcase'
92
- end
93
- end
94
-
95
- def test_init
96
- EMLoop.new do
97
- assert_raises(RuntimeError) { Vines::Storage::CouchDB.new {} }
98
- assert_raises(RuntimeError) { Vines::Storage::CouchDB.new { host 'localhost' } }
99
- # shouldn't raise an error
100
- Vines::Storage::CouchDB.new do
101
- host 'localhost'
102
- port '5984'
103
- database 'test'
104
- end
105
- end
106
- end
107
- end
@@ -1,40 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- # A mock implementation of the Mongo::Connection class.
4
- class MockMongo
5
- def initialize
6
- @collections = collections
7
- end
8
-
9
- def collection(name)
10
- @collections[name]
11
- end
12
-
13
- def clear
14
- @collections = collections
15
- end
16
-
17
- def collections
18
- {
19
- users: MockCollection.new,
20
- vcards: MockCollection.new,
21
- fragments: MockCollection.new
22
- }
23
- end
24
-
25
- class MockCollection
26
- def initialize
27
- @docs = {}
28
- end
29
-
30
- def find_one(doc)
31
- id = doc['_id'] || doc[:_id]
32
- @docs[id]
33
- end
34
-
35
- def save(doc, opts={})
36
- id = doc['_id'] || doc[:_id]
37
- @docs[id] = doc
38
- end
39
- end
40
- end
@@ -1,81 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require 'mock_mongo'
4
- require 'storage_tests'
5
- require 'vines'
6
- require 'minitest/autorun'
7
-
8
- class MongoDBTest < MiniTest::Unit::TestCase
9
- include StorageTests
10
-
11
- MOCK_MONGO = MockMongo.new
12
-
13
- def setup
14
- EMLoop.new do
15
- db = MOCK_MONGO
16
- db.collection(:users).save({'_id' => 'empty@wonderland.lit'})
17
- db.collection(:users).save({'_id' => 'no_password@wonderland.lit', 'foo' => 'bar'})
18
- db.collection(:users).save({'_id' => 'clear_password@wonderland.lit', 'password' => 'secret'})
19
- db.collection(:users).save({'_id' => 'bcrypt_password@wonderland.lit', 'password' => BCrypt::Password.create('secret')})
20
- db.collection(:users).save({
21
- '_id' => 'full@wonderland.lit',
22
- 'password' => BCrypt::Password.create('secret'),
23
- 'name' => 'Tester',
24
- 'roster' => {
25
- 'contact1@wonderland.lit' => {
26
- 'name' => 'Contact1',
27
- 'groups' => %w[Group1 Group2]
28
- },
29
- 'contact2@wonderland.lit' => {
30
- 'name' => 'Contact2',
31
- 'groups' => %w[Group3 Group4]
32
- }
33
- }
34
- })
35
- db.collection(:vcards).save({'_id' => 'full@wonderland.lit', 'card' => VCARD.to_xml})
36
- db.collection(:fragments).save({'_id' => "full@wonderland.lit:#{FRAGMENT_ID}", 'xml' => FRAGMENT.to_xml})
37
- end
38
- end
39
-
40
- def teardown
41
- MOCK_MONGO.clear
42
- end
43
-
44
- def storage
45
- storage = Vines::Storage::MongoDB.new do
46
- host 'localhost', 27017
47
- database 'xmpp_testcase'
48
- end
49
- def storage.db
50
- MongoDBTest::MOCK_MONGO
51
- end
52
- storage
53
- end
54
-
55
- def test_init
56
- EMLoop.new do
57
- # missing database
58
- assert_raises(RuntimeError) { Vines::Storage::MongoDB.new {} }
59
- # missing a host
60
- assert_raises(RuntimeError) { Vines::Storage::MongoDB.new { database 'test' } }
61
- # duplicate hosts
62
- assert_raises(RuntimeError) do
63
- Vines::Storage::MongoDB.new do
64
- host 'localhost', 27017
65
- host 'localhost', 27017
66
- database 'test'
67
- end
68
- end
69
- # shouldn't raise an error
70
- Vines::Storage::MongoDB.new do
71
- host 'localhost', 27017
72
- database 'test'
73
- end
74
- Vines::Storage::MongoDB.new do
75
- host 'localhost', 27017
76
- host 'localhost', 27018
77
- database 'test'
78
- end
79
- end
80
- end
81
- end
@@ -1,51 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require 'mock_redis'
4
- require 'storage_tests'
5
- require 'vines'
6
- require 'minitest/autorun'
7
-
8
- class RedisTest < MiniTest::Unit::TestCase
9
- include StorageTests
10
-
11
- MOCK_REDIS = MockRedis.new
12
-
13
- def setup
14
- EMLoop.new do
15
- db = MOCK_REDIS
16
- db.set('user:empty@wonderland.lit', {}.to_json)
17
- db.set('user:no_password@wonderland.lit', {'foo' => 'bar'}.to_json)
18
- db.set('user:clear_password@wonderland.lit', {'password' => 'secret'}.to_json)
19
- db.set('user:bcrypt_password@wonderland.lit', {'password' => BCrypt::Password.create('secret')}.to_json)
20
- db.set('user:full@wonderland.lit', {
21
- 'password' => BCrypt::Password.create('secret'),
22
- 'name' => 'Tester'
23
- }.to_json)
24
- db.hmset('roster:full@wonderland.lit',
25
- 'contact1@wonderland.lit',
26
- {'name' => 'Contact1', 'groups' => %w[Group1 Group2]}.to_json,
27
- 'contact2@wonderland.lit',
28
- {'name' => 'Contact2', 'groups' => %w[Group3 Group4]}.to_json)
29
- db.set('vcard:full@wonderland.lit', {'card' => VCARD.to_xml}.to_json)
30
- db.hset('fragments:full@wonderland.lit', FRAGMENT_ID, {'xml' => FRAGMENT.to_xml}.to_json)
31
- end
32
- end
33
-
34
- def teardown
35
- MOCK_REDIS.flushdb
36
- end
37
-
38
- def storage
39
- storage = Vines::Storage::Redis.new { host 'localhost'; port 6397 }
40
- def storage.redis; RedisTest::MOCK_REDIS; end
41
- storage
42
- end
43
-
44
- def test_init_raises_no_errors
45
- EMLoop.new do
46
- Vines::Storage::Redis.new {}
47
- Vines::Storage::Redis.new { host 'localhost' }
48
- Vines::Storage::Redis.new { host'localhost'; port '6379' }
49
- end
50
- end
51
- end
@@ -1,62 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require 'storage_tests'
4
- require 'vines'
5
- require 'minitest/autorun'
6
-
7
- class SqlTest < MiniTest::Unit::TestCase
8
- include StorageTests
9
-
10
- DB_FILE = "./xmpp_testcase.db"
11
- ActiveRecord::Migration.verbose = false
12
-
13
- def setup
14
- storage.create_schema(:force => true)
15
- Vines::Storage::Sql::User.new(:jid => 'empty@wonderland.lit', :name => '', :password => '').save
16
- Vines::Storage::Sql::User.new(:jid => 'no_password@wonderland.lit', :name => '', :password => '').save
17
- Vines::Storage::Sql::User.new(:jid => 'clear_password@wonderland.lit', :name => '',
18
- :password => 'secret').save
19
- Vines::Storage::Sql::User.new(:jid => 'bcrypt_password@wonderland.lit', :name => '',
20
- :password => BCrypt::Password.create('secret')).save
21
- groups = %w[Group1 Group2 Group3 Group4].map do |name|
22
- Vines::Storage::Sql::Group.find_or_create_by_name(name)
23
- end
24
- full = Vines::Storage::Sql::User.new(
25
- :jid => 'full@wonderland.lit',
26
- :name => 'Tester',
27
- :password => BCrypt::Password.create('secret'),
28
- :vcard => VCARD.to_xml)
29
- full.contacts << Vines::Storage::Sql::Contact.new(
30
- :jid => 'contact1@wonderland.lit',
31
- :name => 'Contact1',
32
- :groups => groups[0, 2],
33
- :subscription => 'both')
34
- full.contacts << Vines::Storage::Sql::Contact.new(
35
- :jid => 'contact2@wonderland.lit',
36
- :name => 'Contact2',
37
- :groups => groups[2, 2],
38
- :subscription => 'both')
39
- full.save
40
-
41
- fragment = Vines::Storage::Sql::Fragment.new(
42
- :user => full,
43
- :root => 'characters',
44
- :namespace => 'urn:wonderland',
45
- :xml => FRAGMENT.to_xml)
46
- fragment.save
47
- end
48
-
49
- def teardown
50
- File.delete(DB_FILE) if File.exist?(DB_FILE)
51
- end
52
-
53
- def storage
54
- Vines::Storage::Sql.new { adapter 'sqlite3'; database DB_FILE }
55
- end
56
-
57
- def test_init
58
- assert_raises(RuntimeError) { Vines::Storage::Sql.new {} }
59
- assert_raises(RuntimeError) { Vines::Storage::Sql.new { adapter 'postgresql' } }
60
- Vines::Storage::Sql.new { adapter 'sqlite3'; database ':memory:' } # shouldn't raise an error
61
- end
62
- end