thrift-mavericks 0.8.0 → 0.9.0.1

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 (59) hide show
  1. checksums.yaml +8 -8
  2. data/ext/binary_protocol_accelerated.c +21 -2
  3. data/ext/bytes.c +36 -0
  4. data/ext/bytes.h +31 -0
  5. data/ext/compact_protocol.c +24 -7
  6. data/ext/constants.h +5 -5
  7. data/ext/extconf.rb +3 -1
  8. data/ext/memory_buffer.c +11 -8
  9. data/ext/protocol.c +0 -185
  10. data/ext/protocol.h +0 -20
  11. data/ext/struct.c +0 -3
  12. data/ext/thrift_native.c +10 -11
  13. data/lib/thrift.rb +3 -0
  14. data/lib/thrift/bytes.rb +131 -0
  15. data/lib/thrift/exceptions.rb +3 -0
  16. data/lib/thrift/protocol/base_protocol.rb +96 -9
  17. data/lib/thrift/protocol/binary_protocol.rb +15 -7
  18. data/lib/thrift/protocol/compact_protocol.rb +14 -6
  19. data/lib/thrift/protocol/json_protocol.rb +766 -0
  20. data/lib/thrift/server/mongrel_http_server.rb +2 -0
  21. data/lib/thrift/server/thin_http_server.rb +91 -0
  22. data/lib/thrift/struct.rb +1 -1
  23. data/lib/thrift/struct_union.rb +2 -2
  24. data/lib/thrift/transport/base_transport.rb +22 -20
  25. data/lib/thrift/transport/buffered_transport.rb +16 -10
  26. data/lib/thrift/transport/framed_transport.rb +11 -10
  27. data/lib/thrift/transport/http_client_transport.rb +11 -6
  28. data/lib/thrift/transport/io_stream_transport.rb +1 -1
  29. data/lib/thrift/transport/memory_buffer_transport.rb +6 -6
  30. data/lib/thrift/transport/socket.rb +4 -2
  31. data/spec/ThriftSpec.thrift +52 -1
  32. data/spec/base_protocol_spec.rb +108 -51
  33. data/spec/base_transport_spec.rb +49 -50
  34. data/spec/binary_protocol_accelerated_spec.rb +9 -13
  35. data/spec/binary_protocol_spec.rb +15 -10
  36. data/spec/binary_protocol_spec_shared.rb +92 -12
  37. data/spec/bytes_spec.rb +160 -0
  38. data/spec/client_spec.rb +13 -14
  39. data/spec/compact_protocol_spec.rb +4 -5
  40. data/spec/exception_spec.rb +39 -40
  41. data/spec/gen-rb/thrift_spec_types.rb +192 -0
  42. data/spec/http_client_spec.rb +65 -9
  43. data/spec/json_protocol_spec.rb +513 -0
  44. data/spec/nonblocking_server_spec.rb +18 -20
  45. data/spec/processor_spec.rb +13 -16
  46. data/spec/serializer_spec.rb +17 -19
  47. data/spec/server_socket_spec.rb +6 -7
  48. data/spec/server_spec.rb +46 -58
  49. data/spec/socket_spec.rb +11 -11
  50. data/spec/socket_spec_shared.rb +1 -1
  51. data/spec/spec_helper.rb +13 -10
  52. data/spec/struct_nested_containers_spec.rb +191 -0
  53. data/spec/struct_spec.rb +84 -86
  54. data/spec/thin_http_server_spec.rb +140 -0
  55. data/spec/types_spec.rb +65 -66
  56. data/spec/union_spec.rb +57 -47
  57. data/spec/unix_socket_spec.rb +8 -9
  58. metadata +72 -14
  59. data/spec/mongrel_http_server_spec.rb +0 -117
@@ -0,0 +1,140 @@
1
+ #
2
+ # Licensed to the Apache Software Foundation (ASF) under one
3
+ # or more contributor license agreements. See the NOTICE file
4
+ # distributed with this work for additional information
5
+ # regarding copyright ownership. The ASF licenses this file
6
+ # to you under the Apache License, Version 2.0 (the
7
+ # "License"); you may not use this file except in compliance
8
+ # with the License. You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing,
13
+ # software distributed under the License is distributed on an
14
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ # KIND, either express or implied. See the License for the
16
+ # specific language governing permissions and limitations
17
+ # under the License.
18
+ #
19
+
20
+ require 'spec_helper'
21
+ require 'rack/test'
22
+
23
+ describe Thrift::ThinHTTPServer do
24
+
25
+ let(:processor) { mock('processor') }
26
+
27
+ describe "#initialize" do
28
+
29
+ context "when using the defaults" do
30
+
31
+ it "binds to port 80, with host 0.0.0.0, a path of '/'" do
32
+ Thin::Server.should_receive(:new).with('0.0.0.0', 80, an_instance_of(Rack::Builder))
33
+ Thrift::ThinHTTPServer.new(processor)
34
+ end
35
+
36
+ it 'creates a ThinHTTPServer::RackApplicationContext' do
37
+ Thrift::ThinHTTPServer::RackApplication.should_receive(:for).with("/", processor, an_instance_of(Thrift::BinaryProtocolFactory)).and_return(anything)
38
+ Thrift::ThinHTTPServer.new(processor)
39
+ end
40
+
41
+ it "uses the BinaryProtocolFactory" do
42
+ Thrift::BinaryProtocolFactory.should_receive(:new)
43
+ Thrift::ThinHTTPServer.new(processor)
44
+ end
45
+
46
+ end
47
+
48
+ context "when using the options" do
49
+
50
+ it 'accepts :ip, :port, :path' do
51
+ ip = "192.168.0.1"
52
+ port = 3000
53
+ path = "/thin"
54
+ Thin::Server.should_receive(:new).with(ip, port, an_instance_of(Rack::Builder))
55
+ Thrift::ThinHTTPServer.new(processor,
56
+ :ip => ip,
57
+ :port => port,
58
+ :path => path)
59
+ end
60
+
61
+ it 'creates a ThinHTTPServer::RackApplicationContext with a different protocol factory' do
62
+ Thrift::ThinHTTPServer::RackApplication.should_receive(:for).with("/", processor, an_instance_of(Thrift::JsonProtocolFactory)).and_return(anything)
63
+ Thrift::ThinHTTPServer.new(processor,
64
+ :protocol_factory => Thrift::JsonProtocolFactory.new)
65
+ end
66
+
67
+ end
68
+
69
+ end
70
+
71
+ describe "#serve" do
72
+
73
+ it 'starts the Thin server' do
74
+ underlying_thin_server = mock('thin server', :start => true)
75
+ Thin::Server.stub(:new).and_return(underlying_thin_server)
76
+
77
+ thin_thrift_server = Thrift::ThinHTTPServer.new(processor)
78
+
79
+ underlying_thin_server.should_receive(:start)
80
+ thin_thrift_server.serve
81
+ end
82
+ end
83
+
84
+ end
85
+
86
+ describe Thrift::ThinHTTPServer::RackApplication do
87
+ include Rack::Test::Methods
88
+
89
+ let(:processor) { mock('processor') }
90
+ let(:protocol_factory) { mock('protocol factory') }
91
+
92
+ def app
93
+ Thrift::ThinHTTPServer::RackApplication.for("/", processor, protocol_factory)
94
+ end
95
+
96
+ context "404 response" do
97
+
98
+ it 'receives a non-POST' do
99
+ header('Content-Type', "application/x-thrift")
100
+ get "/"
101
+ last_response.status.should be 404
102
+ end
103
+
104
+ it 'receives a header other than application/x-thrift' do
105
+ header('Content-Type', "application/json")
106
+ post "/"
107
+ last_response.status.should be 404
108
+ end
109
+
110
+ end
111
+
112
+ context "200 response" do
113
+
114
+ before do
115
+ protocol_factory.stub(:get_protocol)
116
+ processor.stub(:process)
117
+ end
118
+
119
+ it 'creates an IOStreamTransport' do
120
+ header('Content-Type', "application/x-thrift")
121
+ Thrift::IOStreamTransport.should_receive(:new).with(an_instance_of(Rack::Lint::InputWrapper), an_instance_of(Rack::Response))
122
+ post "/"
123
+ end
124
+
125
+ it 'fetches the right protocol based on the Transport' do
126
+ header('Content-Type', "application/x-thrift")
127
+ protocol_factory.should_receive(:get_protocol).with(an_instance_of(Thrift::IOStreamTransport))
128
+ post "/"
129
+ end
130
+
131
+ it 'status code 200' do
132
+ header('Content-Type', "application/x-thrift")
133
+ post "/"
134
+ last_response.ok?.should be_true
135
+ end
136
+
137
+ end
138
+
139
+ end
140
+
data/spec/types_spec.rb CHANGED
@@ -17,10 +17,9 @@
17
17
  # under the License.
18
18
  #
19
19
 
20
- require File.expand_path("#{File.dirname(__FILE__)}/spec_helper")
20
+ require 'spec_helper'
21
21
 
22
- class ThriftTypesSpec < Spec::ExampleGroup
23
- include Thrift
22
+ describe Thrift::Types do
24
23
 
25
24
  before(:each) do
26
25
  Thrift.type_checking = true
@@ -30,87 +29,87 @@ class ThriftTypesSpec < Spec::ExampleGroup
30
29
  Thrift.type_checking = false
31
30
  end
32
31
 
33
- describe "Type checking" do
32
+ context 'type checking' do
34
33
  it "should return the proper name for each type" do
35
- Thrift.type_name(Types::I16).should == "Types::I16"
36
- Thrift.type_name(Types::VOID).should == "Types::VOID"
37
- Thrift.type_name(Types::LIST).should == "Types::LIST"
34
+ Thrift.type_name(Thrift::Types::I16).should == "Types::I16"
35
+ Thrift.type_name(Thrift::Types::VOID).should == "Types::VOID"
36
+ Thrift.type_name(Thrift::Types::LIST).should == "Types::LIST"
38
37
  Thrift.type_name(42).should be_nil
39
38
  end
40
39
 
41
40
  it "should check types properly" do
42
- # lambda { Thrift.check_type(nil, Types::STOP) }.should raise_error(TypeError)
43
- lambda { Thrift.check_type(3, {:type => Types::STOP}, :foo) }.should raise_error(TypeError)
44
- lambda { Thrift.check_type(nil, {:type => Types::VOID}, :foo) }.should_not raise_error(TypeError)
45
- lambda { Thrift.check_type(3, {:type => Types::VOID}, :foo) }.should raise_error(TypeError)
46
- lambda { Thrift.check_type(true, {:type => Types::BOOL}, :foo) }.should_not raise_error(TypeError)
47
- lambda { Thrift.check_type(3, {:type => Types::BOOL}, :foo) }.should raise_error(TypeError)
48
- lambda { Thrift.check_type(42, {:type => Types::BYTE}, :foo) }.should_not raise_error(TypeError)
49
- lambda { Thrift.check_type(42, {:type => Types::I16}, :foo) }.should_not raise_error(TypeError)
50
- lambda { Thrift.check_type(42, {:type => Types::I32}, :foo) }.should_not raise_error(TypeError)
51
- lambda { Thrift.check_type(42, {:type => Types::I64}, :foo) }.should_not raise_error(TypeError)
52
- lambda { Thrift.check_type(3.14, {:type => Types::I32}, :foo) }.should raise_error(TypeError)
53
- lambda { Thrift.check_type(3.14, {:type => Types::DOUBLE}, :foo) }.should_not raise_error(TypeError)
54
- lambda { Thrift.check_type(3, {:type => Types::DOUBLE}, :foo) }.should raise_error(TypeError)
55
- lambda { Thrift.check_type("3", {:type => Types::STRING}, :foo) }.should_not raise_error(TypeError)
56
- lambda { Thrift.check_type(3, {:type => Types::STRING}, :foo) }.should raise_error(TypeError)
41
+ # lambda { Thrift.check_type(nil, Thrift::Types::STOP) }.should raise_error(Thrift::TypeError)
42
+ lambda { Thrift.check_type(3, {:type => Thrift::Types::STOP}, :foo) }.should raise_error(Thrift::TypeError)
43
+ lambda { Thrift.check_type(nil, {:type => Thrift::Types::VOID}, :foo) }.should_not raise_error(Thrift::TypeError)
44
+ lambda { Thrift.check_type(3, {:type => Thrift::Types::VOID}, :foo) }.should raise_error(Thrift::TypeError)
45
+ lambda { Thrift.check_type(true, {:type => Thrift::Types::BOOL}, :foo) }.should_not raise_error(Thrift::TypeError)
46
+ lambda { Thrift.check_type(3, {:type => Thrift::Types::BOOL}, :foo) }.should raise_error(Thrift::TypeError)
47
+ lambda { Thrift.check_type(42, {:type => Thrift::Types::BYTE}, :foo) }.should_not raise_error(Thrift::TypeError)
48
+ lambda { Thrift.check_type(42, {:type => Thrift::Types::I16}, :foo) }.should_not raise_error(Thrift::TypeError)
49
+ lambda { Thrift.check_type(42, {:type => Thrift::Types::I32}, :foo) }.should_not raise_error(Thrift::TypeError)
50
+ lambda { Thrift.check_type(42, {:type => Thrift::Types::I64}, :foo) }.should_not raise_error(Thrift::TypeError)
51
+ lambda { Thrift.check_type(3.14, {:type => Thrift::Types::I32}, :foo) }.should raise_error(Thrift::TypeError)
52
+ lambda { Thrift.check_type(3.14, {:type => Thrift::Types::DOUBLE}, :foo) }.should_not raise_error(Thrift::TypeError)
53
+ lambda { Thrift.check_type(3, {:type => Thrift::Types::DOUBLE}, :foo) }.should raise_error(Thrift::TypeError)
54
+ lambda { Thrift.check_type("3", {:type => Thrift::Types::STRING}, :foo) }.should_not raise_error(Thrift::TypeError)
55
+ lambda { Thrift.check_type(3, {:type => Thrift::Types::STRING}, :foo) }.should raise_error(Thrift::TypeError)
57
56
  hello = SpecNamespace::Hello.new
58
- lambda { Thrift.check_type(hello, {:type => Types::STRUCT, :class => SpecNamespace::Hello}, :foo) }.should_not raise_error(TypeError)
59
- lambda { Thrift.check_type("foo", {:type => Types::STRUCT}, :foo) }.should raise_error(TypeError)
60
- lambda { Thrift.check_type({:foo => 1}, {:type => Types::MAP}, :foo) }.should_not raise_error(TypeError)
61
- lambda { Thrift.check_type([1], {:type => Types::MAP}, :foo) }.should raise_error(TypeError)
62
- lambda { Thrift.check_type([1], {:type => Types::LIST}, :foo) }.should_not raise_error(TypeError)
63
- lambda { Thrift.check_type({:foo => 1}, {:type => Types::LIST}, :foo) }.should raise_error(TypeError)
64
- lambda { Thrift.check_type(Set.new([1,2]), {:type => Types::SET}, :foo) }.should_not raise_error(TypeError)
65
- lambda { Thrift.check_type([1,2], {:type => Types::SET}, :foo) }.should raise_error(TypeError)
66
- lambda { Thrift.check_type({:foo => true}, {:type => Types::SET}, :foo) }.should raise_error(TypeError)
57
+ lambda { Thrift.check_type(hello, {:type => Thrift::Types::STRUCT, :class => SpecNamespace::Hello}, :foo) }.should_not raise_error(Thrift::TypeError)
58
+ lambda { Thrift.check_type("foo", {:type => Thrift::Types::STRUCT}, :foo) }.should raise_error(Thrift::TypeError)
59
+ lambda { Thrift.check_type({:foo => 1}, {:type => Thrift::Types::MAP}, :foo) }.should_not raise_error(Thrift::TypeError)
60
+ lambda { Thrift.check_type([1], {:type => Thrift::Types::MAP}, :foo) }.should raise_error(Thrift::TypeError)
61
+ lambda { Thrift.check_type([1], {:type => Thrift::Types::LIST}, :foo) }.should_not raise_error(Thrift::TypeError)
62
+ lambda { Thrift.check_type({:foo => 1}, {:type => Thrift::Types::LIST}, :foo) }.should raise_error(Thrift::TypeError)
63
+ lambda { Thrift.check_type(Set.new([1,2]), {:type => Thrift::Types::SET}, :foo) }.should_not raise_error(Thrift::TypeError)
64
+ lambda { Thrift.check_type([1,2], {:type => Thrift::Types::SET}, :foo) }.should raise_error(Thrift::TypeError)
65
+ lambda { Thrift.check_type({:foo => true}, {:type => Thrift::Types::SET}, :foo) }.should raise_error(Thrift::TypeError)
67
66
  end
68
67
 
69
68
  it "should error out if nil is passed and skip_types is false" do
70
- lambda { Thrift.check_type(nil, {:type => Types::BOOL}, :foo, false) }.should raise_error(TypeError)
71
- lambda { Thrift.check_type(nil, {:type => Types::BYTE}, :foo, false) }.should raise_error(TypeError)
72
- lambda { Thrift.check_type(nil, {:type => Types::I16}, :foo, false) }.should raise_error(TypeError)
73
- lambda { Thrift.check_type(nil, {:type => Types::I32}, :foo, false) }.should raise_error(TypeError)
74
- lambda { Thrift.check_type(nil, {:type => Types::I64}, :foo, false) }.should raise_error(TypeError)
75
- lambda { Thrift.check_type(nil, {:type => Types::DOUBLE}, :foo, false) }.should raise_error(TypeError)
76
- lambda { Thrift.check_type(nil, {:type => Types::STRING}, :foo, false) }.should raise_error(TypeError)
77
- lambda { Thrift.check_type(nil, {:type => Types::STRUCT}, :foo, false) }.should raise_error(TypeError)
78
- lambda { Thrift.check_type(nil, {:type => Types::LIST}, :foo, false) }.should raise_error(TypeError)
79
- lambda { Thrift.check_type(nil, {:type => Types::SET}, :foo, false) }.should raise_error(TypeError)
80
- lambda { Thrift.check_type(nil, {:type => Types::MAP}, :foo, false) }.should raise_error(TypeError)
69
+ lambda { Thrift.check_type(nil, {:type => Thrift::Types::BOOL}, :foo, false) }.should raise_error(Thrift::TypeError)
70
+ lambda { Thrift.check_type(nil, {:type => Thrift::Types::BYTE}, :foo, false) }.should raise_error(Thrift::TypeError)
71
+ lambda { Thrift.check_type(nil, {:type => Thrift::Types::I16}, :foo, false) }.should raise_error(Thrift::TypeError)
72
+ lambda { Thrift.check_type(nil, {:type => Thrift::Types::I32}, :foo, false) }.should raise_error(Thrift::TypeError)
73
+ lambda { Thrift.check_type(nil, {:type => Thrift::Types::I64}, :foo, false) }.should raise_error(Thrift::TypeError)
74
+ lambda { Thrift.check_type(nil, {:type => Thrift::Types::DOUBLE}, :foo, false) }.should raise_error(Thrift::TypeError)
75
+ lambda { Thrift.check_type(nil, {:type => Thrift::Types::STRING}, :foo, false) }.should raise_error(Thrift::TypeError)
76
+ lambda { Thrift.check_type(nil, {:type => Thrift::Types::STRUCT}, :foo, false) }.should raise_error(Thrift::TypeError)
77
+ lambda { Thrift.check_type(nil, {:type => Thrift::Types::LIST}, :foo, false) }.should raise_error(Thrift::TypeError)
78
+ lambda { Thrift.check_type(nil, {:type => Thrift::Types::SET}, :foo, false) }.should raise_error(Thrift::TypeError)
79
+ lambda { Thrift.check_type(nil, {:type => Thrift::Types::MAP}, :foo, false) }.should raise_error(Thrift::TypeError)
81
80
  end
82
81
 
83
82
  it "should check element types on containers" do
84
- field = {:type => Types::LIST, :element => {:type => Types::I32}}
85
- lambda { Thrift.check_type([1, 2], field, :foo) }.should_not raise_error(TypeError)
86
- lambda { Thrift.check_type([1, nil, 2], field, :foo) }.should raise_error(TypeError)
87
- field = {:type => Types::MAP, :key => {:type => Types::I32}, :value => {:type => Types::STRING}}
88
- lambda { Thrift.check_type({1 => "one", 2 => "two"}, field, :foo) }.should_not raise_error(TypeError)
89
- lambda { Thrift.check_type({1 => "one", nil => "nil"}, field, :foo) }.should raise_error(TypeError)
90
- lambda { Thrift.check_type({1 => nil, 2 => "two"}, field, :foo) }.should raise_error(TypeError)
91
- field = {:type => Types::SET, :element => {:type => Types::I32}}
92
- lambda { Thrift.check_type(Set.new([1, 2]), field, :foo) }.should_not raise_error(TypeError)
93
- lambda { Thrift.check_type(Set.new([1, nil, 2]), field, :foo) }.should raise_error(TypeError)
94
- lambda { Thrift.check_type(Set.new([1, 2.3, 2]), field, :foo) }.should raise_error(TypeError)
95
-
96
- field = {:type => Types::STRUCT, :class => SpecNamespace::Hello}
97
- lambda { Thrift.check_type(SpecNamespace::BoolStruct, field, :foo) }.should raise_error(TypeError)
83
+ field = {:type => Thrift::Types::LIST, :element => {:type => Thrift::Types::I32}}
84
+ lambda { Thrift.check_type([1, 2], field, :foo) }.should_not raise_error(Thrift::TypeError)
85
+ lambda { Thrift.check_type([1, nil, 2], field, :foo) }.should raise_error(Thrift::TypeError)
86
+ field = {:type => Thrift::Types::MAP, :key => {:type => Thrift::Types::I32}, :value => {:type => Thrift::Types::STRING}}
87
+ lambda { Thrift.check_type({1 => "one", 2 => "two"}, field, :foo) }.should_not raise_error(Thrift::TypeError)
88
+ lambda { Thrift.check_type({1 => "one", nil => "nil"}, field, :foo) }.should raise_error(Thrift::TypeError)
89
+ lambda { Thrift.check_type({1 => nil, 2 => "two"}, field, :foo) }.should raise_error(Thrift::TypeError)
90
+ field = {:type => Thrift::Types::SET, :element => {:type => Thrift::Types::I32}}
91
+ lambda { Thrift.check_type(Set.new([1, 2]), field, :foo) }.should_not raise_error(Thrift::TypeError)
92
+ lambda { Thrift.check_type(Set.new([1, nil, 2]), field, :foo) }.should raise_error(Thrift::TypeError)
93
+ lambda { Thrift.check_type(Set.new([1, 2.3, 2]), field, :foo) }.should raise_error(Thrift::TypeError)
94
+
95
+ field = {:type => Thrift::Types::STRUCT, :class => SpecNamespace::Hello}
96
+ lambda { Thrift.check_type(SpecNamespace::BoolStruct, field, :foo) }.should raise_error(Thrift::TypeError)
98
97
  end
99
98
 
100
- it "should give the TypeError a readable message" do
99
+ it "should give the Thrift::TypeError a readable message" do
101
100
  msg = "Expected Types::STRING, received Fixnum for field foo"
102
- lambda { Thrift.check_type(3, {:type => Types::STRING}, :foo) }.should raise_error(TypeError, msg)
101
+ lambda { Thrift.check_type(3, {:type => Thrift::Types::STRING}, :foo) }.should raise_error(Thrift::TypeError, msg)
103
102
  msg = "Expected Types::STRING, received Fixnum for field foo.element"
104
- field = {:type => Types::LIST, :element => {:type => Types::STRING}}
105
- lambda { Thrift.check_type([3], field, :foo) }.should raise_error(TypeError, msg)
103
+ field = {:type => Thrift::Types::LIST, :element => {:type => Thrift::Types::STRING}}
104
+ lambda { Thrift.check_type([3], field, :foo) }.should raise_error(Thrift::TypeError, msg)
106
105
  msg = "Expected Types::I32, received NilClass for field foo.element.key"
107
- field = {:type => Types::LIST,
108
- :element => {:type => Types::MAP,
109
- :key => {:type => Types::I32},
110
- :value => {:type => Types::I32}}}
111
- lambda { Thrift.check_type([{nil => 3}], field, :foo) }.should raise_error(TypeError, msg)
106
+ field = {:type => Thrift::Types::LIST,
107
+ :element => {:type => Thrift::Types::MAP,
108
+ :key => {:type => Thrift::Types::I32},
109
+ :value => {:type => Thrift::Types::I32}}}
110
+ lambda { Thrift.check_type([{nil => 3}], field, :foo) }.should raise_error(Thrift::TypeError, msg)
112
111
  msg = "Expected Types::I32, received NilClass for field foo.element.value"
113
- lambda { Thrift.check_type([{1 => nil}], field, :foo) }.should raise_error(TypeError, msg)
112
+ lambda { Thrift.check_type([{1 => nil}], field, :foo) }.should raise_error(Thrift::TypeError, msg)
114
113
  end
115
114
  end
116
115
  end
data/spec/union_spec.rb CHANGED
@@ -17,21 +17,19 @@
17
17
  # under the License.
18
18
  #
19
19
 
20
- require File.expand_path("#{File.dirname(__FILE__)}/spec_helper")
20
+ require 'spec_helper'
21
21
 
22
- class ThriftUnionSpec < Spec::ExampleGroup
23
- include Thrift
24
- include SpecNamespace
22
+ describe 'Union' do
25
23
 
26
- describe Union do
24
+ describe Thrift::Union do
27
25
  it "should return nil value in unset union" do
28
- union = My_union.new
26
+ union = SpecNamespace::My_union.new
29
27
  union.get_set_field.should == nil
30
28
  union.get_value.should == nil
31
29
  end
32
30
 
33
31
  it "should set a field and be accessible through get_value and the named field accessor" do
34
- union = My_union.new
32
+ union = SpecNamespace::My_union.new
35
33
  union.integer32 = 25
36
34
  union.get_set_field.should == :integer32
37
35
  union.get_value.should == 25
@@ -39,30 +37,30 @@ class ThriftUnionSpec < Spec::ExampleGroup
39
37
  end
40
38
 
41
39
  it "should work correctly when instantiated with static field constructors" do
42
- union = My_union.integer32(5)
40
+ union = SpecNamespace::My_union.integer32(5)
43
41
  union.get_set_field.should == :integer32
44
42
  union.integer32.should == 5
45
43
  end
46
44
 
47
45
  it "should raise for wrong set field" do
48
- union = My_union.new
46
+ union = SpecNamespace::My_union.new
49
47
  union.integer32 = 25
50
48
  lambda { union.some_characters }.should raise_error(RuntimeError, "some_characters is not union's set field.")
51
49
  end
52
-
50
+
53
51
  it "should not be equal to nil" do
54
- union = My_union.new
52
+ union = SpecNamespace::My_union.new
55
53
  union.should_not == nil
56
54
  end
57
-
55
+
58
56
  it "should not equate two different unions, i32 vs. string" do
59
- union = My_union.new(:integer32, 25)
60
- other_union = My_union.new(:some_characters, "blah!")
57
+ union = SpecNamespace::My_union.new(:integer32, 25)
58
+ other_union = SpecNamespace::My_union.new(:some_characters, "blah!")
61
59
  union.should_not == other_union
62
60
  end
63
61
 
64
62
  it "should properly reset setfield and setvalue" do
65
- union = My_union.new(:integer32, 25)
63
+ union = SpecNamespace::My_union.new(:integer32, 25)
66
64
  union.get_set_field.should == :integer32
67
65
  union.some_characters = "blah!"
68
66
  union.get_set_field.should == :some_characters
@@ -71,70 +69,82 @@ class ThriftUnionSpec < Spec::ExampleGroup
71
69
  end
72
70
 
73
71
  it "should not equate two different unions with different values" do
74
- union = My_union.new(:integer32, 25)
75
- other_union = My_union.new(:integer32, 400)
72
+ union = SpecNamespace::My_union.new(:integer32, 25)
73
+ other_union = SpecNamespace::My_union.new(:integer32, 400)
76
74
  union.should_not == other_union
77
75
  end
78
76
 
79
77
  it "should not equate two different unions with different fields" do
80
- union = My_union.new(:integer32, 25)
81
- other_union = My_union.new(:other_i32, 25)
78
+ union = SpecNamespace::My_union.new(:integer32, 25)
79
+ other_union = SpecNamespace::My_union.new(:other_i32, 25)
82
80
  union.should_not == other_union
83
81
  end
84
82
 
85
83
  it "should inspect properly" do
86
- union = My_union.new(:integer32, 25)
84
+ union = SpecNamespace::My_union.new(:integer32, 25)
87
85
  union.inspect.should == "<SpecNamespace::My_union integer32: 25>"
88
86
  end
89
87
 
90
88
  it "should not allow setting with instance_variable_set" do
91
- union = My_union.new(:integer32, 27)
89
+ union = SpecNamespace::My_union.new(:integer32, 27)
92
90
  union.instance_variable_set(:@some_characters, "hallo!")
93
91
  union.get_set_field.should == :integer32
94
92
  union.get_value.should == 27
95
93
  lambda { union.some_characters }.should raise_error(RuntimeError, "some_characters is not union's set field.")
96
94
  end
97
95
 
98
- it "should serialize correctly" do
96
+ it "should serialize to binary correctly" do
99
97
  trans = Thrift::MemoryBufferTransport.new
100
98
  proto = Thrift::BinaryProtocol.new(trans)
101
99
 
102
- union = My_union.new(:integer32, 25)
100
+ union = SpecNamespace::My_union.new(:integer32, 25)
101
+ union.write(proto)
102
+
103
+ other_union = SpecNamespace::My_union.new(:integer32, 25)
104
+ other_union.read(proto)
105
+ other_union.should == union
106
+ end
107
+
108
+ it "should serialize to json correctly" do
109
+ trans = Thrift::MemoryBufferTransport.new
110
+ proto = Thrift::JsonProtocol.new(trans)
111
+
112
+ union = SpecNamespace::My_union.new(:integer32, 25)
103
113
  union.write(proto)
104
114
 
105
- other_union = My_union.new(:integer32, 25)
115
+ other_union = SpecNamespace::My_union.new(:integer32, 25)
106
116
  other_union.read(proto)
107
117
  other_union.should == union
108
118
  end
109
119
 
110
120
  it "should raise when validating unset union" do
111
- union = My_union.new
121
+ union = SpecNamespace::My_union.new
112
122
  lambda { union.validate }.should raise_error(StandardError, "Union fields are not set.")
113
123
 
114
- other_union = My_union.new(:integer32, 1)
124
+ other_union = SpecNamespace::My_union.new(:integer32, 1)
115
125
  lambda { other_union.validate }.should_not raise_error(StandardError, "Union fields are not set.")
116
126
  end
117
127
 
118
128
  it "should validate an enum field properly" do
119
- union = TestUnion.new(:enum_field, 3)
129
+ union = SpecNamespace::TestUnion.new(:enum_field, 3)
120
130
  union.get_set_field.should == :enum_field
121
- lambda { union.validate }.should raise_error(ProtocolException, "Invalid value of field enum_field!")
131
+ lambda { union.validate }.should raise_error(Thrift::ProtocolException, "Invalid value of field enum_field!")
122
132
 
123
- other_union = TestUnion.new(:enum_field, 1)
124
- lambda { other_union.validate }.should_not raise_error(ProtocolException, "Invalid value of field enum_field!")
133
+ other_union = SpecNamespace::TestUnion.new(:enum_field, 1)
134
+ lambda { other_union.validate }.should_not raise_error(Thrift::ProtocolException, "Invalid value of field enum_field!")
125
135
  end
126
136
 
127
137
  it "should properly serialize and match structs with a union" do
128
- union = My_union.new(:integer32, 26)
129
- swu = Struct_with_union.new(:fun_union => union)
138
+ union = SpecNamespace::My_union.new(:integer32, 26)
139
+ swu = SpecNamespace::Struct_with_union.new(:fun_union => union)
130
140
 
131
141
  trans = Thrift::MemoryBufferTransport.new
132
142
  proto = Thrift::CompactProtocol.new(trans)
133
143
 
134
144
  swu.write(proto)
135
145
 
136
- other_union = My_union.new(:some_characters, "hello there")
137
- swu2 = Struct_with_union.new(:fun_union => other_union)
146
+ other_union = SpecNamespace::My_union.new(:some_characters, "hello there")
147
+ swu2 = SpecNamespace::Struct_with_union.new(:fun_union => other_union)
138
148
 
139
149
  swu2.should_not == swu
140
150
 
@@ -143,30 +153,30 @@ class ThriftUnionSpec < Spec::ExampleGroup
143
153
  end
144
154
 
145
155
  it "should support old style constructor" do
146
- union = My_union.new(:integer32 => 26)
156
+ union = SpecNamespace::My_union.new(:integer32 => 26)
147
157
  union.get_set_field.should == :integer32
148
158
  union.get_value.should == 26
149
159
  end
150
160
 
151
161
  it "should not throw an error when inspected and unset" do
152
- lambda{TestUnion.new().inspect}.should_not raise_error
162
+ lambda{SpecNamespace::TestUnion.new().inspect}.should_not raise_error
153
163
  end
154
164
 
155
165
  it "should print enum value name when inspected" do
156
- My_union.new(:some_enum => SomeEnum::ONE).inspect.should == "<SpecNamespace::My_union some_enum: ONE (0)>"
166
+ SpecNamespace::My_union.new(:some_enum => SpecNamespace::SomeEnum::ONE).inspect.should == "<SpecNamespace::My_union some_enum: ONE (0)>"
157
167
 
158
- My_union.new(:my_map => {SomeEnum::ONE => [SomeEnum::TWO]}).inspect.should == "<SpecNamespace::My_union my_map: {ONE (0): [TWO (1)]}>"
168
+ SpecNamespace::My_union.new(:my_map => {SpecNamespace::SomeEnum::ONE => [SpecNamespace::SomeEnum::TWO]}).inspect.should == "<SpecNamespace::My_union my_map: {ONE (0): [TWO (1)]}>"
159
169
  end
160
170
 
161
171
  it "should offer field? methods" do
162
- My_union.new.some_enum?.should be_false
163
- My_union.new(:some_enum => SomeEnum::ONE).some_enum?.should be_true
164
- My_union.new(:im_true => false).im_true?.should be_true
165
- My_union.new(:im_true => true).im_true?.should be_true
172
+ SpecNamespace::My_union.new.some_enum?.should be_false
173
+ SpecNamespace::My_union.new(:some_enum => SpecNamespace::SomeEnum::ONE).some_enum?.should be_true
174
+ SpecNamespace::My_union.new(:im_true => false).im_true?.should be_true
175
+ SpecNamespace::My_union.new(:im_true => true).im_true?.should be_true
166
176
  end
167
177
 
168
178
  it "should pretty print binary fields" do
169
- TestUnion.new(:binary_field => "\001\002\003").inspect.should == "<SpecNamespace::TestUnion binary_field: 010203>"
179
+ SpecNamespace::TestUnion.new(:binary_field => "\001\002\003").inspect.should == "<SpecNamespace::TestUnion binary_field: 010203>"
170
180
  end
171
181
 
172
182
  it "should be comparable" do
@@ -177,10 +187,10 @@ class ThriftUnionSpec < Spec::ExampleGroup
177
187
  [1, 1, 1, 0]]
178
188
 
179
189
  objs = [
180
- TestUnion.new(:string_field, "blah"),
181
- TestUnion.new(:string_field, "blahblah"),
182
- TestUnion.new(:i32_field, 1),
183
- TestUnion.new()]
190
+ SpecNamespace::TestUnion.new(:string_field, "blah"),
191
+ SpecNamespace::TestUnion.new(:string_field, "blahblah"),
192
+ SpecNamespace::TestUnion.new(:i32_field, 1),
193
+ SpecNamespace::TestUnion.new()]
184
194
 
185
195
  for y in 0..3
186
196
  for x in 0..3