blob: d1da6217ed600d3f41669af4988b75df9f4d399d [file] [log] [blame]
David Reissea2cba82009-03-30 21:35:00 +00001#
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
Jake Farrella87810f2012-09-28 01:59:04 +000020require 'spec_helper'
Kevin Clark95833c52008-06-18 01:04:34 +000021
Jake Farrella87810f2012-09-28 01:59:04 +000022describe 'Exception' do
Kevin Clark0ff9e8c2008-06-18 01:05:03 +000023
Jake Farrella87810f2012-09-28 01:59:04 +000024 describe Thrift::Exception do
Kevin Clark61387bf2008-06-18 01:04:48 +000025 it "should have an accessible message" do
Jake Farrella87810f2012-09-28 01:59:04 +000026 e = Thrift::Exception.new("test message")
Kevin Clark61387bf2008-06-18 01:04:48 +000027 e.message.should == "test message"
28 end
Kevin Clark95833c52008-06-18 01:04:34 +000029 end
Kevin Clark95833c52008-06-18 01:04:34 +000030
Jake Farrella87810f2012-09-28 01:59:04 +000031 describe Thrift::ApplicationException do
Kevin Clark61387bf2008-06-18 01:04:48 +000032 it "should inherit from Thrift::Exception" do
Jake Farrella87810f2012-09-28 01:59:04 +000033 Thrift::ApplicationException.superclass.should == Thrift::Exception
Kevin Clark61387bf2008-06-18 01:04:48 +000034 end
Kevin Clark95833c52008-06-18 01:04:34 +000035
Kevin Clark61387bf2008-06-18 01:04:48 +000036 it "should have an accessible type and message" do
Jake Farrella87810f2012-09-28 01:59:04 +000037 e = Thrift::ApplicationException.new
38 e.type.should == Thrift::ApplicationException::UNKNOWN
Kevin Clark61387bf2008-06-18 01:04:48 +000039 e.message.should be_nil
Jake Farrella87810f2012-09-28 01:59:04 +000040 e = Thrift::ApplicationException.new(Thrift::ApplicationException::UNKNOWN_METHOD, "test message")
41 e.type.should == Thrift::ApplicationException::UNKNOWN_METHOD
Kevin Clark61387bf2008-06-18 01:04:48 +000042 e.message.should == "test message"
43 end
44
45 it "should read a struct off of a protocol" do
46 prot = mock("MockProtocol")
47 prot.should_receive(:read_struct_begin).ordered
48 prot.should_receive(:read_field_begin).exactly(3).times.and_return(
Jake Farrella87810f2012-09-28 01:59:04 +000049 ["message", Thrift::Types::STRING, 1],
50 ["type", Thrift::Types::I32, 2],
51 [nil, Thrift::Types::STOP, 0]
Kevin Clark61387bf2008-06-18 01:04:48 +000052 )
53 prot.should_receive(:read_string).ordered.and_return "test message"
Jake Farrella87810f2012-09-28 01:59:04 +000054 prot.should_receive(:read_i32).ordered.and_return Thrift::ApplicationException::BAD_SEQUENCE_ID
Kevin Clark61387bf2008-06-18 01:04:48 +000055 prot.should_receive(:read_field_end).exactly(2).times
56 prot.should_receive(:read_struct_end).ordered
57
Jake Farrella87810f2012-09-28 01:59:04 +000058 e = Thrift::ApplicationException.new
Kevin Clark61387bf2008-06-18 01:04:48 +000059 e.read(prot)
60 e.message.should == "test message"
Jake Farrella87810f2012-09-28 01:59:04 +000061 e.type.should == Thrift::ApplicationException::BAD_SEQUENCE_ID
Kevin Clark61387bf2008-06-18 01:04:48 +000062 end
63
64 it "should skip bad fields when reading a struct" do
65 prot = mock("MockProtocol")
66 prot.should_receive(:read_struct_begin).ordered
67 prot.should_receive(:read_field_begin).exactly(5).times.and_return(
Jake Farrella87810f2012-09-28 01:59:04 +000068 ["type", Thrift::Types::I32, 2],
69 ["type", Thrift::Types::STRING, 2],
70 ["message", Thrift::Types::MAP, 1],
71 ["message", Thrift::Types::STRING, 3],
72 [nil, Thrift::Types::STOP, 0]
Kevin Clark61387bf2008-06-18 01:04:48 +000073 )
Jake Farrella87810f2012-09-28 01:59:04 +000074 prot.should_receive(:read_i32).and_return Thrift::ApplicationException::INVALID_MESSAGE_TYPE
75 prot.should_receive(:skip).with(Thrift::Types::STRING).twice
76 prot.should_receive(:skip).with(Thrift::Types::MAP)
Kevin Clark61387bf2008-06-18 01:04:48 +000077 prot.should_receive(:read_field_end).exactly(4).times
78 prot.should_receive(:read_struct_end).ordered
79
Jake Farrella87810f2012-09-28 01:59:04 +000080 e = Thrift::ApplicationException.new
Kevin Clark61387bf2008-06-18 01:04:48 +000081 e.read(prot)
82 e.message.should be_nil
Jake Farrella87810f2012-09-28 01:59:04 +000083 e.type.should == Thrift::ApplicationException::INVALID_MESSAGE_TYPE
Kevin Clark61387bf2008-06-18 01:04:48 +000084 end
85
86 it "should write a Thrift::ApplicationException struct to the oprot" do
87 prot = mock("MockProtocol")
88 prot.should_receive(:write_struct_begin).with("Thrift::ApplicationException").ordered
Jake Farrella87810f2012-09-28 01:59:04 +000089 prot.should_receive(:write_field_begin).with("message", Thrift::Types::STRING, 1).ordered
Kevin Clark61387bf2008-06-18 01:04:48 +000090 prot.should_receive(:write_string).with("test message").ordered
Jake Farrella87810f2012-09-28 01:59:04 +000091 prot.should_receive(:write_field_begin).with("type", Thrift::Types::I32, 2).ordered
92 prot.should_receive(:write_i32).with(Thrift::ApplicationException::UNKNOWN_METHOD).ordered
Kevin Clark61387bf2008-06-18 01:04:48 +000093 prot.should_receive(:write_field_end).twice
94 prot.should_receive(:write_field_stop).ordered
95 prot.should_receive(:write_struct_end).ordered
96
Jake Farrella87810f2012-09-28 01:59:04 +000097 e = Thrift::ApplicationException.new(Thrift::ApplicationException::UNKNOWN_METHOD, "test message")
Kevin Clark61387bf2008-06-18 01:04:48 +000098 e.write(prot)
99 end
100
101 it "should skip nil fields when writing to the oprot" do
102 prot = mock("MockProtocol")
103 prot.should_receive(:write_struct_begin).with("Thrift::ApplicationException").ordered
Jake Farrella87810f2012-09-28 01:59:04 +0000104 prot.should_receive(:write_field_begin).with("message", Thrift::Types::STRING, 1).ordered
Kevin Clark61387bf2008-06-18 01:04:48 +0000105 prot.should_receive(:write_string).with("test message").ordered
106 prot.should_receive(:write_field_end).ordered
107 prot.should_receive(:write_field_stop).ordered
108 prot.should_receive(:write_struct_end).ordered
109
Jake Farrella87810f2012-09-28 01:59:04 +0000110 e = Thrift::ApplicationException.new(nil, "test message")
Kevin Clark61387bf2008-06-18 01:04:48 +0000111 e.write(prot)
112
113 prot = mock("MockProtocol")
114 prot.should_receive(:write_struct_begin).with("Thrift::ApplicationException").ordered
Jake Farrella87810f2012-09-28 01:59:04 +0000115 prot.should_receive(:write_field_begin).with("type", Thrift::Types::I32, 2).ordered
116 prot.should_receive(:write_i32).with(Thrift::ApplicationException::BAD_SEQUENCE_ID).ordered
Kevin Clark61387bf2008-06-18 01:04:48 +0000117 prot.should_receive(:write_field_end).ordered
118 prot.should_receive(:write_field_stop).ordered
119 prot.should_receive(:write_struct_end).ordered
120
Jake Farrella87810f2012-09-28 01:59:04 +0000121 e = Thrift::ApplicationException.new(Thrift::ApplicationException::BAD_SEQUENCE_ID)
Kevin Clark61387bf2008-06-18 01:04:48 +0000122 e.write(prot)
123
124 prot = mock("MockProtocol")
125 prot.should_receive(:write_struct_begin).with("Thrift::ApplicationException").ordered
126 prot.should_receive(:write_field_stop).ordered
127 prot.should_receive(:write_struct_end).ordered
128
Jake Farrella87810f2012-09-28 01:59:04 +0000129 e = Thrift::ApplicationException.new(nil)
Kevin Clark61387bf2008-06-18 01:04:48 +0000130 e.write(prot)
131 end
Kevin Clark95833c52008-06-18 01:04:34 +0000132 end
Kevin Clarkdfaada42008-06-18 01:06:01 +0000133
Jake Farrella87810f2012-09-28 01:59:04 +0000134 describe Thrift::ProtocolException do
Kevin Clarkdfaada42008-06-18 01:06:01 +0000135 it "should have an accessible type" do
Jake Farrella87810f2012-09-28 01:59:04 +0000136 prot = Thrift::ProtocolException.new(Thrift::ProtocolException::SIZE_LIMIT, "message")
137 prot.type.should == Thrift::ProtocolException::SIZE_LIMIT
Kevin Clarkdfaada42008-06-18 01:06:01 +0000138 prot.message.should == "message"
139 end
140 end
Kevin Clark95833c52008-06-18 01:04:34 +0000141end