stark 0.7.0 → 0.8.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.
@@ -3,25 +3,164 @@ require 'stark'
3
3
  require 'stark/ruby'
4
4
 
5
5
  class TestRuby < Test::Unit::TestCase
6
- def test_namespace
7
- ast = Stark::Parser.ast <<-EOM
8
- namespace rb Blah
6
+ def create_ruby(thrift, options = {})
7
+ ast = Stark::Parser.ast thrift
8
+ stream = StringIO.new
9
+ ruby = Stark::Ruby.new stream
10
+ options[:skip_prologue] = options[:skip_epilogue] = true if options[:only_ast]
11
+ stream.string = '' if options[:skip_prologue]
12
+ if options[:skip_epilogue]
13
+ ast.each { |a| a.accept ruby }
14
+ else
15
+ ruby.run ast
16
+ end
17
+ stream.string
18
+ end
19
+
20
+ def create_ns_module(name, lang = 'rb')
21
+ thrift = <<-EOM
22
+ namespace #{lang} #{name}
9
23
  enum Status {
10
24
  DEAD
11
25
  ALIVE
12
26
  }
13
27
  EOM
14
28
 
15
- stream = StringIO.new
16
- ruby = Stark::Ruby.new stream
17
-
18
- ruby.run ast
19
-
20
29
  ns = Module.new
21
30
 
22
- ns.module_eval stream.string
31
+ ns.module_eval create_ruby(thrift)
32
+ ns
33
+ end
23
34
 
35
+ def test_namespace1
36
+ ns = create_ns_module 'Blah'
24
37
  assert ns::Blah
25
38
  assert ns::Blah::Enum_Status
26
39
  end
40
+
41
+ def test_namespace2
42
+ ns = create_ns_module 'Blah.Blerg'
43
+ assert ns::Blah::Blerg
44
+ assert ns::Blah::Blerg::Enum_Status
45
+ end
46
+
47
+ def test_namespace3
48
+ ns = create_ns_module 'Blah.Blerg', '*'
49
+ assert ns::Blah::Blerg
50
+ assert ns::Blah::Blerg::Enum_Status
51
+ end
52
+
53
+ def test_namespace4
54
+ ns = create_ns_module 'Blah.Blerg', 'c'
55
+ assert ns::Enum_Status
56
+ end
57
+
58
+ def test_forward_declaration
59
+ code = <<-EOM
60
+ struct Foo {
61
+ 1: Bar bar
62
+ }
63
+
64
+ struct Bar {
65
+ 1: i32 ids
66
+ }
67
+ EOM
68
+
69
+ ns = Module.new
70
+ ns.module_eval create_ruby code
71
+ assert ns::Foo
72
+ assert ns::Bar
73
+ end
74
+
75
+ def test_struct_attr_accessor
76
+ ruby = create_ruby <<-EOM, :only_ast => true
77
+ struct Foo {
78
+ 1:string str
79
+ 2:map<string,string> map
80
+ 3:i32 int
81
+ }
82
+ EOM
83
+ assert ruby =~ %r{class\sFoo\s<\sStark::Struct
84
+ .*
85
+ attr_accessor\s:str
86
+ .*
87
+ attr_accessor\s:map
88
+ .*
89
+ attr_accessor\s:int}mx, "did not match:\n#{ruby}"
90
+ ns = Module.new
91
+ ns.module_eval ruby
92
+ fields = ns::Foo.fields
93
+ assert_equal({ 1 => :str, 2 => :map, 3 => :int }, fields)
94
+ end
95
+
96
+ def test_struct_set_field_number
97
+ ruby = create_ruby <<-EOM, :only_ast => true
98
+ struct Foo {
99
+ 3:string str
100
+ 2:map<string,string> map
101
+ 1:i32 int
102
+ }
103
+ EOM
104
+
105
+ assert ruby =~ %r{class\sFoo\s<\sStark::Struct
106
+ .*
107
+ field_number\s3
108
+ .*
109
+ attr_accessor\s:str
110
+ .*
111
+ field_number\s2
112
+ .*
113
+ attr_accessor\s:map
114
+ .*
115
+ field_number\s1
116
+ .*
117
+ attr_accessor\s:int}mx, "did not match:\n#{ruby}"
118
+ ns = Module.new
119
+ ns.module_eval ruby
120
+ fields = ns::Foo.fields
121
+ assert_equal({ 3 => :str, 2 => :map, 1 => :int }, fields)
122
+ end
123
+
124
+ def test_to_struct_to_hash
125
+ ruby = create_ruby <<-EOM, :only_ast => true
126
+ struct Foo {
127
+ 1:string str
128
+ 2:map<string,string> map
129
+ 3:i32 int
130
+ }
131
+ EOM
132
+
133
+ ns = Module.new
134
+ ns.module_eval ruby
135
+ assert ns::Foo
136
+
137
+ foo = ns::Foo.new :str => "hi", :int => 20
138
+ assert_equal({:str => "hi", :int => 20}, foo.to_hash)
139
+ end
140
+
141
+ def test_to_struct_aref
142
+ ruby = create_ruby <<-EOM, :only_ast => true
143
+ struct Foo {
144
+ 1:string str
145
+ 2:map<string,string> map
146
+ 3:i32 int
147
+ }
148
+ EOM
149
+
150
+ ns = Module.new
151
+ ns.module_eval ruby
152
+ assert ns::Foo
153
+
154
+ foo = ns::Foo.new :str => "hi", :int => 20
155
+ assert_equal "hi", foo["str"]
156
+ assert_equal "hi", foo[:str]
157
+ assert_equal "hi", foo[1]
158
+ assert_equal 20, foo["int"]
159
+ assert_equal 20, foo[:int]
160
+ assert_equal 20, foo[3]
161
+ assert_equal ["hi", nil, 20], foo[1..3]
162
+ assert_equal ["hi", 20], foo[1, 3]
163
+ assert_equal ["hi", 20], foo[:str, :int]
164
+ end
165
+
27
166
  end
@@ -5,99 +5,27 @@ require 'stark'
5
5
  require 'rubygems'
6
6
  require 'thrift'
7
7
 
8
- Thread.abort_on_exception = true
8
+ require 'test/test_helper'
9
9
 
10
10
  class TestServer < Test::Unit::TestCase
11
- def setup
12
- @client_t, @server_t = Stark.pipe_transport
13
- @client_p = Thrift::BinaryProtocol.new @client_t
14
- @server_p = Thrift::BinaryProtocol.new @server_t
15
-
16
- @n = Module.new
17
- Stark.materialize "test/profile.thrift", @n
18
-
19
- @client = @n::UserStorage::Client.new @client_p, @client_p
20
- @handler = Handler.new @n
21
- @server = @n::UserStorage::Processor.new @handler
22
- end
23
-
24
- def teardown
25
- @client_t.close
26
- @server_t.close
27
- end
28
-
29
- class Handler
30
- def initialize(n)
31
- @users = {}
32
- @last_map = nil
33
- @last_list = nil
34
- @last_status = nil
35
- @n = n
36
- @user_status = nil
37
- end
38
-
39
- attr_accessor :last_map, :last_list, :last_status, :user_status
40
-
41
- def store(obj)
42
- @users[obj.uid] = obj
43
- end
44
-
45
- def retrieve(id)
46
- @users[id]
47
- end
48
-
49
- def set_map(m)
50
- @last_map = m
51
- end
52
-
53
- def set_list(l)
54
- @last_list = l
55
- end
56
-
57
- def set_status(s)
58
- @last_status = s
59
- end
60
-
61
- def volume_up
62
- raise @n::RockTooHard.new('volume' => 11)
63
- end
11
+ IDL = "test/profile.thrift"
12
+ SERVICE = "UserStorage"
13
+ include TestHelper
64
14
 
65
- def make_bitcoins
66
- sleep 2
67
- end
68
-
69
- def add(a,b)
70
- a + b
71
- end
72
-
73
- def set_user_status(s)
74
- @user_status = s
75
- end
76
-
77
- attr_accessor :user_relationship
78
- def set_user_relationship(rel)
79
- @user_relationship = rel
80
- end
15
+ def setup
16
+ setup_server
81
17
  end
82
18
 
83
19
  def test_store_and_retrieve
84
- st = Thread.new do
85
- @server.process @server_p, @server_p
86
- end
87
-
88
- xuser = @n::UserProfile.new 'uid' => 0, 'name' => 'root', 'blurb' => 'god'
89
-
90
- @client.store xuser
20
+ send_to_server do
21
+ xuser = @n::UserProfile.new 'uid' => 0, 'name' => 'root', 'blurb' => 'god'
91
22
 
92
- st.join
93
-
94
- st = Thread.new do
95
- @server.process @server_p, @server_p
23
+ @client.store xuser
96
24
  end
97
25
 
98
- obj = @client.retrieve 0
99
-
100
- st.join
26
+ obj = send_to_server do
27
+ @client.retrieve 0
28
+ end
101
29
 
102
30
  assert_equal 0, obj.uid
103
31
  assert_equal "root", obj.name
@@ -105,215 +33,171 @@ class TestServer < Test::Unit::TestCase
105
33
  end
106
34
 
107
35
  def test_set_map
108
- st = Thread.new do
109
- @server.process @server_p, @server_p
110
- end
111
-
112
- m = { "blah" => "foo", "a" => "b" }
36
+ send_to_server do
37
+ m = { "blah" => "foo", "a" => "b" }
113
38
 
114
- @client.set_map m
115
-
116
- st.join
39
+ @client.set_map m
40
+ end
117
41
 
118
42
  assert_equal "foo", @handler.last_map["blah"]
119
43
  assert_equal "b", @handler.last_map["a"]
120
44
  end
121
45
 
122
46
  def test_last_map
123
- st = Thread.new do
124
- @server.process @server_p, @server_p
125
- end
126
-
127
- @handler.last_map = { "blah" => "foo", "a" => "b" }
128
-
129
- m = @client.last_map
47
+ m = send_to_server do
48
+ @handler.last_map = { "blah" => "foo", "a" => "b" }
130
49
 
131
- st.join
50
+ @client.last_map
51
+ end
132
52
 
133
53
  assert_equal "foo", m["blah"]
134
54
  assert_equal "b", m["a"]
135
55
  end
136
56
 
137
57
  def test_set_list
138
- st = Thread.new do
139
- @server.process @server_p, @server_p
140
- end
141
-
142
58
  m = [ "blah", "foo", "a", "b" ]
59
+ send_to_server do
143
60
 
144
- @client.set_list m
145
-
146
- st.join
61
+ @client.set_list m
62
+ end
147
63
 
148
64
  assert_equal m, @handler.last_list
149
65
  end
150
66
 
151
67
  def test_last_list
152
- st = Thread.new do
153
- @server.process @server_p, @server_p
154
- end
68
+ send_to_server do
69
+ l = [ "blah", "foo", "a", "b" ]
70
+ @handler.last_list = l
155
71
 
156
- l = [ "blah", "foo", "a", "b" ]
157
- @handler.last_list = l
158
-
159
- assert_equal l, @client.last_list
160
-
161
- st.join
72
+ assert_equal l, @client.last_list
73
+ end
162
74
  end
163
75
 
164
76
  def test_last_list_is_nil
165
- st = Thread.new do
166
- @server.process @server_p, @server_p
77
+ send_to_server do
78
+ assert_equal nil, @client.last_list
167
79
  end
168
-
169
- assert_equal [], @client.last_list
170
-
171
- st.join
172
80
  end
173
81
 
174
82
  def test_enum
175
- st = Thread.new do
176
- @server.process @server_p, @server_p
83
+ send_to_server do
84
+ @client.set_status :ON
177
85
  end
178
86
 
179
- @client.set_status :ON
180
-
181
- st.join
182
-
183
87
  assert_equal :ON, @handler.last_status
184
88
  end
185
89
 
186
90
  def test_enum_recv
187
- st = Thread.new do
188
- @server.process @server_p, @server_p
189
- end
190
-
191
- @handler.last_status = :ON
192
-
193
- assert_equal :ON, @client.last_status
91
+ send_to_server do
92
+ @handler.last_status = :ON
194
93
 
195
- st.join
94
+ assert_equal :ON, @client.last_status
95
+ end
196
96
  end
197
97
 
198
98
  def test_throw
199
- st = Thread.new do
200
- @server.process @server_p, @server_p
201
- end
202
-
203
- e = assert_raises @n::RockTooHard do
204
- @client.volume_up
99
+ e = send_to_server do
100
+ assert_raises @n::RockTooHard do
101
+ @client.volume_up
102
+ end
205
103
  end
206
104
 
207
- st.join
208
-
209
105
  assert_equal 11, e.volume
210
106
  end
211
107
 
212
- # Thread.abort_on_exception = true
213
-
214
108
  def test_oneway
215
- st = Thread.new do
216
- @server.process @server_p, @server_p
217
- end
109
+ send_to_server do
110
+ t = Time.now
218
111
 
219
- t = Time.now
112
+ Timeout.timeout 3 do
113
+ assert_equal nil, @client.make_bitcoins
114
+ end
220
115
 
221
- Timeout.timeout 3 do
222
- assert_equal nil, @client.make_bitcoins
116
+ assert Time.now - t < 0.1
223
117
  end
224
-
225
- assert Time.now - t < 0.1
226
-
227
- st.join
228
118
  end
229
119
 
230
120
  def test_2args
231
- st = Thread.new do
232
- @server.process @server_p, @server_p
121
+ send_to_server do
122
+ assert_equal 7, @client.add(3, 4)
233
123
  end
234
-
235
- assert_equal 7, @client.add(3, 4)
236
-
237
- st.join
238
124
  end
239
125
 
240
126
  def test_read_struct_in_a_struct
241
- st = Thread.new do
242
- @server.process @server_p, @server_p
243
- end
244
-
245
- prof = @n::UserProfile.new 'uid' => 0, 'name' => 'root', 'blurb' => 'god'
246
- stat = @n::UserStatus.new 'profile' => prof, 'active' => true
127
+ send_to_server do
128
+ prof = @n::UserProfile.new 'uid' => 0, 'name' => 'root', 'blurb' => 'god'
129
+ stat = @n::UserStatus.new 'profile' => prof, 'active' => true
247
130
 
248
- @handler.user_status = stat
131
+ @handler.user_status = stat
249
132
 
250
- status = @client.user_status
133
+ status = @client.user_status
251
134
 
252
- assert_equal true, status.active
253
-
254
- prof = status.profile
135
+ assert_equal true, status.active
255
136
 
256
- assert_equal 0, prof.uid
257
- assert_equal "root", prof.name
258
- assert_equal "god", prof.blurb
137
+ prof = status.profile
259
138
 
260
- st.join
139
+ assert_equal 0, prof.uid
140
+ assert_equal "root", prof.name
141
+ assert_equal "god", prof.blurb
142
+ end
261
143
  end
262
144
 
263
145
  def test_write_struct_in_a_struct
264
- st = Thread.new do
265
- @server.process @server_p, @server_p
266
- end
267
-
268
- prof = @n::UserProfile.new 'uid' => 0, 'name' => 'root', 'blurb' => 'god'
269
- stat = @n::UserStatus.new 'profile' => prof, 'active' => true
146
+ send_to_server do
147
+ prof = @n::UserProfile.new 'uid' => 0, 'name' => 'root', 'blurb' => 'god'
148
+ stat = @n::UserStatus.new 'profile' => prof, 'active' => true
270
149
 
271
- @client.set_user_status stat
150
+ @client.set_user_status stat
272
151
 
273
- status = @handler.user_status
152
+ status = @handler.user_status
274
153
 
275
- assert_equal true, status.active
276
-
277
- prof = status.profile
154
+ assert_equal true, status.active
278
155
 
279
- assert_equal 0, prof.uid
280
- assert_equal "root", prof.name
281
- assert_equal "god", prof.blurb
156
+ prof = status.profile
282
157
 
283
- st.join
158
+ assert_equal 0, prof.uid
159
+ assert_equal "root", prof.name
160
+ assert_equal "god", prof.blurb
161
+ end
284
162
  end
285
163
 
286
164
  def test_read_enum_in_struct
287
- st = Thread.new do
288
- @server.process @server_p, @server_p
289
- end
290
-
291
- stat = @n::UserRelationship.new 'user' => 0, 'status' => :ITS_COMPLICATED
165
+ send_to_server do
166
+ stat = @n::UserRelationship.new 'user' => 0, 'status' => :ITS_COMPLICATED
292
167
 
293
- @handler.user_relationship = stat
168
+ @handler.user_relationship = stat
294
169
 
295
- rel = @client.user_relationship
170
+ rel = @client.user_relationship
296
171
 
297
- assert_equal 0, rel.user
298
- assert_equal :ITS_COMPLICATED, rel.status
299
-
300
- st.join
172
+ assert_equal 0, rel.user
173
+ assert_equal :ITS_COMPLICATED, rel.status
174
+ end
301
175
  end
302
176
 
303
177
  def test_write_enum_in_struct
304
- st = Thread.new do
305
- @server.process @server_p, @server_p
306
- end
178
+ send_to_server do
307
179
 
308
- stat = @n::UserRelationship.new 'user' => 0, 'status' => :ITS_COMPLICATED
180
+ stat = @n::UserRelationship.new 'user' => 0, 'status' => :ITS_COMPLICATED
309
181
 
310
- @client.set_user_relationship stat
182
+ @client.set_user_relationship stat
311
183
 
312
- rel = @handler.user_relationship
184
+ rel = @handler.user_relationship
313
185
 
314
- assert_equal 0, rel.user
315
- assert_equal :ITS_COMPLICATED, rel.status
186
+ assert_equal 0, rel.user
187
+ assert_equal :ITS_COMPLICATED, rel.status
188
+ end
189
+ end
316
190
 
317
- st.join
191
+ def test_exception_raised
192
+ set_handler Object.new.tap {|h| def h.respond_to?(*); true; end}
193
+
194
+ e = send_to_server do
195
+ assert_raises Thrift::ApplicationException do
196
+ @client.last_status
197
+ end
198
+ end
199
+ assert e.type == Thrift::ApplicationException::INTERNAL_ERROR
200
+ assert e.message =~ /undefined method/
201
+ assert @log_stream.string =~ /undefined method/
318
202
  end
319
203
  end