-
Notifications
You must be signed in to change notification settings - Fork 125
Expand file tree
/
Copy pathunpacker_spec.rb
More file actions
128 lines (103 loc) · 2.41 KB
/
Copy pathunpacker_spec.rb
File metadata and controls
128 lines (103 loc) · 2.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# encoding: ascii-8bit
require 'spec_helper'
describe Unpacker do
let :unpacker do
Unpacker.new
end
# TODO initialize
it 'read_array_header succeeds' do
unpacker.feed("\x91")
unpacker.read_array_header.should == 1
end
it 'read_array_header fails' do
unpacker.feed("\x81")
lambda {
unpacker.read_array_header
}.should raise_error(MessagePack::TypeError)
end
it 'read_map_header succeeds' do
unpacker.feed("\x81")
unpacker.read_map_header.should == 1
end
it 'read_map_header fails' do
unpacker.feed("\x91")
lambda {
unpacker.read_map_header
}.should raise_error(MessagePack::TypeError)
end
it 'skip_nil succeeds' do
unpacker.feed("\xc0")
unpacker.skip_nil.should == true
end
it 'skip_nil fails' do
unpacker.feed("\x90")
unpacker.skip_nil.should == false
end
it 'skip_nil raises EOFError' do
lambda {
unpacker.skip_nil
}.should raise_error(EOFError)
end
# TODO skip methods
# TODO feed
# TODO each
# TODO feed_each
it 'buffer' do
o1 = unpacker.buffer.object_id
unpacker.buffer << 'frsyuki'
unpacker.buffer.to_s.should == 'frsyuki'
unpacker.buffer.object_id.should == o1
end
it 'raises level stack too deep error' do
packer = Packer.new
512.times do
packer.write_array_header(1)
end
packer.write(nil)
unpacker = Unpacker.new(packer.buffer)
lambda {
unpacker.read
}.should raise_error(MessagePack::StackError)
end
it 'raises invalid byte error' do
unpacker.feed("\xc6")
lambda {
unpacker.read
}.should raise_error(MessagePack::MalformedFormatError)
end
it "gc mark" do
obj = [1024, {["a","b"]=>["c","d"]}, ["e","f"], "d", 70000, 4.12, 1.5, 1.5, 1.5]
raw = obj.to_msgpack.to_s * 4
n = 0
raw.split(//).each do |b|
GC.start
unpacker.feed_each(b) {|o|
GC.start
o.should == obj
n += 1
}
GC.start
end
n.should == 4
end
it "buffer" do
orig = "a"*32*1024*4
raw = orig.to_msgpack.to_s
n = 655
times = raw.size / n
times += 1 unless raw.size % n == 0
off = 0
parsed = false
times.times do
parsed.should == false
seg = raw[off, n]
off += seg.length
unpacker.feed_each(seg) {|obj|
parsed.should == false
obj.should == orig
parsed = true
}
end
parsed.should == true
end
end