thrift 0.0.751142

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 (82) hide show
  1. data/CHANGELOG +2 -0
  2. data/COPYING +14 -0
  3. data/LICENSE +14 -0
  4. data/Makefile.am +15 -0
  5. data/Manifest +78 -0
  6. data/README +30 -0
  7. data/Rakefile +102 -0
  8. data/benchmark/Benchmark.thrift +5 -0
  9. data/benchmark/benchmark.rb +254 -0
  10. data/benchmark/client.rb +56 -0
  11. data/benchmark/gen-rb/BenchmarkService.rb +81 -0
  12. data/benchmark/gen-rb/Benchmark_constants.rb +11 -0
  13. data/benchmark/gen-rb/Benchmark_types.rb +10 -0
  14. data/benchmark/server.rb +64 -0
  15. data/benchmark/thin_server.rb +26 -0
  16. data/ext/binary_protocol_accelerated.c +463 -0
  17. data/ext/binary_protocol_accelerated.h +1 -0
  18. data/ext/constants.h +77 -0
  19. data/ext/extconf.rb +7 -0
  20. data/ext/memory_buffer.c +52 -0
  21. data/ext/memory_buffer.h +1 -0
  22. data/ext/protocol.c +166 -0
  23. data/ext/protocol.h +1 -0
  24. data/ext/struct.c +574 -0
  25. data/ext/struct.h +48 -0
  26. data/ext/thrift_native.c +173 -0
  27. data/lib/thrift/client.rb +44 -0
  28. data/lib/thrift/deprecation.rb +155 -0
  29. data/lib/thrift/exceptions.rb +65 -0
  30. data/lib/thrift/processor.rb +39 -0
  31. data/lib/thrift/protocol/binaryprotocol.rb +213 -0
  32. data/lib/thrift/protocol/binaryprotocolaccelerated.rb +19 -0
  33. data/lib/thrift/protocol/tbinaryprotocol.rb +2 -0
  34. data/lib/thrift/protocol/tprotocol.rb +2 -0
  35. data/lib/thrift/protocol.rb +270 -0
  36. data/lib/thrift/serializer.rb +27 -0
  37. data/lib/thrift/server/httpserver.rb +44 -0
  38. data/lib/thrift/server/nonblockingserver.rb +278 -0
  39. data/lib/thrift/server/thttpserver.rb +2 -0
  40. data/lib/thrift/server/tserver.rb +2 -0
  41. data/lib/thrift/server.rb +135 -0
  42. data/lib/thrift/struct.rb +272 -0
  43. data/lib/thrift/thrift.rb +14 -0
  44. data/lib/thrift/transport/httpclient.rb +29 -0
  45. data/lib/thrift/transport/socket.rb +167 -0
  46. data/lib/thrift/transport/thttpclient.rb +2 -0
  47. data/lib/thrift/transport/tsocket.rb +2 -0
  48. data/lib/thrift/transport/ttransport.rb +2 -0
  49. data/lib/thrift/transport/unixsocket.rb +58 -0
  50. data/lib/thrift/transport.rb +319 -0
  51. data/lib/thrift/types.rb +83 -0
  52. data/lib/thrift.rb +28 -0
  53. data/setup.rb +1585 -0
  54. data/spec/ThriftSpec.thrift +46 -0
  55. data/spec/backwards_compatibility_spec.rb +136 -0
  56. data/spec/binaryprotocol_spec.rb +45 -0
  57. data/spec/binaryprotocol_spec_shared.rb +274 -0
  58. data/spec/binaryprotocolaccelerated_spec.rb +101 -0
  59. data/spec/client_spec.rb +81 -0
  60. data/spec/deprecation_spec.rb +443 -0
  61. data/spec/exception_spec.rb +123 -0
  62. data/spec/gen-rb/NonblockingService.rb +268 -0
  63. data/spec/gen-rb/ThriftSpec_constants.rb +11 -0
  64. data/spec/gen-rb/ThriftSpec_types.rb +134 -0
  65. data/spec/httpclient_spec.rb +31 -0
  66. data/spec/httpserver_spec.rb +98 -0
  67. data/spec/nonblockingserver_spec.rb +245 -0
  68. data/spec/processor_spec.rb +64 -0
  69. data/spec/protocol_spec.rb +142 -0
  70. data/spec/serializer_spec.rb +52 -0
  71. data/spec/server_spec.rb +141 -0
  72. data/spec/socket_spec.rb +97 -0
  73. data/spec/socket_spec_shared.rb +85 -0
  74. data/spec/spec_helper.rb +35 -0
  75. data/spec/struct_spec.rb +244 -0
  76. data/spec/transport_spec.rb +359 -0
  77. data/spec/types_spec.rb +98 -0
  78. data/spec/unixsocket_spec.rb +90 -0
  79. data/thrift.gemspec +33 -0
  80. data.tar.gz.sig +0 -0
  81. metadata +200 -0
  82. metadata.gz.sig +0 -0
@@ -0,0 +1,443 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ shared_examples_for "deprecation" do
4
+ before(:all) do
5
+ # ensure deprecation is turned on
6
+ Thrift.send :remove_const, :DEPRECATION
7
+ Thrift.const_set :DEPRECATION, true
8
+ end
9
+
10
+ after(:all) do
11
+ # now turn it off again
12
+ # no other specs should want it
13
+ Thrift.send :remove_const, :DEPRECATION
14
+ Thrift.const_set :DEPRECATION, false
15
+ end
16
+
17
+ before(:each) do
18
+ Thrift::DeprecationProxy.reset_deprecation_warnings
19
+ end
20
+
21
+ def ensure_const_removed(name, &block)
22
+ begin
23
+ block.call
24
+ ensure
25
+ Object.send :remove_const, name if Object.const_defined? name
26
+ end
27
+ end
28
+ end
29
+
30
+ describe 'deprecate!' do
31
+ it_should_behave_like "deprecation"
32
+
33
+ def stub_stderr(callstr, offset=1)
34
+ STDERR.should_receive(:puts).with("Warning: calling deprecated method #{callstr}")
35
+ line = caller.first[/\d+$/].to_i + offset
36
+ STDERR.should_receive(:puts).with(" from #{__FILE__}:#{line}")
37
+ end
38
+
39
+ it "should work for Module methods" do
40
+ mod = Module.new do
41
+ class << self
42
+ def new
43
+ "new"
44
+ end
45
+ deprecate! :old => :new
46
+ end
47
+ end
48
+ stub_stderr "#{mod.inspect}.old"
49
+ mod.old.should == "new"
50
+ end
51
+
52
+ it "should work with Modules that extend themselves" do
53
+ mod = Module.new do
54
+ extend self
55
+ def new
56
+ "new"
57
+ end
58
+ deprecate! :old => :new
59
+ end
60
+ stub_stderr "#{mod.inspect}.old"
61
+ mod.old.should == "new"
62
+ end
63
+
64
+ it "should work wtih Class methods" do
65
+ klass = Class.new do
66
+ class << self
67
+ def new
68
+ "new"
69
+ end
70
+ deprecate! :old => :new
71
+ end
72
+ end
73
+ stub_stderr "#{klass.inspect}.old"
74
+ klass.old.should == "new"
75
+ end
76
+
77
+ it "should work with Classes that include Modules" do
78
+ mod = Module.new do
79
+ def new
80
+ "new"
81
+ end
82
+ deprecate! :old => :new
83
+ end
84
+ klass = Class.new do
85
+ include mod
86
+ end
87
+ stub_stderr "#{klass.inspect}#old"
88
+ klass.new.old.should == "new"
89
+ end
90
+
91
+ it "should work with instance methods" do
92
+ klass = Class.new do
93
+ def new
94
+ "new"
95
+ end
96
+ deprecate! :old => :new
97
+ end
98
+ stub_stderr "#{klass.inspect}#old"
99
+ klass.new.old.should == "new"
100
+ end
101
+
102
+ it "should work with multiple method names" do
103
+ klass = Class.new do
104
+ def new1
105
+ "new 1"
106
+ end
107
+ def new2
108
+ "new 2"
109
+ end
110
+ deprecate! :old1 => :new1, :old2 => :new2
111
+ end
112
+ stub_stderr("#{klass.inspect}#old1", 3).ordered
113
+ stub_stderr("#{klass.inspect}#old2", 3).ordered
114
+ inst = klass.new
115
+ inst.old1.should == "new 1"
116
+ inst.old2.should == "new 2"
117
+ end
118
+
119
+ it "should only log a message once, even across multiple instances" do
120
+ klass = Class.new do
121
+ def new
122
+ "new"
123
+ end
124
+ deprecate! :old => :new
125
+ end
126
+ stub_stderr("#{klass.inspect}#old").once
127
+ klass.new.old.should == "new"
128
+ klass.new.old.should == "new"
129
+ end
130
+
131
+ it "should pass arguments" do
132
+ klass = Class.new do
133
+ def new(a, b)
134
+ "new: #{a + b}"
135
+ end
136
+ deprecate! :old => :new
137
+ end
138
+ stub_stderr("#{klass.inspect}#old")
139
+ klass.new.old(3, 5).should == "new: 8"
140
+ end
141
+
142
+ it "should pass blocks" do
143
+ klass = Class.new do
144
+ def new
145
+ "new #{yield}"
146
+ end
147
+ deprecate! :old => :new
148
+ end
149
+ stub_stderr("#{klass.inspect}#old")
150
+ klass.new.old { "block" }.should == "new block"
151
+ end
152
+
153
+ it "should not freeze the definition of the new method" do
154
+ klass = Class.new do
155
+ def new
156
+ "new"
157
+ end
158
+ deprecate! :old => :new
159
+ end
160
+ klass.send :define_method, :new do
161
+ "new 2"
162
+ end
163
+ stub_stderr("#{klass.inspect}#old")
164
+ klass.new.old.should == "new 2"
165
+ end
166
+
167
+ it "should call the forwarded method in the same context as the original" do
168
+ klass = Class.new do
169
+ def myself
170
+ self
171
+ end
172
+ deprecate! :me => :myself
173
+ end
174
+ inst = klass.new
175
+ stub_stderr("#{klass.inspect}#me")
176
+ inst.me.should eql(inst.myself)
177
+ end
178
+ end
179
+
180
+ describe "deprecate_class!" do
181
+ it_should_behave_like "deprecation"
182
+
183
+ def stub_stderr_jruby(klass)
184
+ return unless defined? JRUBY_VERSION
185
+ stub_stderr(klass, nil, caller.first)
186
+ end
187
+
188
+ def stub_stderr_mri(klass, offset=1)
189
+ return if defined? JRUBY_VERSION
190
+ stub_stderr(klass, offset, caller.first)
191
+ end
192
+
193
+ def stub_stderr(klass, offset=1, called=nil)
194
+ STDERR.should_receive(:puts).with("Warning: class #{klass} is deprecated")
195
+ if offset
196
+ line = (called || caller.first)[/\d+$/].to_i + offset
197
+ STDERR.should_receive(:puts).with(" from #{__FILE__}:#{line}")
198
+ else
199
+ STDERR.should_receive(:puts).with(/^ from #{Regexp.escape(__FILE__)}:/)
200
+ end
201
+ end
202
+
203
+ it "should create a new global constant that points to the old one" do
204
+ ensure_const_removed :DeprecationSpecOldClass do
205
+ klass = Class.new do
206
+ def foo
207
+ "foo"
208
+ end
209
+ end
210
+ deprecate_class! :DeprecationSpecOldClass => klass
211
+ stub_stderr(:DeprecationSpecOldClass)
212
+ ::DeprecationSpecOldClass.should eql(klass)
213
+ ::DeprecationSpecOldClass.new.foo.should == "foo"
214
+ end
215
+ end
216
+
217
+ it "should create a global constant even from inside a module" do
218
+ ensure_const_removed :DeprecationSpecOldClass do
219
+ klass = nil #define scoping
220
+ Module.new do
221
+ klass = Class.new do
222
+ def foo
223
+ "foo"
224
+ end
225
+ end
226
+ deprecate_class! :DeprecationSpecOldClass => klass
227
+ end
228
+ stub_stderr(:DeprecationSpecOldClass)
229
+ ::DeprecationSpecOldClass.should eql(klass)
230
+ ::DeprecationSpecOldClass.new.foo.should == "foo"
231
+ end
232
+ end
233
+
234
+ it "should not prevent the deprecated class from being a superclass" do
235
+ ensure_const_removed :DeprecationSpecOldClass do
236
+ klass = Class.new do
237
+ def foo
238
+ "foo"
239
+ end
240
+ end
241
+ deprecate_class! :DeprecationSpecOldClass => klass
242
+ stub_stderr_jruby(:DeprecationSpecOldClass)
243
+ subklass = Class.new(::DeprecationSpecOldClass) do
244
+ def foo
245
+ "subclass #{super}"
246
+ end
247
+ end
248
+ stub_stderr_mri(:DeprecationSpecOldClass)
249
+ subklass.superclass.should eql(klass)
250
+ subklass.new.foo.should == "subclass foo"
251
+ end
252
+ end
253
+
254
+ it "should not bleed info between deprecations" do
255
+ ensure_const_removed :DeprecationSpecOldClass do
256
+ ensure_const_removed :DeprecationSpecOldClass2 do
257
+ klass = Class.new do
258
+ def foo
259
+ "foo"
260
+ end
261
+ end
262
+ deprecate_class! :DeprecationSpecOldClass => klass
263
+ klass2 = Class.new do
264
+ def bar
265
+ "bar"
266
+ end
267
+ end
268
+ deprecate_class! :DeprecationSpecOldClass2 => klass2
269
+ stub_stderr(:DeprecationSpecOldClass)
270
+ ::DeprecationSpecOldClass.new.foo.should == "foo"
271
+ stub_stderr(:DeprecationSpecOldClass2)
272
+ ::DeprecationSpecOldClass2.new.bar.should == "bar"
273
+ end
274
+ end
275
+ end
276
+
277
+ it "should work when Object.inherited calls a method on self" do
278
+ ensure_const_removed :DeprecationSpecOldClass do
279
+ old_inherited = Object.method(:inherited)
280
+ begin
281
+ (class << Object;self;end).class_eval do
282
+ define_method :inherited do |cls|
283
+ cls.inspect
284
+ old_inherited.call(cls)
285
+ end
286
+ end
287
+ klass = Class.new do
288
+ def foo
289
+ "foo"
290
+ end
291
+ end
292
+ STDERR.should_receive(:puts).exactly(0).times
293
+ lambda { deprecate_class! :DeprecationSpecOldClass => klass }.should_not raise_error
294
+ ensure
295
+ (class << Object;self;end).class_eval do
296
+ define_method :inherited, old_inherited
297
+ end
298
+ end
299
+ end
300
+ end
301
+ end
302
+
303
+ describe "deprecate_module!" do
304
+ it_should_behave_like "deprecation"
305
+
306
+ def stub_stderr_jruby(mod)
307
+ return unless defined? JRUBY_VERSION
308
+ stub_stderr(mod, nil, caller.first)
309
+ end
310
+
311
+ def stub_stderr_mri(mod, offset=1)
312
+ return if defined? JRUBY_VERSION
313
+ stub_stderr(mod, offset, caller.first)
314
+ end
315
+
316
+ def stub_stderr(mod, offset=1, called=nil)
317
+ STDERR.should_receive(:puts).with("Warning: module #{mod} is deprecated")
318
+ source = Regexp.escape(__FILE__) + ":"
319
+ if offset
320
+ line = (called || caller.first)[/\d+$/].to_i + offset
321
+ source += Regexp.escape(line.to_s)
322
+ else
323
+ source += "\d+"
324
+ end
325
+ STDERR.should_receive(:puts).with(/^ from #{source}(?::in `[^']+')?$/)
326
+ end
327
+
328
+ it "should create a new global constant that points to the old one" do
329
+ ensure_const_removed :DeprecationSpecOldModule do
330
+ mod = Module.new do
331
+ def self.foo
332
+ "foo"
333
+ end
334
+ end
335
+ deprecate_module! :DeprecationSpecOldModule => mod
336
+ stub_stderr(:DeprecationSpecOldModule)
337
+ ::DeprecationSpecOldModule.should eql(mod)
338
+ ::DeprecationSpecOldModule.foo.should == "foo"
339
+ end
340
+ end
341
+
342
+ it "should create a global constant even from inside a module" do
343
+ ensure_const_removed :DeprecationSpecOldModule do
344
+ mod = nil # scoping
345
+ Module.new do
346
+ mod = Module.new do
347
+ def self.foo
348
+ "foo"
349
+ end
350
+ end
351
+ deprecate_module! :DeprecationSpecOldModule => mod
352
+ end
353
+ stub_stderr(:DeprecationSpecOldModule)
354
+ ::DeprecationSpecOldModule.should eql(mod)
355
+ ::DeprecationSpecOldModule.foo.should == "foo"
356
+ end
357
+ end
358
+
359
+ it "should work for modules that extend themselves" do
360
+ ensure_const_removed :DeprecationSpecOldModule do
361
+ mod = Module.new do
362
+ extend self
363
+ def foo
364
+ "foo"
365
+ end
366
+ end
367
+ deprecate_module! :DeprecationSpecOldModule => mod
368
+ stub_stderr(:DeprecationSpecOldModule)
369
+ ::DeprecationSpecOldModule.should eql(mod)
370
+ ::DeprecationSpecOldModule.foo.should == "foo"
371
+ end
372
+ end
373
+
374
+ it "should work for modules included in other modules" do
375
+ ensure_const_removed :DeprecationSpecOldModule do
376
+ mod = Module.new do
377
+ def foo
378
+ "foo"
379
+ end
380
+ end
381
+ deprecate_module! :DeprecationSpecOldModule => mod
382
+ stub_stderr_jruby(:DeprecationSpecOldModule)
383
+ mod2 = Module.new do
384
+ class << self
385
+ include ::DeprecationSpecOldModule
386
+ end
387
+ end
388
+ stub_stderr_mri(:DeprecationSpecOldModule)
389
+ mod2.foo.should == "foo"
390
+ end
391
+ end
392
+
393
+ it "should work for modules included in classes" do
394
+ ensure_const_removed :DeprecationSpecOldModule do
395
+ mod = Module.new do
396
+ def foo
397
+ "foo"
398
+ end
399
+ end
400
+ deprecate_module! :DeprecationSpecOldModule => mod
401
+ stub_stderr_jruby(:DeprecationSpecOldModule)
402
+ klass = Class.new do
403
+ include ::DeprecationSpecOldModule
404
+ end
405
+ stub_stderr_mri(:DeprecationSpecOldModule)
406
+ klass.new.foo.should == "foo"
407
+ end
408
+ end
409
+
410
+ it "should not bleed info between deprecations" do
411
+ ensure_const_removed :DeprecationSpecOldModule do
412
+ ensure_const_removed :DeprecationSpecOldModule2 do
413
+ mod = Module.new do
414
+ def self.foo
415
+ "foo"
416
+ end
417
+ end
418
+ deprecate_module! :DeprecationSpecOldModule => mod
419
+ mod2 = Module.new do
420
+ def self.bar
421
+ "bar"
422
+ end
423
+ end
424
+ deprecate_module! :DeprecationSpecOldModule2 => mod2
425
+ stub_stderr(:DeprecationSpecOldModule)
426
+ ::DeprecationSpecOldModule.foo.should == "foo"
427
+ stub_stderr(:DeprecationSpecOldModule2)
428
+ ::DeprecationSpecOldModule2.bar.should == "bar"
429
+ end
430
+ end
431
+ end
432
+
433
+ it "should skip thrift library code when printing caller" do
434
+ klass = Class.new do
435
+ include ThriftStruct
436
+ FIELDS = {
437
+ 1 => {:name => "foo", :type => Thrift::Types::STRING}
438
+ }
439
+ end
440
+ stub_stderr('ThriftStruct')
441
+ klass.new(:foo => "foo")
442
+ end
443
+ end
@@ -0,0 +1,123 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ class ThriftExceptionSpec < Spec::ExampleGroup
4
+ include Thrift
5
+
6
+ describe Exception do
7
+ it "should have an accessible message" do
8
+ e = Exception.new("test message")
9
+ e.message.should == "test message"
10
+ end
11
+ end
12
+
13
+ describe ApplicationException do
14
+ it "should inherit from Thrift::Exception" do
15
+ ApplicationException.superclass.should == Exception
16
+ end
17
+
18
+ it "should have an accessible type and message" do
19
+ e = ApplicationException.new
20
+ e.type.should == ApplicationException::UNKNOWN
21
+ e.message.should be_nil
22
+ e = ApplicationException.new(ApplicationException::UNKNOWN_METHOD, "test message")
23
+ e.type.should == ApplicationException::UNKNOWN_METHOD
24
+ e.message.should == "test message"
25
+ end
26
+
27
+ it "should read a struct off of a protocol" do
28
+ prot = mock("MockProtocol")
29
+ prot.should_receive(:read_struct_begin).ordered
30
+ prot.should_receive(:read_field_begin).exactly(3).times.and_return(
31
+ ["message", Types::STRING, 1],
32
+ ["type", Types::I32, 2],
33
+ [nil, Types::STOP, 0]
34
+ )
35
+ prot.should_receive(:read_string).ordered.and_return "test message"
36
+ prot.should_receive(:read_i32).ordered.and_return ApplicationException::BAD_SEQUENCE_ID
37
+ prot.should_receive(:read_field_end).exactly(2).times
38
+ prot.should_receive(:read_struct_end).ordered
39
+
40
+ e = ApplicationException.new
41
+ e.read(prot)
42
+ e.message.should == "test message"
43
+ e.type.should == ApplicationException::BAD_SEQUENCE_ID
44
+ end
45
+
46
+ it "should skip bad fields when reading a struct" do
47
+ prot = mock("MockProtocol")
48
+ prot.should_receive(:read_struct_begin).ordered
49
+ prot.should_receive(:read_field_begin).exactly(5).times.and_return(
50
+ ["type", Types::I32, 2],
51
+ ["type", Types::STRING, 2],
52
+ ["message", Types::MAP, 1],
53
+ ["message", Types::STRING, 3],
54
+ [nil, Types::STOP, 0]
55
+ )
56
+ prot.should_receive(:read_i32).and_return ApplicationException::INVALID_MESSAGE_TYPE
57
+ prot.should_receive(:skip).with(Types::STRING).twice
58
+ prot.should_receive(:skip).with(Types::MAP)
59
+ prot.should_receive(:read_field_end).exactly(4).times
60
+ prot.should_receive(:read_struct_end).ordered
61
+
62
+ e = ApplicationException.new
63
+ e.read(prot)
64
+ e.message.should be_nil
65
+ e.type.should == ApplicationException::INVALID_MESSAGE_TYPE
66
+ end
67
+
68
+ it "should write a Thrift::ApplicationException struct to the oprot" do
69
+ prot = mock("MockProtocol")
70
+ prot.should_receive(:write_struct_begin).with("Thrift::ApplicationException").ordered
71
+ prot.should_receive(:write_field_begin).with("message", Types::STRING, 1).ordered
72
+ prot.should_receive(:write_string).with("test message").ordered
73
+ prot.should_receive(:write_field_begin).with("type", Types::I32, 2).ordered
74
+ prot.should_receive(:write_i32).with(ApplicationException::UNKNOWN_METHOD).ordered
75
+ prot.should_receive(:write_field_end).twice
76
+ prot.should_receive(:write_field_stop).ordered
77
+ prot.should_receive(:write_struct_end).ordered
78
+
79
+ e = ApplicationException.new(ApplicationException::UNKNOWN_METHOD, "test message")
80
+ e.write(prot)
81
+ end
82
+
83
+ it "should skip nil fields when writing to the oprot" do
84
+ prot = mock("MockProtocol")
85
+ prot.should_receive(:write_struct_begin).with("Thrift::ApplicationException").ordered
86
+ prot.should_receive(:write_field_begin).with("message", Types::STRING, 1).ordered
87
+ prot.should_receive(:write_string).with("test message").ordered
88
+ prot.should_receive(:write_field_end).ordered
89
+ prot.should_receive(:write_field_stop).ordered
90
+ prot.should_receive(:write_struct_end).ordered
91
+
92
+ e = ApplicationException.new(nil, "test message")
93
+ e.write(prot)
94
+
95
+ prot = mock("MockProtocol")
96
+ prot.should_receive(:write_struct_begin).with("Thrift::ApplicationException").ordered
97
+ prot.should_receive(:write_field_begin).with("type", Types::I32, 2).ordered
98
+ prot.should_receive(:write_i32).with(ApplicationException::BAD_SEQUENCE_ID).ordered
99
+ prot.should_receive(:write_field_end).ordered
100
+ prot.should_receive(:write_field_stop).ordered
101
+ prot.should_receive(:write_struct_end).ordered
102
+
103
+ e = ApplicationException.new(ApplicationException::BAD_SEQUENCE_ID)
104
+ e.write(prot)
105
+
106
+ prot = mock("MockProtocol")
107
+ prot.should_receive(:write_struct_begin).with("Thrift::ApplicationException").ordered
108
+ prot.should_receive(:write_field_stop).ordered
109
+ prot.should_receive(:write_struct_end).ordered
110
+
111
+ e = ApplicationException.new(nil)
112
+ e.write(prot)
113
+ end
114
+ end
115
+
116
+ describe ProtocolException do
117
+ it "should have an accessible type" do
118
+ prot = ProtocolException.new(ProtocolException::SIZE_LIMIT, "message")
119
+ prot.type.should == ProtocolException::SIZE_LIMIT
120
+ prot.message.should == "message"
121
+ end
122
+ end
123
+ end