fraggle 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,100 @@
1
+ require 'fraggle/client'
2
+ require 'fraggle/protocol'
3
+ require 'fraggle/response'
4
+ require 'fraggle/test'
5
+
6
+ class FraggleProtocolTest < Test::Unit::TestCase
7
+ include Fraggle::Test
8
+
9
+ class TestConn < Array
10
+ include Fraggle::Protocol
11
+ alias :receive_response :<<
12
+ end
13
+
14
+ attr_reader :cn
15
+
16
+ def setup
17
+ @cn = TestConn.new
18
+ end
19
+
20
+ def encode(req)
21
+ data = req.encode
22
+ [data.length].pack("N") + data
23
+ end
24
+
25
+ def test_simple
26
+ req = Fraggle::Response.new :tag => 0, :verb => V::NOOP, :flags => F::VALID
27
+ cn.receive_data(encode(req))
28
+
29
+ assert_equal [req], cn
30
+ end
31
+
32
+ def test_multiple_single
33
+ a = Fraggle::Response.new :tag => 0, :verb => V::NOOP, :flags => F::VALID
34
+ b = Fraggle::Response.new :tag => 1, :verb => V::NOOP, :flags => F::VALID
35
+ cn.receive_data(encode(a) + encode(b))
36
+
37
+ assert_equal [a, b], cn
38
+ end
39
+
40
+ def test_multiple_double
41
+ a = Fraggle::Response.new :tag => 0, :verb => V::NOOP, :flags => F::VALID
42
+ b = Fraggle::Response.new :tag => 1, :verb => V::NOOP, :flags => F::VALID
43
+ cn.receive_data(encode(a))
44
+ cn.receive_data(encode(b))
45
+
46
+ assert_equal [a, b], cn
47
+ end
48
+
49
+ def test_small_chunks
50
+ req = Fraggle::Response.new :tag => 0, :verb => V::NOOP, :flags => F::VALID
51
+
52
+ bytes = encode(req) * 3
53
+ len = bytes.length
54
+
55
+ 0.step(len, 1) do |i|
56
+ data = bytes.slice!(0, i)
57
+ cn.receive_data(data)
58
+ end
59
+
60
+ assert_equal [req, req, req], cn
61
+ end
62
+
63
+ def test_big_chunks
64
+ req = Fraggle::Response.new :tag => 0, :verb => V::NOOP, :flags => F::VALID
65
+
66
+ bytes = encode(req) * 3
67
+ len = bytes.length
68
+
69
+ 0.step(len, len/2) do |i|
70
+ data = bytes.slice!(0, i)
71
+ cn.receive_data(data)
72
+ end
73
+
74
+ assert_equal [req, req, req], cn
75
+ end
76
+
77
+ def test_send_request
78
+ c = Class.new do
79
+ include Fraggle::Client
80
+
81
+ attr_reader :data
82
+
83
+ def initialize
84
+ @data = ""
85
+ super("doozer://127.0.0.1:8046")
86
+ end
87
+
88
+ def send_data(data)
89
+ @data << data
90
+ end
91
+ end.new
92
+
93
+ req = c.noop
94
+ bytes = req.encode
95
+ head = [bytes.length].pack("N")
96
+
97
+ assert_equal head+bytes, c.data
98
+ end
99
+
100
+ end
@@ -0,0 +1,67 @@
1
+ require 'fraggle/test'
2
+ require 'fraggle/snap'
3
+
4
+ class FraggleSnapTest < Test::Unit::TestCase
5
+ include Fraggle::Test
6
+
7
+ attr_reader :c, :blk
8
+
9
+ def setup
10
+ cl = TestClient.new("doozer://127.0.0.1:8046")
11
+ @c = Fraggle::Snap.new(1, cl)
12
+ @blk = Blk.new
13
+ end
14
+
15
+ def test_get
16
+ req = c.get("/ping", &blk)
17
+
18
+ assert_sent req.tag, :verb => V::GET, :id => 1, :path => "/ping"
19
+ assert_recv reply(req.tag)
20
+ end
21
+
22
+ def test_stat
23
+ req = c.stat("/ping", &blk)
24
+
25
+ assert_sent req.tag, :verb => V::STAT, :id => 1, :path => "/ping"
26
+ assert_recv reply(req.tag)
27
+ end
28
+
29
+ def test_getdir
30
+ req = c.getdir("/test", &blk)
31
+
32
+ assert_sent req.tag, :verb => V::GETDIR, :path => "/test", :id => 1
33
+ assert_recv reply(req.tag)
34
+
35
+ req = c.getdir("/test", 1, 2, &blk)
36
+
37
+ assert_sent req.tag, :verb => V::GETDIR, :path => "/test", :offset => 1, :limit => 2, :id => 1
38
+ assert_recv reply(req.tag)
39
+ end
40
+
41
+ def test_walk
42
+ req = c.walk("/letters/*", &blk)
43
+
44
+ assert_sent req.tag, :verb => V::WALK, :id => 1, :path => "/letters/*"
45
+ assert_recv reply(req.tag)
46
+ end
47
+
48
+ def test_other
49
+ req = c.noop(&blk)
50
+
51
+ assert_sent req.tag, :verb => V::NOOP
52
+ assert_recv reply(req.tag)
53
+ end
54
+
55
+ def test_snap
56
+ b = nil
57
+ a = c.snap do |sn|
58
+ b = sn.get("/ping")
59
+ end
60
+
61
+ reply(a.tag, :id => 99)
62
+
63
+ assert_sent a.tag, :verb => V::SNAP
64
+ assert_sent b.tag, :verb => V::GET, :id => 99, :path => "/ping"
65
+ end
66
+
67
+ end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
8
- - 1
9
- version: 0.1.1
7
+ - 2
8
+ - 0
9
+ version: 0.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Blake Mizerany
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-01-25 00:00:00 -08:00
17
+ date: 2011-02-08 00:00:00 -08:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -43,11 +43,20 @@ extra_rdoc_files:
43
43
  files:
44
44
  - LICENSE
45
45
  - README.md
46
- - lib/fraggle/proto.rb
46
+ - lib/fraggle/client.rb
47
+ - lib/fraggle/emitter.rb
48
+ - lib/fraggle/logger.rb
49
+ - lib/fraggle/meta.rb
50
+ - lib/fraggle/msg.rb
51
+ - lib/fraggle/protocol.rb
52
+ - lib/fraggle/request.rb
53
+ - lib/fraggle/response.rb
54
+ - lib/fraggle/snap.rb
55
+ - lib/fraggle/test.rb
47
56
  - lib/fraggle.rb
48
- - test/core_test.rb
49
- - test/live_test.rb
50
- - test/reconnect_test.rb
57
+ - test/fraggle_client_test.rb
58
+ - test/fraggle_protocol_test.rb
59
+ - test/fraggle_snap_test.rb
51
60
  has_rdoc: true
52
61
  homepage: http://github.com/bmizerany/fraggle
53
62
  licenses: []
@@ -84,6 +93,6 @@ signing_key:
84
93
  specification_version: 2
85
94
  summary: A Ruby/EventMachine Client for Doozer
86
95
  test_files:
87
- - test/core_test.rb
88
- - test/live_test.rb
89
- - test/reconnect_test.rb
96
+ - test/fraggle_client_test.rb
97
+ - test/fraggle_protocol_test.rb
98
+ - test/fraggle_snap_test.rb
data/test/core_test.rb DELETED
@@ -1,215 +0,0 @@
1
- require 'fraggle'
2
-
3
- ##
4
- # This is used to test core functionality that the live integration tests will
5
- # rely on.
6
- class FakeConn
7
- include Fraggle
8
-
9
- attr_reader :sent, :cbx
10
- attr_accessor :tag
11
-
12
- def initialize
13
- @sent = ""
14
- super("127.0.0.1", :assemble => false)
15
- post_init
16
- end
17
-
18
- def send_data(data)
19
- @sent << data
20
- end
21
- end
22
-
23
- class CoreTest < Test::Unit::TestCase
24
-
25
- attr_reader :c
26
-
27
- V = Fraggle::Request::Verb
28
- F = Fraggle::Response::Flag
29
-
30
- def setup
31
- @c = FakeConn.new
32
- end
33
-
34
- def reply(attrs={})
35
- attrs[:tag] = c.tag
36
- attrs[:flags] ||= 0
37
- attrs[:flags] |= F::VALID
38
- res = Fraggle::Response.new(attrs)
39
- c.receive_response(res)
40
- res
41
- end
42
-
43
- def reply!(attrs={})
44
- attrs[:flags] = F::DONE
45
- reply(attrs)
46
- end
47
-
48
- def test_sending_data
49
- c.call(V::NOOP)
50
-
51
- req = Fraggle::Request.new(
52
- :tag => c.tag,
53
- :verb => V::NOOP
54
- )
55
-
56
- buf = req.encode
57
- pre = [buf.length].pack("N")
58
-
59
- assert_equal pre+buf, c.sent
60
- end
61
-
62
- def test_receive_small_buffered_data
63
- count = 0
64
-
65
- tag = c.call(V::WATCH, :path => "**") do |e|
66
- count += 1
67
- end
68
-
69
- res = Fraggle::Response.new(
70
- :tag => tag,
71
- :flags => F::VALID
72
- )
73
-
74
- exp = 10
75
- buf = res.encode
76
- pre = [buf.length].pack("N")
77
- bytes = (pre+buf)*exp
78
-
79
- # Chunk bytes to receive_data in some arbitrary size
80
- 0.step(bytes.length, 3) do |n|
81
- c.receive_data(bytes.slice!(0, n))
82
- end
83
-
84
- assert_equal 10, count
85
- end
86
-
87
- def test_receive_large_buffered_data
88
- count = 0
89
-
90
- tag = c.call(V::WATCH, :path => "**") do |e|
91
- count += 1
92
- end
93
-
94
- res = Fraggle::Response.new(
95
- :tag => tag,
96
- :flags => F::VALID
97
- )
98
-
99
- exp = 10
100
- buf = res.encode
101
- pre = [buf.length].pack("N")
102
- bytes = (pre+buf)*exp
103
-
104
- c.receive_data(bytes)
105
-
106
- assert_equal 10, count
107
- end
108
-
109
- def test_callback_without_done
110
- valid = lambda do |e|
111
- assert_kind_of Fraggle::Response, e
112
- end
113
-
114
- done = lambda do |e|
115
- assert false, "Unreachable"
116
- end
117
-
118
- tests = [valid, done]
119
-
120
- c.call(V::NOOP) do |e|
121
- tests.shift.call(e)
122
- end
123
- reply!
124
-
125
- assert_equal 1, tests.length
126
- end
127
-
128
- def test_callback_with_done
129
- valid = lambda do |e, done|
130
- assert_kind_of Fraggle::Response, e
131
- assert_equal false, done
132
- end
133
-
134
- done = lambda do |e, done|
135
- assert_nil e
136
- assert_equal true, done
137
- end
138
-
139
- tests = [valid, done]
140
-
141
- c.call(V::NOOP) do |e, done|
142
- tests.shift.call(e, done)
143
- end
144
-
145
- reply!
146
- assert tests.empty?
147
- end
148
-
149
- def test_no_callback
150
- c.call(V::NOOP)
151
-
152
- assert_nothing_raised do
153
- reply!
154
- end
155
- end
156
-
157
- def test_no_callback_gc
158
- c.call(V::NOOP)
159
- reply!
160
-
161
- assert ! c.cbx.has_key?(1)
162
- end
163
-
164
- def test_callback_gc
165
- c.call(V::NOOP) {}
166
- reply
167
-
168
- assert c.cbx.has_key?(c.tag)
169
-
170
- reply!
171
-
172
- assert ! c.cbx.has_key?(c.tag)
173
- end
174
-
175
- def test_call_returns_tag
176
- assert_equal 0, c.call(V::NOOP)
177
- assert_equal 1, c.call(V::NOOP)
178
- end
179
-
180
- def test_call_increments_tag
181
- c.call(V::NOOP)
182
- assert_equal 0, c.tag
183
- c.call(V::NOOP)
184
- assert_equal 1, c.tag
185
- c.call(V::NOOP)
186
- assert_equal 2, c.tag
187
- c.call(V::NOOP)
188
- assert_equal 3, c.tag
189
- c.call(V::NOOP)
190
- assert_equal 4, c.tag
191
- c.call(V::NOOP)
192
- assert_equal 5, c.tag
193
- c.call(V::NOOP)
194
- assert_equal 6, c.tag
195
- c.call(V::NOOP)
196
- assert_equal 7, c.tag
197
- c.call(V::NOOP)
198
- assert_equal 8, c.tag
199
- c.call(V::NOOP)
200
- assert_equal 9, c.tag
201
- end
202
-
203
- def test_no_overlap_in_tags
204
- c.cbx[0] = Proc.new {}
205
- assert_equal 1, c.call(V::NOOP)
206
- end
207
-
208
- def test_rollover_tag_when_maxed_out
209
- c.tag = Fraggle::MaxInt32
210
- c.call(V::NOOP)
211
-
212
- assert_equal Fraggle::MinInt32, c.tag
213
- end
214
-
215
- end
data/test/live_test.rb DELETED
@@ -1,197 +0,0 @@
1
- require 'fraggle'
2
-
3
- class LiveTest < Test::Unit::TestCase
4
- def start(timeout=1, &blk)
5
- EM.run do
6
- if timeout > 0
7
- EM.add_timer(timeout) { fail "Test timeout!" }
8
- end
9
-
10
- c = Fraggle.connect(
11
- "127.0.0.1:8046",
12
- :assemble => false
13
- )
14
-
15
- blk.call(c)
16
- end
17
- end
18
-
19
- def stop
20
- EM.stop
21
- end
22
-
23
- def test_get
24
- start do |c|
25
- c.get "/ping" do |e|
26
- assert e.ok?, e.err_detail
27
- assert e.cas > 0
28
- assert_equal "pong", e.value
29
- stop
30
- end
31
- end
32
- end
33
-
34
- def test_set
35
- start do |c|
36
- c.set "/test-set", "a", :clobber do |ea|
37
- assert ea.ok?, ea.err_detail
38
- assert ea.cas > 0
39
- assert_nil ea.value
40
-
41
- c.get "/test-set" do |eb|
42
- assert eb.ok?, eb.err_detail
43
- assert_equal "a", eb.value
44
- stop
45
- end
46
- end
47
- end
48
- end
49
-
50
- def test_del
51
- start do |c|
52
- c.set "/test-del", "a", :clobber do |e|
53
- assert e.ok?, e.err_detail
54
-
55
- c.del("/test-del", e.cas) do |de|
56
- assert de.ok?, de.err_detail
57
- stop
58
- end
59
- end
60
- end
61
- end
62
-
63
- def test_error
64
- start do |c|
65
- c.set "/test-error", "a", :clobber do |ea|
66
- assert ! ea.mismatch?
67
- assert ea.ok?, ea.err_detail
68
- c.set "/test-error", "b", :missing do |eb|
69
- assert eb.mismatch?, eb.err_detail
70
- stop
71
- end
72
- end
73
- end
74
- end
75
-
76
- def test_watch
77
- start do |c|
78
- count = 0
79
- c.watch("/**") do |e|
80
- assert e.ok?, e.err_detail
81
-
82
- count += 1
83
- if count == 9
84
- stop
85
- end
86
- end
87
-
88
- 10.times do
89
- EM.next_tick { c.set("/test-watch", "something", :clobber) }
90
- end
91
- end
92
- end
93
-
94
- def test_snap
95
- start do |c|
96
- c.set "/test-snap", "a", :clobber do |e|
97
- assert e.ok?, e.err_detail
98
-
99
- c.snap do |se|
100
- assert se.ok?, se.err_detail
101
- assert_not_equal 0, se.id
102
-
103
- c.set "/test-snap", "b", :clobber do |e|
104
- assert e.ok?, e.err_detail
105
-
106
- c.get "/test-snap", se.id do |ge|
107
- assert ge.ok?, ge.err_detail
108
- assert_equal "a", ge.value
109
- stop
110
- end
111
- end
112
- end
113
- end
114
- end
115
- end
116
-
117
- # TODO: ??? Shouldn't a deleted snapid produce an error on read?
118
- def test_delsnap
119
- start do |c|
120
- c.snap do |se|
121
- assert se.ok?, se.err_detail
122
- assert_not_equal 0, se.id
123
-
124
-
125
- c.delsnap se.id do |de|
126
- assert de.ok?, de.err_detail
127
-
128
- c.get "/ping", se.id do |ge|
129
- assert ! ge.ok?, ge.err_detail
130
- stop
131
- end
132
- end
133
- end
134
- end
135
- end
136
-
137
- def test_noop
138
- start do |c|
139
- c.noop do |e|
140
- assert e.ok?, e.err_detail
141
- stop
142
- end
143
- end
144
- end
145
-
146
- def test_cancel
147
- start do |c|
148
- tag = c.watch("/test-cancel") do |e, done|
149
- if ! done
150
- assert e.ok?, e.err_detail
151
- end
152
-
153
- if done
154
- stop
155
- end
156
-
157
- c.cancel(tag)
158
- end
159
-
160
- c.set("/test-cancel", "a", :clobber)
161
- end
162
- end
163
-
164
- def test_walk
165
- start do |c|
166
-
167
- exp = [
168
- ["/test-walk/1", "a"],
169
- ["/test-walk/2", "b"],
170
- ["/test-walk/3", "c"]
171
- ]
172
-
173
- n = exp.length
174
-
175
- exp.each do |path, val|
176
- c.set path, val, :clobber do |e|
177
- assert e.ok?, e.err_detail
178
- n -= 1
179
-
180
- if n == 0
181
- items = []
182
- c.walk "/test-walk/*" do |e, done|
183
- if done
184
- assert_equal exp, items
185
- stop
186
- else
187
- items << [e.path, e.value]
188
- end
189
- end
190
- end
191
- end
192
- end
193
-
194
- end
195
- end
196
-
197
- end