thrift-mavericks 0.8.0 → 0.9.0.1

Sign up to get free protection for your applications and to get access to all the features.
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