xdr 0.1.0 → 3.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +31 -0
- data/README.md +7 -2
- data/lib/xdr.rb +0 -1
- data/lib/xdr/concerns/converts_to_xdr.rb +47 -24
- data/lib/xdr/concerns/reads_bytes.rb +8 -0
- data/lib/xdr/dsl/enum.rb +1 -1
- data/lib/xdr/opaque.rb +1 -1
- data/lib/xdr/string.rb +1 -1
- data/lib/xdr/struct.rb +1 -1
- data/lib/xdr/union.rb +15 -6
- data/lib/xdr/var_opaque.rb +1 -1
- data/lib/xdr/version.rb +1 -1
- metadata +47 -133
- data/.gitignore +0 -15
- data/.travis.yml +0 -14
- data/.yardopts +0 -7
- data/Gemfile +0 -4
- data/Guardfile +0 -5
- data/Rakefile +0 -9
- data/examples/enum.rb +0 -30
- data/examples/struct.rb +0 -24
- data/examples/union.rb +0 -29
- data/spec/lib/xdr/array_spec.rb +0 -73
- data/spec/lib/xdr/bool_spec.rb +0 -43
- data/spec/lib/xdr/concerns/converts_to_xdr_spec.rb +0 -55
- data/spec/lib/xdr/concerns/reads_bytes_spec.rb +0 -31
- data/spec/lib/xdr/double_spec.rb +0 -38
- data/spec/lib/xdr/dsl/enum_spec.rb +0 -44
- data/spec/lib/xdr/dsl/struct_spec.rb +0 -29
- data/spec/lib/xdr/dsl/union_spec.rb +0 -69
- data/spec/lib/xdr/enum_spec.rb +0 -70
- data/spec/lib/xdr/float_spec.rb +0 -37
- data/spec/lib/xdr/hyper_spec.rb +0 -40
- data/spec/lib/xdr/int_spec.rb +0 -40
- data/spec/lib/xdr/opaque_spec.rb +0 -36
- data/spec/lib/xdr/option_spec.rb +0 -36
- data/spec/lib/xdr/quadruple_spec.rb +0 -14
- data/spec/lib/xdr/rpc/record_reader_spec.rb +0 -27
- data/spec/lib/xdr/string_spec.rb +0 -41
- data/spec/lib/xdr/struct_spec.rb +0 -101
- data/spec/lib/xdr/union_spec.rb +0 -248
- data/spec/lib/xdr/unsigned_hyper_spec.rb +0 -36
- data/spec/lib/xdr/unsigned_int_spec.rb +0 -36
- data/spec/lib/xdr/var_array_spec.rb +0 -71
- data/spec/lib/xdr/var_opaque_spec.rb +0 -43
- data/spec/lib/xdr/void_spec.rb +0 -46
- data/spec/spec_helper.rb +0 -15
- data/spec/support/matchers/eq_bytes.rb +0 -6
- data/xdr.gemspec +0 -29
@@ -1,69 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
|
4
|
-
describe XDR::DSL::Union, "#switch" do
|
5
|
-
|
6
|
-
it "allows symbols in switch declarations" do
|
7
|
-
expect do
|
8
|
-
klass = Class.new(XDR::Union) do
|
9
|
-
switch_on ResultType, :type
|
10
|
-
switch :ok
|
11
|
-
end
|
12
|
-
|
13
|
-
klass.new(:ok)
|
14
|
-
end.to_not raise_error
|
15
|
-
end
|
16
|
-
|
17
|
-
class ResultType < XDR::Enum
|
18
|
-
member :ok, 0
|
19
|
-
member :error, 1
|
20
|
-
seal
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
describe XDR::DSL::Union, "#switch_on" do
|
25
|
-
klass = nil
|
26
|
-
|
27
|
-
it "allows int types" do
|
28
|
-
expect do
|
29
|
-
klass = Class.new(XDR::Union) do
|
30
|
-
switch_on XDR::Int, :type
|
31
|
-
switch 0
|
32
|
-
switch 1
|
33
|
-
end
|
34
|
-
end.to_not raise_error
|
35
|
-
|
36
|
-
expect{ klass.new(0) }.to_not raise_error
|
37
|
-
expect{ klass.new(1) }.to_not raise_error
|
38
|
-
expect{ klass.new(2) }.to raise_error(XDR::InvalidSwitchError)
|
39
|
-
end
|
40
|
-
|
41
|
-
it "allows unsigned int types" do
|
42
|
-
expect do
|
43
|
-
klass = Class.new(XDR::Union) do
|
44
|
-
switch_on XDR::UnsignedInt, :type
|
45
|
-
switch 0
|
46
|
-
switch 1
|
47
|
-
end
|
48
|
-
end.to_not raise_error
|
49
|
-
|
50
|
-
expect{ klass.new(0) }.to_not raise_error
|
51
|
-
expect{ klass.new(1) }.to_not raise_error
|
52
|
-
expect{ klass.new(2) }.to raise_error(XDR::InvalidSwitchError)
|
53
|
-
expect{ klass.new(-1) }.to raise_error(XDR::InvalidSwitchError)
|
54
|
-
end
|
55
|
-
|
56
|
-
it "allows bool types", :focus do
|
57
|
-
klass = nil
|
58
|
-
|
59
|
-
expect do
|
60
|
-
klass = Class.new(XDR::Union) do
|
61
|
-
switch_on XDR::Bool, :type
|
62
|
-
switch true
|
63
|
-
end
|
64
|
-
end.to_not raise_error
|
65
|
-
|
66
|
-
expect{ klass.new(true) }.to_not raise_error
|
67
|
-
expect{ klass.new(false) }.to raise_error(XDR::InvalidSwitchError)
|
68
|
-
end
|
69
|
-
end
|
data/spec/lib/xdr/enum_spec.rb
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
class TestColor < XDR::Enum
|
4
|
-
member :red, 0
|
5
|
-
member :green, 1
|
6
|
-
member :even_more_green, 3
|
7
|
-
|
8
|
-
seal
|
9
|
-
end
|
10
|
-
|
11
|
-
describe XDR::Enum, ".read" do
|
12
|
-
let(:zero) { "\x00\x00\x00\x00" }
|
13
|
-
let(:one) { "\x00\x00\x00\x01" }
|
14
|
-
let(:two) { "\x00\x00\x00\x02" }
|
15
|
-
|
16
|
-
subject{ TestColor }
|
17
|
-
|
18
|
-
it "decodes values correctly" do
|
19
|
-
expect( read zero ).to eq(TestColor.red)
|
20
|
-
expect( read one ).to eq(TestColor.green)
|
21
|
-
end
|
22
|
-
|
23
|
-
it "raises EnumValueError if the decoded value is not in the defined constants" do
|
24
|
-
expect{ read two }.to raise_error XDR::EnumValueError
|
25
|
-
end
|
26
|
-
|
27
|
-
def read(str)
|
28
|
-
io = StringIO.new(str)
|
29
|
-
subject.read(io)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
describe XDR::Enum, ".write" do
|
34
|
-
subject{ TestColor }
|
35
|
-
|
36
|
-
it "encodes values correctly" do
|
37
|
-
expect( write TestColor.red ).to eq("\x00\x00\x00\x00")
|
38
|
-
expect( write TestColor.green ).to eq("\x00\x00\x00\x01")
|
39
|
-
end
|
40
|
-
|
41
|
-
it "raises WriteError if value isn't a member" do
|
42
|
-
expect{ write 0 }.to raise_error XDR::WriteError
|
43
|
-
expect{ write 1 }.to raise_error XDR::WriteError
|
44
|
-
end
|
45
|
-
|
46
|
-
def write(val)
|
47
|
-
io = StringIO.new()
|
48
|
-
subject.write(val, io)
|
49
|
-
io.string
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
describe XDR::Enum, ".from_name" do
|
54
|
-
subject{ TestColor }
|
55
|
-
|
56
|
-
it "returns the correct value" do
|
57
|
-
expect(subject.from_name("red")).to eq(TestColor.red)
|
58
|
-
end
|
59
|
-
|
60
|
-
it "allows various casings, strings or symbols" do
|
61
|
-
expect(subject.from_name("even_more_green")).to eq(TestColor.even_more_green)
|
62
|
-
expect(subject.from_name("EVEN_MORE_GREEN")).to eq(TestColor.even_more_green)
|
63
|
-
expect(subject.from_name(:even_more_green)).to eq(TestColor.even_more_green)
|
64
|
-
expect(subject.from_name(:EVEN_MORE_GREEN)).to eq(TestColor.even_more_green)
|
65
|
-
end
|
66
|
-
|
67
|
-
it "raises EnumNameError when the name is not a member" do
|
68
|
-
expect{ subject.from_name("chartreuse")}.to raise_error(XDR::EnumNameError)
|
69
|
-
end
|
70
|
-
end
|
data/spec/lib/xdr/float_spec.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
|
4
|
-
describe XDR::Float, ".read" do
|
5
|
-
it "decodes values correctly" do
|
6
|
-
expect(read("\x00\x00\x00\x00")).to eq(0.0)
|
7
|
-
expect(read("\x80\x00\x00\x00")).to eq(-0.0)
|
8
|
-
expect(read("\x3F\x80\x00\x00")).to eq(1.0)
|
9
|
-
expect(read("\xBF\x80\x00\x00")).to eq(-1.0)
|
10
|
-
end
|
11
|
-
|
12
|
-
def read(str)
|
13
|
-
io = StringIO.new(str)
|
14
|
-
subject.read(io)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
describe XDR::Float, ".write" do
|
19
|
-
it "encodes values correctly" do
|
20
|
-
expect(write(0.0)).to eq_bytes("\x00\x00\x00\x00")
|
21
|
-
expect(write(-0.0)).to eq_bytes("\x80\x00\x00\x00")
|
22
|
-
expect(write(1.0)).to eq_bytes("\x3F\x80\x00\x00")
|
23
|
-
expect(write(-1.0)).to eq_bytes("\xBF\x80\x00\x00")
|
24
|
-
end
|
25
|
-
|
26
|
-
it "raises a WriteError when the value is not Float" do
|
27
|
-
expect{ write 3 }.to raise_error(XDR::WriteError)
|
28
|
-
expect{ write "hello" }.to raise_error(XDR::WriteError)
|
29
|
-
expect{ write "1.0" }.to raise_error(XDR::WriteError)
|
30
|
-
end
|
31
|
-
|
32
|
-
def write(val)
|
33
|
-
io = StringIO.new()
|
34
|
-
subject.write(val, io)
|
35
|
-
io.string
|
36
|
-
end
|
37
|
-
end
|
data/spec/lib/xdr/hyper_spec.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
|
4
|
-
describe XDR::Hyper, ".read" do
|
5
|
-
|
6
|
-
it "decodes values correctly" do
|
7
|
-
expect(read("\x00\x00\x00\x00\x00\x00\x00\x00")).to eq(0)
|
8
|
-
expect(read("\x00\x00\x00\x00\x00\x00\x00\x01")).to eq(1)
|
9
|
-
expect(read("\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF")).to eq(-1)
|
10
|
-
expect(read("\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF")).to eq(2**63 - 1)
|
11
|
-
expect(read("\x80\x00\x00\x00\x00\x00\x00\x00")).to eq(-(2**63))
|
12
|
-
end
|
13
|
-
|
14
|
-
def read(str)
|
15
|
-
io = StringIO.new(str)
|
16
|
-
subject.read(io)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
describe XDR::Hyper, ".write" do
|
21
|
-
|
22
|
-
it "decodes values correctly" do
|
23
|
-
expect(write 0).to eq_bytes("\x00\x00\x00\x00\x00\x00\x00\x00")
|
24
|
-
expect(write 1).to eq_bytes("\x00\x00\x00\x00\x00\x00\x00\x01")
|
25
|
-
expect(write -1).to eq_bytes("\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF")
|
26
|
-
expect(write 2**63 - 1).to eq_bytes("\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF")
|
27
|
-
expect(write -(2**63)).to eq_bytes("\x80\x00\x00\x00\x00\x00\x00\x00")
|
28
|
-
end
|
29
|
-
|
30
|
-
it "raises WriteError when an Integer isn't passed" do
|
31
|
-
expect{ write 1.0 }.to raise_error(XDR::WriteError)
|
32
|
-
expect{ write "hi" }.to raise_error(XDR::WriteError)
|
33
|
-
end
|
34
|
-
|
35
|
-
def write(val)
|
36
|
-
io = StringIO.new()
|
37
|
-
subject.write(val, io)
|
38
|
-
io.string
|
39
|
-
end
|
40
|
-
end
|
data/spec/lib/xdr/int_spec.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
|
4
|
-
describe XDR::Int, ".read" do
|
5
|
-
|
6
|
-
it "decodes values correctly" do
|
7
|
-
expect(read("\x00\x00\x00\x00")).to eq(0)
|
8
|
-
expect(read("\x00\x00\x00\x01")).to eq(1)
|
9
|
-
expect(read("\xFF\xFF\xFF\xFF")).to eq(-1)
|
10
|
-
expect(read("\x7F\xFF\xFF\xFF")).to eq(2**31 - 1)
|
11
|
-
expect(read("\x80\x00\x00\x00")).to eq(-(2**31))
|
12
|
-
end
|
13
|
-
|
14
|
-
def read(str)
|
15
|
-
io = StringIO.new(str)
|
16
|
-
subject.read(io)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
describe XDR::Int, ".write" do
|
21
|
-
|
22
|
-
it "decodes values correctly" do
|
23
|
-
expect(write 0).to eq_bytes("\x00\x00\x00\x00")
|
24
|
-
expect(write 1).to eq_bytes("\x00\x00\x00\x01")
|
25
|
-
expect(write -1).to eq_bytes("\xFF\xFF\xFF\xFF")
|
26
|
-
expect(write 2**31 - 1).to eq_bytes("\x7F\xFF\xFF\xFF")
|
27
|
-
expect(write -(2**31)).to eq_bytes("\x80\x00\x00\x00")
|
28
|
-
end
|
29
|
-
|
30
|
-
it "raises WriteError when an Integer isn't passed" do
|
31
|
-
expect{ write 1.0 }.to raise_error(XDR::WriteError)
|
32
|
-
expect{ write "hi" }.to raise_error(XDR::WriteError)
|
33
|
-
end
|
34
|
-
|
35
|
-
def write(val)
|
36
|
-
io = StringIO.new()
|
37
|
-
subject.write(val, io)
|
38
|
-
io.string
|
39
|
-
end
|
40
|
-
end
|
data/spec/lib/xdr/opaque_spec.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
|
4
|
-
describe XDR::Opaque, "#read" do
|
5
|
-
subject{ XDR::Opaque.new(3) }
|
6
|
-
|
7
|
-
it "decodes values correctly" do
|
8
|
-
expect(read("\x00\x00\x00\x00")).to eq("\x00\x00\x00")
|
9
|
-
expect(read("\x00\x01\x00\x00")).to eq("\x00\x01\x00")
|
10
|
-
end
|
11
|
-
|
12
|
-
def read(str)
|
13
|
-
io = StringIO.new(str)
|
14
|
-
subject.read(io)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
describe XDR::Opaque, "#write" do
|
19
|
-
subject{ XDR::Opaque.new(3) }
|
20
|
-
|
21
|
-
it "encodes values correctly" do
|
22
|
-
expect(write("123")).to eq("123\x00")
|
23
|
-
expect(write("124")).to eq("124\x00")
|
24
|
-
end
|
25
|
-
|
26
|
-
it "raises a WriteError if the value is not the correct length" do
|
27
|
-
expect{ write("1234") }.to raise_error(XDR::WriteError)
|
28
|
-
expect{ write("12") }.to raise_error(XDR::WriteError)
|
29
|
-
end
|
30
|
-
|
31
|
-
def write(val)
|
32
|
-
io = StringIO.new()
|
33
|
-
subject.write(val, io)
|
34
|
-
io.string
|
35
|
-
end
|
36
|
-
end
|
data/spec/lib/xdr/option_spec.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
|
4
|
-
describe XDR::Option, ".read" do
|
5
|
-
subject{ XDR::Option[XDR::Int] }
|
6
|
-
|
7
|
-
it "decodes values correctly" do
|
8
|
-
expect(read "\x00\x00\x00\x01\x00\x00\x00\x00" ).to eq(0)
|
9
|
-
expect(read "\x00\x00\x00\x00" ).to eq(nil)
|
10
|
-
end
|
11
|
-
|
12
|
-
def read(str)
|
13
|
-
io = StringIO.new(str)
|
14
|
-
subject.read(io)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
describe XDR::Option, ".write" do
|
19
|
-
subject{ XDR::Option[XDR::Int] }
|
20
|
-
|
21
|
-
it "decodes values correctly" do
|
22
|
-
expect(write 0).to eq_bytes("\x00\x00\x00\x01\x00\x00\x00\x00")
|
23
|
-
expect(write nil).to eq_bytes("\x00\x00\x00\x00")
|
24
|
-
end
|
25
|
-
|
26
|
-
it "raises WriteError when the provided value is non-nil bust invalid for the child type" do
|
27
|
-
expect{ write 1.0 }.to raise_error(XDR::WriteError)
|
28
|
-
expect{ write "hi" }.to raise_error(XDR::WriteError)
|
29
|
-
end
|
30
|
-
|
31
|
-
def write(val)
|
32
|
-
io = StringIO.new()
|
33
|
-
subject.write(val, io)
|
34
|
-
io.string
|
35
|
-
end
|
36
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
|
4
|
-
describe XDR::Quadruple, ".read" do
|
5
|
-
let(:zero){ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }
|
6
|
-
it "cannot decode values yet" do
|
7
|
-
expect{ read zero }.to raise_error(NotImplementedError)
|
8
|
-
end
|
9
|
-
|
10
|
-
def read(str)
|
11
|
-
io = StringIO.new(str)
|
12
|
-
subject.read(io)
|
13
|
-
end
|
14
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe XDR::RPC::RecordReader, "#read" do
|
4
|
-
|
5
|
-
it "decodes values correctly" do
|
6
|
-
empty_record = read "\x00\x00\x00\x00"
|
7
|
-
last_record = read "\x80\x00\x00\x02\x00\x00"
|
8
|
-
|
9
|
-
expect(empty_record).to_not be_last
|
10
|
-
expect(empty_record.length).to eq(0)
|
11
|
-
expect(empty_record.content.string).to eq("")
|
12
|
-
|
13
|
-
expect(last_record).to be_last
|
14
|
-
expect(last_record.length).to eq(2)
|
15
|
-
expect(last_record.content.string).to eq("\x00\x00")
|
16
|
-
end
|
17
|
-
|
18
|
-
it "raises EOFError the byte stream isn't large enough" do
|
19
|
-
expect{ read "\x00\x00\x00\x01" }.to raise_error(EOFError)
|
20
|
-
expect{ read "\x00\x00\x00\x08\x00\x00\x00\x01" }.to raise_error(EOFError)
|
21
|
-
end
|
22
|
-
|
23
|
-
def read(str)
|
24
|
-
io = StringIO.new(str)
|
25
|
-
subject.read(io)
|
26
|
-
end
|
27
|
-
end
|
data/spec/lib/xdr/string_spec.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
|
4
|
-
describe XDR::String, "#read" do
|
5
|
-
subject{ XDR::String.new(3) }
|
6
|
-
|
7
|
-
it "decodes values correctly" do
|
8
|
-
expect(read("\x00\x00\x00\x00")).to eq("")
|
9
|
-
expect(read("\x00\x00\x00\x01h\x00\x00\x00")).to eq("h")
|
10
|
-
expect(read("\x00\x00\x00\x02hi\x00\x00")).to eq("hi")
|
11
|
-
end
|
12
|
-
|
13
|
-
it "raises a ReadError when the encoded length is greater than the allowed max" do
|
14
|
-
expect{ read "\x00\x00\x00\x04hiya" }.to raise_error(XDR::ReadError)
|
15
|
-
end
|
16
|
-
|
17
|
-
def read(str)
|
18
|
-
io = StringIO.new(str)
|
19
|
-
subject.read(io)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
describe XDR::String, "#write" do
|
24
|
-
subject{ XDR::String[2] }
|
25
|
-
|
26
|
-
it "encodes values correctly" do
|
27
|
-
expect(write("")).to eq("\x00\x00\x00\x00")
|
28
|
-
expect(write("h")).to eq("\x00\x00\x00\x01h\x00\x00\x00")
|
29
|
-
expect(write("hi")).to eq("\x00\x00\x00\x02hi\x00\x00")
|
30
|
-
end
|
31
|
-
|
32
|
-
it "raises a WriteError when the provided string is too long" do
|
33
|
-
expect{ write "123" }.to raise_error(XDR::WriteError)
|
34
|
-
end
|
35
|
-
|
36
|
-
def write(val)
|
37
|
-
io = StringIO.new()
|
38
|
-
subject.write(val, io)
|
39
|
-
io.string
|
40
|
-
end
|
41
|
-
end
|
data/spec/lib/xdr/struct_spec.rb
DELETED
@@ -1,101 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module StructSpec
|
4
|
-
class SampleError < XDR::Struct
|
5
|
-
attribute :code, XDR::Int
|
6
|
-
attribute :msg, XDR::String[100]
|
7
|
-
end
|
8
|
-
|
9
|
-
|
10
|
-
# class SampleEnvelope < XDR::Struct
|
11
|
-
# attribute :body, XDR::VarOpaque[]
|
12
|
-
# attribute :sigs, XDR::VarArray[XDR::Opaque[32]]
|
13
|
-
# end
|
14
|
-
|
15
|
-
# class SampleOptions < XDR::Struct
|
16
|
-
# attribute :limit, XDR::Option[XDR::Int]
|
17
|
-
# attribute :subscribed, XDR::Option[XDR::Bool]
|
18
|
-
# end
|
19
|
-
end
|
20
|
-
|
21
|
-
|
22
|
-
describe XDR::Struct, "creation" do
|
23
|
-
let(:args){ {} }
|
24
|
-
subject{ StructSpec::SampleError.new(args) }
|
25
|
-
|
26
|
-
context "with no args" do
|
27
|
-
it "creates an instance" do
|
28
|
-
expect(subject).to be_a(StructSpec::SampleError)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
context "with valid args" do
|
33
|
-
let(:args){{code: 3, msg: "It broke!"}}
|
34
|
-
|
35
|
-
it "assigns values correctly" do
|
36
|
-
expect(subject.code).to eq(3)
|
37
|
-
expect(subject.msg).to eq("It broke!")
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
describe XDR::Struct, "attribute assignment" do
|
43
|
-
subject{ StructSpec::SampleError.new }
|
44
|
-
|
45
|
-
it "roundtrips correctly" do
|
46
|
-
expect(subject.code).to be_nil
|
47
|
-
expect(subject.msg).to be_nil
|
48
|
-
|
49
|
-
subject.code = 10
|
50
|
-
subject.msg = "busted"
|
51
|
-
|
52
|
-
expect(subject.code).to eq(10)
|
53
|
-
expect(subject.msg).to eq("busted")
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
|
58
|
-
describe XDR::Struct, "valid?"
|
59
|
-
describe XDR::Struct, "optional members"
|
60
|
-
|
61
|
-
describe XDR::Struct, "#to_xdr" do
|
62
|
-
subject{ StructSpec::SampleError.new({code: 3, msg: "It broke!"}) }
|
63
|
-
let(:result){ subject.to_xdr }
|
64
|
-
|
65
|
-
it "serialized each field in order" do
|
66
|
-
expect(result[0...4]).to eq("\x00\x00\x00\x03")
|
67
|
-
expect(result[4...8]).to eq([9].pack("l>"))
|
68
|
-
expect(result[8..-1]).to eq("It broke!\x00\x00\x00")
|
69
|
-
end
|
70
|
-
|
71
|
-
it "raises an exception if the struct is not valid" do
|
72
|
-
subject.code = nil
|
73
|
-
expect{ result }.to raise_error(XDR::WriteError)
|
74
|
-
end
|
75
|
-
|
76
|
-
it "produces hex" do
|
77
|
-
result = subject.to_xdr(:hex)
|
78
|
-
expect(result).to eq("000000030000000949742062726f6b6521000000")
|
79
|
-
end
|
80
|
-
|
81
|
-
it "produces base64" do
|
82
|
-
result = subject.to_xdr(:base64)
|
83
|
-
expect(result).to eq("AAAAAwAAAAlJdCBicm9rZSEAAAA=")
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
|
88
|
-
describe XDR::Struct, ".read" do
|
89
|
-
subject{ StructSpec::SampleError }
|
90
|
-
let(:result){ read "\x00\x00\x00\x01\x00\x00\x00\x0812345678" }
|
91
|
-
it "decodes values correctly" do
|
92
|
-
expect( result ).to be_a(subject)
|
93
|
-
expect( result.code ).to eq(1)
|
94
|
-
expect( result.msg ).to eq("12345678")
|
95
|
-
end
|
96
|
-
|
97
|
-
def read(str)
|
98
|
-
io = StringIO.new(str)
|
99
|
-
subject.read(io)
|
100
|
-
end
|
101
|
-
end
|