rstyx 0.2.0 → 0.3.0
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.
- data/COPYING +482 -0
- data/ChangeLog +4 -0
- data/Manifest.txt +17 -0
- data/NEWS +2 -0
- data/README +41 -0
- data/Rakefile +55 -0
- data/examples/readstyxfile.rb +48 -0
- data/lib/rstyx/authmodules.rb +90 -0
- data/lib/rstyx/client.rb +709 -693
- data/lib/rstyx/common.rb +71 -0
- data/lib/rstyx/errors.rb +35 -2
- data/lib/rstyx/messages.rb +377 -1113
- data/lib/rstyx/server.rb +1305 -0
- data/lib/rstyx/version.rb +2 -2
- data/lib/rstyx.rb +11 -4
- data/tests/tc_client.rb +260 -45
- data/tests/tc_message.rb +245 -388
- data/tests/tc_styxservproto.rb +596 -0
- metadata +51 -26
data/tests/tc_message.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
#
|
3
|
-
# Copyright (C) 2005 Rafael Sevilla
|
3
|
+
# Copyright (C) 2005,2006 Rafael Sevilla
|
4
4
|
# This file is part of RStyx
|
5
5
|
#
|
6
6
|
# RStyx is free software; you can redistribute it and/or modify
|
@@ -15,50 +15,18 @@
|
|
15
15
|
#
|
16
16
|
# You should have received a copy of the GNU Lesser General Public
|
17
17
|
# License along with RStyx; if not, write to the Free Software
|
18
|
-
# Foundation, Inc.,
|
19
|
-
#
|
18
|
+
# Foundation, Inc., 51 Franklin St., Fifth Floor, Boston, MA
|
19
|
+
# 02110-1301 USA.
|
20
20
|
#
|
21
21
|
# Unit tests for Styx messages
|
22
22
|
#
|
23
|
-
# $Id: tc_message.rb
|
23
|
+
# $Id: tc_message.rb 177 2007-05-31 08:23:25Z dido $
|
24
24
|
#
|
25
25
|
require 'test/unit'
|
26
|
+
require 'rstyx/common'
|
26
27
|
require 'rstyx/messages'
|
27
28
|
|
28
29
|
class MessageTest < Test::Unit::TestCase
|
29
|
-
##
|
30
|
-
# Test the utility functions provided
|
31
|
-
#
|
32
|
-
def test_utils
|
33
|
-
# Basic test
|
34
|
-
pstr = RStyx::Message::Util.strpack("foo")
|
35
|
-
assert(pstr == "\003\000foo")
|
36
|
-
# Add trailing garbage to the string
|
37
|
-
pstr += "some trailing garbage"
|
38
|
-
upstr = RStyx::Message::Util.strextract(pstr, 0)
|
39
|
-
assert(upstr[0] == "foo")
|
40
|
-
# Try packing several strings together
|
41
|
-
packstr = RStyx::Message::Util.strpack("foo") +
|
42
|
-
RStyx::Message::Util.strpack("bar") +
|
43
|
-
RStyx::Message::Util.strpack("baz")
|
44
|
-
str, offset = RStyx::Message::Util.strextract(packstr, 0)
|
45
|
-
assert(str == "foo")
|
46
|
-
str, offset = RStyx::Message::Util.strextract(packstr, offset)
|
47
|
-
assert(str == "bar")
|
48
|
-
str, offset = RStyx::Message::Util.strextract(packstr, offset)
|
49
|
-
assert(str == "baz")
|
50
|
-
# Try a long string
|
51
|
-
longstr = "alpha bravo charlie delta echo foxtrot golf hotel india juliet kilo lima mama nancy oscar papa quebec romeo sierra tango uniform victor whiskey x-ray yankee zulu"
|
52
|
-
pstr = RStyx::Message::Util.strpack(longstr)
|
53
|
-
assert(RStyx::Message::Util.strextract(pstr, 0)[0] == longstr)
|
54
|
-
|
55
|
-
# Test decoding of invalid strings
|
56
|
-
invstr ="\003\000fo"
|
57
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::Util.strextract(invstr, 0) }
|
58
|
-
invstr = "\003"
|
59
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::Util.strextract(invstr, 0) }
|
60
|
-
end
|
61
|
-
|
62
30
|
##
|
63
31
|
# Test the Qid class
|
64
32
|
#
|
@@ -70,31 +38,40 @@ class MessageTest < Test::Unit::TestCase
|
|
70
38
|
assert(bytes == "\x01\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed\xfe")
|
71
39
|
|
72
40
|
# Try to deserialize and check whether the output is as expected
|
73
|
-
qqid = RStyx::Message::Qid.
|
41
|
+
qqid = RStyx::Message::Qid.from_bytes(bytes)
|
74
42
|
assert(qqid.qtype == 0x01)
|
75
43
|
assert(qqid.version == 0xdeadbeef)
|
76
44
|
assert(qqid.path == 0xfeedfacec0ffeeee)
|
77
45
|
|
78
46
|
# Test decoding short values
|
79
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::Qid.
|
80
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::Qid.
|
47
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::Qid.from_bytes("") }
|
48
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::Qid.from_bytes(" ") }
|
81
49
|
|
82
50
|
# Test decoding 13 bytes and with trailing garbage
|
83
|
-
assert_nothing_raised { RStyx::Message::Qid.
|
84
|
-
assert_nothing_raised { qqid = RStyx::Message::Qid.
|
51
|
+
assert_nothing_raised { RStyx::Message::Qid.from_bytes(" ") }
|
52
|
+
assert_nothing_raised { qqid = RStyx::Message::Qid.from_bytes("\x01\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed\xfesome trailing garbage") }
|
85
53
|
|
86
54
|
# test if the decoding still works even in the face of trailing garbage
|
87
|
-
|
88
|
-
assert(qqid.version
|
89
|
-
assert(qqid.path
|
55
|
+
assert_equal(0x01, qqid.qtype)
|
56
|
+
assert(0xdeadbeef, qqid.version)
|
57
|
+
assert(0xfeedfacec0ffeeee, qqid.path)
|
58
|
+
|
59
|
+
# test equality
|
60
|
+
qid = RStyx::Message::Qid.new(0x01,0xdeadbeef,0xfeedfacec0ffeeee)
|
61
|
+
qid2 = RStyx::Message::Qid.new(0x01,0xdeadbeef,0xfeedfacec0ffeeef)
|
62
|
+
assert_not_equal(qid, qid2)
|
63
|
+
|
64
|
+
qid2 = RStyx::Message::Qid.new(0x01,0xdeadbeef,0xfeedfacec0ffeeee)
|
65
|
+
assert_equal(qid, qid2)
|
66
|
+
|
90
67
|
end
|
91
68
|
|
92
69
|
##
|
93
|
-
# Test the
|
70
|
+
# Test the Stat class
|
94
71
|
#
|
95
|
-
def
|
96
|
-
# generate a dummy
|
97
|
-
de = RStyx::Message::
|
72
|
+
def test_stat
|
73
|
+
# generate a dummy Stat for testing
|
74
|
+
de = RStyx::Message::Stat.new
|
98
75
|
de.dtype = 0x1234
|
99
76
|
de.dev = 0x567890ab
|
100
77
|
de.qid = RStyx::Message::Qid.new(0x01, 0xdeadbeef,0xfeedfacec0ffeeee)
|
@@ -111,7 +88,7 @@ class MessageTest < Test::Unit::TestCase
|
|
111
88
|
assert(bytes == expect)
|
112
89
|
|
113
90
|
# Generate a new direntry based on the above string
|
114
|
-
de2 = RStyx::Message::
|
91
|
+
de2 = RStyx::Message::Stat.from_bytes(expect)
|
115
92
|
assert(de2.dtype == 0x1234)
|
116
93
|
assert(de2.dev == 0x567890ab)
|
117
94
|
assert(de2.qid.qtype == 0x01)
|
@@ -127,14 +104,14 @@ class MessageTest < Test::Unit::TestCase
|
|
127
104
|
assert(de2.muid == "quux")
|
128
105
|
|
129
106
|
# Test decoding truncated strings
|
130
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::
|
131
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::
|
132
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::
|
107
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::Stat.from_bytes("") }
|
108
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::Stat.from_bytes("\x3c\x00\x34\x12\xab\x90\x78\x56\x01\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed\xfe\xf0\xde\xbc\x9a\xef\xbe\xad\xde\xbe\xba\xfe\xca\x10\x32\x54\x76") }
|
109
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::Stat.from_bytes("\x3c\x00\x34\x12\xab\x90\x78\x56\x01\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed\xfe\xf0\xde\xbc\x9a\xef\xbe\xad\xde\xbe\xba\xfe\xca\x10\x32\x54\x76\x98\xba\xdc\xfe\x03\x00foo\x03\x00bar\x03\x00baz\x04\x00qu") }
|
133
110
|
|
134
111
|
# Test decoding strings with garbage at the end
|
135
112
|
# Generate a new direntry based on the above string
|
136
113
|
assert_nothing_raised do
|
137
|
-
de2 = RStyx::Message::
|
114
|
+
de2 = RStyx::Message::Stat.from_bytes(expect + "trailing garbage")
|
138
115
|
end
|
139
116
|
assert(de2.dtype == 0x1234)
|
140
117
|
assert(de2.dev == 0x567890ab)
|
@@ -156,28 +133,24 @@ class MessageTest < Test::Unit::TestCase
|
|
156
133
|
# Test the Tversion class
|
157
134
|
#
|
158
135
|
def test_tversion
|
159
|
-
tv = RStyx::Message::Tversion.new(0xdeadbeef, "9P2000")
|
160
|
-
bytes = tv.to_bytes
|
136
|
+
tv = RStyx::Message::Tversion.new(:msize => 0xdeadbeef, :version => "9P2000", :tag => 0x1234)
|
137
|
+
bytes = tv.to_bytes
|
161
138
|
expect = "\x13\x00\x00\x00\x64\x34\x12\xef\xbe\xad\xde\x06\x009P2000"
|
162
139
|
assert(expect == bytes)
|
163
140
|
# Try to decode the expect string
|
164
|
-
tvm = RStyx::Message::StyxMessage.
|
141
|
+
tvm = RStyx::Message::StyxMessage.from_bytes(expect)
|
165
142
|
assert(tvm.class == RStyx::Message::Tversion)
|
166
|
-
assert(tvm.length == 0x13)
|
167
|
-
assert(tvm.mtype == RStyx::Message::StyxMessage::TVERSION)
|
168
143
|
assert(tvm.tag == 0x1234)
|
169
144
|
assert(tvm.msize == 0xdeadbeef)
|
170
145
|
assert(tvm.version == "9P2000")
|
171
146
|
|
172
147
|
# Try to decode short strings
|
173
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
174
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
148
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes("\x13\x00\x00\x00\x64\x34\x12\xef\xbe\xad\xde\x06\x009P200") }
|
149
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes("\x13\x00\x00\x00\x64\x34\x12\xef\xbe\xad") }
|
175
150
|
|
176
151
|
# Try to decode the expect string with trailing garbage
|
177
|
-
tvm = RStyx::Message::StyxMessage.
|
152
|
+
tvm = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
178
153
|
assert(tvm.class == RStyx::Message::Tversion)
|
179
|
-
assert(tvm.length == 0x13)
|
180
|
-
assert(tvm.mtype == RStyx::Message::StyxMessage::TVERSION)
|
181
154
|
assert(tvm.tag == 0x1234)
|
182
155
|
assert(tvm.msize == 0xdeadbeef)
|
183
156
|
assert(tvm.version == "9P2000")
|
@@ -188,30 +161,26 @@ class MessageTest < Test::Unit::TestCase
|
|
188
161
|
# Test the Rversion class
|
189
162
|
#
|
190
163
|
def test_rversion
|
191
|
-
rv = RStyx::Message::Rversion.new(0xdeadbeef, "9P2000")
|
192
|
-
bytes = rv.to_bytes
|
164
|
+
rv = RStyx::Message::Rversion.new(:msize => 0xdeadbeef, :version => "9P2000", :tag => 0x1234)
|
165
|
+
bytes = rv.to_bytes
|
193
166
|
expect = "\x13\x00\x00\x00\x65\x34\x12\xef\xbe\xad\xde\x06\x009P2000"
|
194
167
|
assert(expect == bytes)
|
195
168
|
# Try to decode the expect string
|
196
|
-
rvm = RStyx::Message::StyxMessage.
|
169
|
+
rvm = RStyx::Message::StyxMessage.from_bytes(expect)
|
197
170
|
assert(rvm.class == RStyx::Message::Rversion)
|
198
|
-
assert(rvm.length == 0x13)
|
199
|
-
assert(rvm.mtype == RStyx::Message::StyxMessage::RVERSION)
|
200
171
|
assert(rvm.tag == 0x1234)
|
201
172
|
assert(rvm.msize == 0xdeadbeef)
|
202
173
|
assert(rvm.version == "9P2000")
|
203
174
|
|
204
175
|
# Try to decode short strings
|
205
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
206
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
176
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes("\x13\x00\x00\x00\x65\x34\x12\xef\xbe\xad\xde\x06\x009P200") }
|
177
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes("\x13\x00\x00\x00\x65\x34\x12\xef\xbe") }
|
207
178
|
|
208
179
|
# Try to decode with trailing garbage
|
209
180
|
assert_nothing_raised do
|
210
|
-
rvm = RStyx::Message::StyxMessage.
|
181
|
+
rvm = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
211
182
|
end
|
212
183
|
assert(rvm.class == RStyx::Message::Rversion)
|
213
|
-
assert(rvm.length == 0x13)
|
214
|
-
assert(rvm.mtype == RStyx::Message::StyxMessage::RVERSION)
|
215
184
|
assert(rvm.tag == 0x1234)
|
216
185
|
assert(rvm.msize == 0xdeadbeef)
|
217
186
|
assert(rvm.version == "9P2000")
|
@@ -221,33 +190,30 @@ class MessageTest < Test::Unit::TestCase
|
|
221
190
|
# Test the Tauth class.
|
222
191
|
#
|
223
192
|
def test_tauth
|
224
|
-
ta = RStyx::Message::Tauth.new("foo", 0x9abcdef0, "bar")
|
225
|
-
bytes = ta.to_bytes
|
193
|
+
ta = RStyx::Message::Tauth.new(:uname => "foo", :afid => 0x9abcdef0, :aname => "bar", :tag => 0x1234)
|
194
|
+
bytes = ta.to_bytes
|
226
195
|
expect = "\x66\x34\x12\xf0\xde\xbc\x9a\x03\x00foo\x03\x00bar"
|
227
196
|
len = expect.length + 4
|
228
197
|
expect = [len].pack("V") + expect
|
229
198
|
assert(bytes == expect)
|
230
|
-
ta2 = RStyx::Message::StyxMessage.
|
199
|
+
ta2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
231
200
|
assert(ta2.class == RStyx::Message::Tauth)
|
232
|
-
assert(ta2.length == len)
|
233
|
-
assert(ta2.mtype == RStyx::Message::StyxMessage::TAUTH)
|
234
201
|
assert(ta2.tag == 0x1234)
|
235
202
|
assert(ta2.afid == 0x9abcdef0)
|
236
203
|
assert(ta2.uname == "foo")
|
237
204
|
assert(ta2.aname == "bar")
|
238
205
|
|
239
206
|
# Try to decode short strings
|
240
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::
|
241
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
242
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
207
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::Tauth.from_bytes("1234567890") }
|
208
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes("\x66\x34\x12\xf0\xde\xbc\x9a\x03\x00foo\x03\x00b") }
|
209
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes("\x66\x34\x12\xf0\xde\xbc") }
|
210
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes("\x66\x34") }
|
243
211
|
|
244
212
|
# decode with trailing garbage
|
245
213
|
assert_nothing_raised do
|
246
|
-
ta2 = RStyx::Message::StyxMessage.
|
214
|
+
ta2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
247
215
|
end
|
248
216
|
assert(ta2.class == RStyx::Message::Tauth)
|
249
|
-
assert(ta2.length == len)
|
250
|
-
assert(ta2.mtype == RStyx::Message::StyxMessage::TAUTH)
|
251
217
|
assert(ta2.tag == 0x1234)
|
252
218
|
assert(ta2.afid == 0x9abcdef0)
|
253
219
|
assert(ta2.uname == "foo")
|
@@ -258,30 +224,26 @@ class MessageTest < Test::Unit::TestCase
|
|
258
224
|
# Test the Rauth class.
|
259
225
|
#
|
260
226
|
def test_rauth
|
261
|
-
ra = RStyx::Message::Rauth.new(RStyx::Message::Qid.new(0x01, 0xdeadbeef, 0xfeedfacec0ffeeee))
|
262
|
-
bytes = ra.to_bytes
|
227
|
+
ra = RStyx::Message::Rauth.new(:aqid => RStyx::Message::Qid.new(0x01, 0xdeadbeef, 0xfeedfacec0ffeeee), :tag => 0x1234)
|
228
|
+
bytes = ra.to_bytes
|
263
229
|
expect = "\x67\x34\x12\x01\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed\xfe"
|
264
230
|
len = expect.length + 4
|
265
231
|
expect = [len].pack("V") + expect
|
266
232
|
assert(expect == bytes)
|
267
|
-
ra2 = RStyx::Message::StyxMessage.
|
233
|
+
ra2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
268
234
|
assert(ra2.class == RStyx::Message::Rauth)
|
269
|
-
assert(ra2.length == len)
|
270
|
-
assert(ra2.mtype == RStyx::Message::StyxMessage::RAUTH)
|
271
235
|
assert(ra2.tag == 0x1234)
|
272
236
|
assert(ra2.aqid.qtype == 0x01)
|
273
237
|
assert(ra2.aqid.version == 0xdeadbeef)
|
274
238
|
assert(ra2.aqid.path == 0xfeedfacec0ffeeee)
|
275
239
|
# Try to decode short strings
|
276
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
240
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes("\x67\x34\x12\x01\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed") }
|
277
241
|
|
278
242
|
# Decode with trailing garbage
|
279
243
|
assert_nothing_raised do
|
280
|
-
ra2 = RStyx::Message::StyxMessage.
|
244
|
+
ra2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
281
245
|
end
|
282
246
|
assert(ra2.class == RStyx::Message::Rauth)
|
283
|
-
assert(ra2.length == len)
|
284
|
-
assert(ra2.mtype == RStyx::Message::StyxMessage::RAUTH)
|
285
247
|
assert(ra2.tag == 0x1234)
|
286
248
|
assert(ra2.aqid.qtype == 0x01)
|
287
249
|
assert(ra2.aqid.version == 0xdeadbeef)
|
@@ -292,45 +254,39 @@ class MessageTest < Test::Unit::TestCase
|
|
292
254
|
# Test the Rerror class
|
293
255
|
#
|
294
256
|
def test_rerror
|
295
|
-
rerr = RStyx::Message::Rerror.new("error")
|
296
|
-
bytes = rerr.to_bytes
|
257
|
+
rerr = RStyx::Message::Rerror.new(:ename => "error", :tag => 0x1234)
|
258
|
+
bytes = rerr.to_bytes
|
297
259
|
expect = "\x0e\x00\x00\x00\x6b\x34\x12\x05\x00error"
|
298
260
|
assert(bytes == expect)
|
299
261
|
|
300
262
|
# Try to decode the expect string
|
301
|
-
emsg = RStyx::Message::StyxMessage.
|
263
|
+
emsg = RStyx::Message::StyxMessage.from_bytes(expect)
|
302
264
|
assert(emsg.class == RStyx::Message::Rerror)
|
303
|
-
assert(emsg.length == 0x0e)
|
304
|
-
assert(emsg.mtype == RStyx::Message::StyxMessage::RERROR)
|
305
265
|
assert(emsg.tag == 0x1234)
|
306
266
|
assert(emsg.ename == "error")
|
307
|
-
assert(emsg.messagebody == "\x05\x00error")
|
308
267
|
|
309
268
|
# Try to decode short strings
|
310
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
311
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
312
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
313
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
314
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
269
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes("") }
|
270
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes("\x0e\x00\x00") }
|
271
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes("\x0e\x00\x00\x00\x6b\x34\x12\x05\x00erro") }
|
272
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes("\x0e\x00\x00\x00\x6b\x34\x12\x05\x00erro") }
|
273
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes("\x0e\x00\x00\x00\x6b\x34\x12") }
|
315
274
|
|
316
275
|
# Try to decode strings with trailing garbage
|
317
276
|
assert_nothing_raised do
|
318
|
-
emsg = RStyx::Message::StyxMessage.
|
277
|
+
emsg = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
319
278
|
end
|
320
279
|
assert(emsg.class == RStyx::Message::Rerror)
|
321
|
-
assert(emsg.length == 0x0e)
|
322
|
-
assert(emsg.mtype == RStyx::Message::StyxMessage::RERROR)
|
323
280
|
assert(emsg.tag == 0x1234)
|
324
281
|
assert(emsg.ename == "error")
|
325
|
-
assert(emsg.messagebody == "\x05\x00error")
|
326
282
|
end
|
327
283
|
|
328
284
|
##
|
329
285
|
# Test the Tflush class.
|
330
286
|
#
|
331
287
|
def test_tflush
|
332
|
-
tf = RStyx::Message::Tflush.new(0x5678)
|
333
|
-
bytes = tf.to_bytes
|
288
|
+
tf = RStyx::Message::Tflush.new(:oldtag => 0x5678, :tag => 0x1234)
|
289
|
+
bytes = tf.to_bytes
|
334
290
|
expect = "\x6c\x34\x12\x78\x56"
|
335
291
|
len = expect.length + 4
|
336
292
|
packlen = [len].pack("V")
|
@@ -338,25 +294,21 @@ class MessageTest < Test::Unit::TestCase
|
|
338
294
|
assert(expect == bytes)
|
339
295
|
|
340
296
|
# decode expect
|
341
|
-
tf2 = RStyx::Message::StyxMessage.
|
297
|
+
tf2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
342
298
|
assert(tf2.class == RStyx::Message::Tflush)
|
343
|
-
assert(tf2.length == len)
|
344
|
-
assert(tf2.mtype == RStyx::Message::StyxMessage::TFLUSH)
|
345
299
|
assert(tf2.tag == 0x1234)
|
346
300
|
assert(tf2.oldtag == 0x5678)
|
347
301
|
|
348
302
|
# try decoding short strings
|
349
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
350
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
303
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x6c\x34\x12\x78") }
|
304
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x6c\x34\x12") }
|
351
305
|
|
352
306
|
# decode with trailing garbage
|
353
307
|
tf2 = nil
|
354
308
|
assert_nothing_raised do
|
355
|
-
tf2 = RStyx::Message::StyxMessage.
|
309
|
+
tf2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
356
310
|
end
|
357
311
|
assert(tf2.class == RStyx::Message::Tflush)
|
358
|
-
assert(tf2.length == len)
|
359
|
-
assert(tf2.mtype == RStyx::Message::StyxMessage::TFLUSH)
|
360
312
|
assert(tf2.tag == 0x1234)
|
361
313
|
assert(tf2.oldtag == 0x5678)
|
362
314
|
end
|
@@ -365,8 +317,8 @@ class MessageTest < Test::Unit::TestCase
|
|
365
317
|
# Test the Rflush class.
|
366
318
|
#
|
367
319
|
def test_rflush
|
368
|
-
tf = RStyx::Message::Rflush.new
|
369
|
-
bytes = tf.to_bytes
|
320
|
+
tf = RStyx::Message::Rflush.new(:tag => 0x1234)
|
321
|
+
bytes = tf.to_bytes
|
370
322
|
expect = "\x6d\x34\x12"
|
371
323
|
len = expect.length + 4
|
372
324
|
packlen = [len].pack("V")
|
@@ -374,23 +326,19 @@ class MessageTest < Test::Unit::TestCase
|
|
374
326
|
assert(expect == bytes)
|
375
327
|
|
376
328
|
# decode expect
|
377
|
-
rf2 = RStyx::Message::StyxMessage.
|
329
|
+
rf2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
378
330
|
assert(rf2.class == RStyx::Message::Rflush)
|
379
|
-
assert(rf2.length == len)
|
380
|
-
assert(rf2.mtype == RStyx::Message::StyxMessage::RFLUSH)
|
381
331
|
assert(rf2.tag == 0x1234)
|
382
332
|
|
383
333
|
# try decoding short strings
|
384
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
334
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x6d\x34") }
|
385
335
|
|
386
336
|
# decode with trailing garbage
|
387
337
|
rf2 = nil
|
388
338
|
assert_nothing_raised do
|
389
|
-
rf2 = RStyx::Message::StyxMessage.
|
339
|
+
rf2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
390
340
|
end
|
391
341
|
assert(rf2.class == RStyx::Message::Rflush)
|
392
|
-
assert(rf2.length == len)
|
393
|
-
assert(rf2.mtype == RStyx::Message::StyxMessage::RFLUSH)
|
394
342
|
assert(rf2.tag == 0x1234)
|
395
343
|
|
396
344
|
end
|
@@ -399,8 +347,8 @@ class MessageTest < Test::Unit::TestCase
|
|
399
347
|
# Test the Tattach class.
|
400
348
|
#
|
401
349
|
def test_tattach
|
402
|
-
ta = RStyx::Message::Tattach.new(0x12345678, "foo", 0x9abcdef0, "bar")
|
403
|
-
bytes = ta.to_bytes
|
350
|
+
ta = RStyx::Message::Tattach.new(:fid=> 0x12345678, :uname => "foo", :afid => 0x9abcdef0, :aname => "bar", :tag => 0x1234)
|
351
|
+
bytes = ta.to_bytes
|
404
352
|
expect = "\x68\x34\x12\x78\x56\x34\x12\xf0\xde\xbc\x9a\x03\x00foo\x03\x00bar"
|
405
353
|
len = expect.length + 4
|
406
354
|
packlen = [len].pack("V")
|
@@ -408,10 +356,8 @@ class MessageTest < Test::Unit::TestCase
|
|
408
356
|
assert(expect == bytes)
|
409
357
|
|
410
358
|
# Decode expect string
|
411
|
-
ta2 = RStyx::Message::StyxMessage.
|
359
|
+
ta2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
412
360
|
assert(ta2.class == RStyx::Message::Tattach)
|
413
|
-
assert(ta2.length == len)
|
414
|
-
assert(ta2.mtype == RStyx::Message::StyxMessage::TATTACH)
|
415
361
|
assert(ta2.tag == 0x1234)
|
416
362
|
assert(ta2.fid == 0x12345678)
|
417
363
|
assert(ta2.afid == 0x9abcdef0)
|
@@ -419,18 +365,16 @@ class MessageTest < Test::Unit::TestCase
|
|
419
365
|
assert(ta2.aname == "bar")
|
420
366
|
|
421
367
|
# Try to decode short strings
|
422
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
423
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
424
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
425
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
368
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x68\x34\x12\x78\x56\x34\x12\xf0\xde\xbc\x9a\x03\x00foo\x03\x00ba") }
|
369
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x68\x34\x12\x78\x56\x34\x12\xf0\xde\xbc\x9a\x03\x00fo") }
|
370
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x68\x34\x12\x78\x56\x34\x12\xf0\xde\xbc") }
|
371
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x68\x34\x12\x78\x56\x34\x12\xf0") }
|
426
372
|
|
427
373
|
# Decode expect string with trailing garbage
|
428
374
|
assert_nothing_raised do
|
429
|
-
ta2 = RStyx::Message::StyxMessage.
|
375
|
+
ta2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
430
376
|
end
|
431
377
|
assert(ta2.class == RStyx::Message::Tattach)
|
432
|
-
assert(ta2.length == len)
|
433
|
-
assert(ta2.mtype == RStyx::Message::StyxMessage::TATTACH)
|
434
378
|
assert(ta2.tag == 0x1234)
|
435
379
|
assert(ta2.fid == 0x12345678)
|
436
380
|
assert(ta2.afid == 0x9abcdef0)
|
@@ -442,32 +386,29 @@ class MessageTest < Test::Unit::TestCase
|
|
442
386
|
# Test the Rattach class.
|
443
387
|
#
|
444
388
|
def test_rattach
|
445
|
-
ra = RStyx::Message::Rattach.new(RStyx::Message::Qid.new(0x01, 0xdeadbeef, 0xfeedfacec0ffeeee))
|
446
|
-
bytes = ra.to_bytes
|
389
|
+
ra = RStyx::Message::Rattach.new(:qid => RStyx::Message::Qid.new(0x01, 0xdeadbeef, 0xfeedfacec0ffeeee), :tag => 0x1234)
|
390
|
+
bytes = ra.to_bytes
|
447
391
|
expect = "\x69\x34\x12\x01\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed\xfe"
|
448
392
|
len = expect.length + 4
|
449
393
|
packlen = [len].pack("V")
|
450
394
|
expect = packlen + expect
|
451
395
|
assert(expect == bytes)
|
452
|
-
|
396
|
+
|
397
|
+
ra2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
453
398
|
assert(ra2.class == RStyx::Message::Rattach)
|
454
|
-
assert(ra2.length == len)
|
455
|
-
assert(ra2.mtype == RStyx::Message::StyxMessage::RATTACH)
|
456
399
|
assert(ra2.tag == 0x1234)
|
457
400
|
assert(ra2.qid.qtype == 0x01)
|
458
401
|
assert(ra2.qid.version == 0xdeadbeef)
|
459
402
|
assert(ra2.qid.path == 0xfeedfacec0ffeeee)
|
460
403
|
|
461
404
|
# Try to decode short strings
|
462
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
405
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x69\x34\x12\x01\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed") }
|
463
406
|
|
464
407
|
# Decode with trailing garbage
|
465
408
|
assert_nothing_raised do
|
466
|
-
ra2 = RStyx::Message::StyxMessage.
|
409
|
+
ra2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
467
410
|
end
|
468
411
|
assert(ra2.class == RStyx::Message::Rattach)
|
469
|
-
assert(ra2.length == len)
|
470
|
-
assert(ra2.mtype == RStyx::Message::StyxMessage::RATTACH)
|
471
412
|
assert(ra2.tag == 0x1234)
|
472
413
|
assert(ra2.qid.qtype == 0x01)
|
473
414
|
assert(ra2.qid.version == 0xdeadbeef)
|
@@ -478,48 +419,34 @@ class MessageTest < Test::Unit::TestCase
|
|
478
419
|
# Test the Twalk class.
|
479
420
|
#
|
480
421
|
def test_twalk
|
481
|
-
tw = RStyx::Message::Twalk.new(0x12345678, 0x9abcdef0,
|
482
|
-
"foo
|
483
|
-
|
484
|
-
|
422
|
+
tw = RStyx::Message::Twalk.new(:fid => 0x12345678, :newfid => 0x9abcdef0,
|
423
|
+
:wnames => ["foo", "bar", "baz",
|
424
|
+
"quux", "blargle"],
|
425
|
+
:tag => 0x1234)
|
426
|
+
bytes = tw.to_bytes
|
427
|
+
expect = "\x6e\x34\x12\x78\x56\x34\x12\xf0\xde\xbc\x9a\x05\x00\x03\x00foo\x03\x00bar\x03\x00baz\x04\x00quux\x07\x00blargle"
|
485
428
|
len = expect.length + 4
|
486
429
|
packlen = [len].pack("V")
|
487
430
|
expect = packlen + expect
|
488
431
|
assert(expect == bytes)
|
489
|
-
tw2 = RStyx::Message::StyxMessage.
|
432
|
+
tw2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
490
433
|
assert(tw2.class == RStyx::Message::Twalk)
|
491
|
-
assert(tw2.length == len)
|
492
|
-
assert(tw2.mtype == RStyx::Message::StyxMessage::TWALK)
|
493
434
|
assert(tw2.tag == 0x1234)
|
494
435
|
assert(tw2.fid == 0x12345678)
|
495
436
|
assert(tw2.newfid == 0x9abcdef0)
|
496
437
|
assert(tw2.path = "foo/bar/baz/quux/blargle")
|
497
438
|
|
498
|
-
# Test a long path
|
499
|
-
assert_raise(RStyx::StyxException) do
|
500
|
-
RStyx::Message::Twalk.new(0x12345678, 0x9abcdef0,
|
501
|
-
"1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17")
|
502
|
-
end
|
503
|
-
|
504
|
-
# Test a path not quite so long
|
505
|
-
assert_nothing_raised(RStyx::StyxException) do
|
506
|
-
RStyx::Message::Twalk.new(0x12345678, 0x9abcdef0,
|
507
|
-
"1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16")
|
508
|
-
end
|
509
|
-
|
510
439
|
# Test short strings
|
511
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
512
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
513
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
514
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
440
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x6e\x34\x12\x78\x56\x34\x12\xf0\xde\xbc\x9a\x05\x00\03\x00foo\x03\x00bar\x03\x00baz\x04\x00quux") }
|
441
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x6e\x34\x12\x78\x56\x34\x12\xf0\xde\xbc\x9a") }
|
442
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x6e\x34\x12\x78\x56\x34\x12\xf0\xde") }
|
443
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x6e\x34\x12\x78\x56\x34\x12\xf0") }
|
515
444
|
|
516
445
|
# trailing garbage test
|
517
446
|
assert_nothing_raised do
|
518
|
-
tw2 = RStyx::Message::StyxMessage.
|
447
|
+
tw2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
519
448
|
end
|
520
449
|
assert(tw2.class == RStyx::Message::Twalk)
|
521
|
-
assert(tw2.length == len)
|
522
|
-
assert(tw2.mtype == RStyx::Message::StyxMessage::TWALK)
|
523
450
|
assert(tw2.tag == 0x1234)
|
524
451
|
assert(tw2.fid == 0x12345678)
|
525
452
|
assert(tw2.newfid == 0x9abcdef0)
|
@@ -535,17 +462,16 @@ class MessageTest < Test::Unit::TestCase
|
|
535
462
|
RStyx::Message::Qid.new(0x02,0x12345678,0xfedcba9876543210),
|
536
463
|
RStyx::Message::Qid.new(0x03,0x87654321,0x0123456789abcdef)
|
537
464
|
]
|
538
|
-
rw = RStyx::Message::Rwalk.new(qidlist)
|
539
|
-
bytes = rw.to_bytes
|
465
|
+
rw = RStyx::Message::Rwalk.new(:qids => qidlist, :tag => 0x1234)
|
466
|
+
bytes = rw.to_bytes
|
540
467
|
expect = "\x6f\x34\x12\x03\x00\x01\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed\xfe\x02\x78\x56\x34\x12\x10\x32\x54\x76\x98\xba\xdc\xfe\x03\x21\x43\x65\x87\xef\xcd\xab\x89\x67\x45\x23\x01"
|
541
468
|
len = expect.length + 4
|
542
469
|
packlen = [len].pack("V")
|
543
470
|
expect = packlen + expect
|
544
471
|
assert(expect == bytes)
|
545
|
-
|
472
|
+
|
473
|
+
rw2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
546
474
|
assert(rw2.class == RStyx::Message::Rwalk)
|
547
|
-
assert(rw2.length == len)
|
548
|
-
assert(rw2.mtype == RStyx::Message::StyxMessage::RWALK)
|
549
475
|
assert(rw2.tag == 0x1234)
|
550
476
|
assert(rw2.qids.length == 3)
|
551
477
|
qid = rw2.qids[0]
|
@@ -562,17 +488,15 @@ class MessageTest < Test::Unit::TestCase
|
|
562
488
|
assert(qid.path == 0x0123456789abcdef)
|
563
489
|
|
564
490
|
# Try decoding short strings
|
565
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
566
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
567
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
491
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x6f\x34\x12\x03\x00\x01\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed\xfe\x02\x78\x56\x34\x12\x10\x32\x54\x76\x98\xba\xdc\xfe\x03\x21\x43\x65\x87") }
|
492
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x6f\x34\x12\x03\x00") }
|
493
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x6f\x34\x12\x03") }
|
568
494
|
|
569
495
|
# Trailing garbage
|
570
496
|
assert_nothing_raised do
|
571
|
-
rw2 = RStyx::Message::StyxMessage.
|
497
|
+
rw2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
572
498
|
end
|
573
499
|
assert(rw2.class == RStyx::Message::Rwalk)
|
574
|
-
assert(rw2.length == len)
|
575
|
-
assert(rw2.mtype == RStyx::Message::StyxMessage::RWALK)
|
576
500
|
assert(rw2.tag == 0x1234)
|
577
501
|
assert(rw2.qids.length == 3)
|
578
502
|
qid = rw2.qids[0]
|
@@ -593,63 +517,31 @@ class MessageTest < Test::Unit::TestCase
|
|
593
517
|
# Test the Topen class.
|
594
518
|
#
|
595
519
|
def test_topen
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
RStyx::Message::Topen::OTRUNC)
|
601
|
-
end
|
602
|
-
|
603
|
-
assert_raise(RStyx::StyxException) do
|
604
|
-
to = RStyx::Message::Topen.new(0x12345678,
|
605
|
-
RStyx::Message::Topen::OEXEC |
|
606
|
-
RStyx::Message::Topen::OTRUNC)
|
607
|
-
end
|
608
|
-
|
609
|
-
assert_raise(RStyx::StyxException) do
|
610
|
-
to = RStyx::Message::Topen.new(0x12345678, 4)
|
611
|
-
end
|
612
|
-
|
613
|
-
assert_raise(RStyx::StyxException) do
|
614
|
-
to = RStyx::Message::Topen.new(0x12345678, 0xff)
|
615
|
-
end
|
616
|
-
|
617
|
-
to = RStyx::Message::Topen.new(0x12345678,
|
618
|
-
RStyx::Message::Topen::OWRITE |
|
619
|
-
RStyx::Message::Topen::OTRUNC |
|
620
|
-
RStyx::Message::Topen::ORCLOSE)
|
621
|
-
bytes = to.to_bytes(0x1234)
|
520
|
+
to = RStyx::Message::Topen.new(:fid => 0x12345678,
|
521
|
+
:mode => RStyx::OWRITE | RStyx::OTRUNC | RStyx::ORCLOSE,
|
522
|
+
:tag => 0x1234)
|
523
|
+
bytes = to.to_bytes
|
622
524
|
expect = "\x70\x34\x12\x78\x56\x34\x12\x51"
|
623
525
|
len = expect.length + 4
|
624
526
|
packlen = [len].pack("V")
|
625
527
|
expect = packlen + expect
|
626
528
|
assert(expect == bytes)
|
627
529
|
|
628
|
-
to2 = RStyx::Message::StyxMessage.
|
530
|
+
to2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
629
531
|
assert(to2.class == RStyx::Message::Topen)
|
630
|
-
assert(to2.length == len)
|
631
|
-
assert(to2.mtype == RStyx::Message::StyxMessage::TOPEN)
|
632
532
|
assert(to2.tag == 0x1234)
|
633
533
|
assert(to2.mode == 0x51)
|
634
534
|
assert(to2.fid == 0x12345678)
|
635
535
|
|
636
536
|
# Try decoding short strings
|
637
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
638
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
639
|
-
|
640
|
-
# Try decoding invalid values
|
641
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.decode(packlen + "\x70\x34\x12\x78\x56\x34\x12\x50") }
|
642
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.decode(packlen + "\x70\x34\x12\x78\x56\x34\x12\x53") }
|
643
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.decode(packlen + "\x70\x34\x12\x78\x56\x34\x12\xff") }
|
644
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.decode(packlen + "\x70\x34\x12\x78\x56\x34\x12\x04") }
|
537
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x70\x34\x12\x78\x56\x34\x12") }
|
538
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x70\x34\x12\x78\x56") }
|
645
539
|
|
646
540
|
# Try decoding with trailing garbage
|
647
541
|
assert_nothing_raised do
|
648
|
-
to2 = RStyx::Message::StyxMessage.
|
542
|
+
to2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
649
543
|
end
|
650
544
|
assert(to2.class == RStyx::Message::Topen)
|
651
|
-
assert(to2.length == len)
|
652
|
-
assert(to2.mtype == RStyx::Message::StyxMessage::TOPEN)
|
653
545
|
assert(to2.tag == 0x1234)
|
654
546
|
assert(to2.mode == 0x51)
|
655
547
|
assert(to2.fid == 0x12345678)
|
@@ -659,8 +551,8 @@ class MessageTest < Test::Unit::TestCase
|
|
659
551
|
# Test the Ropen class.
|
660
552
|
#
|
661
553
|
def test_ropen
|
662
|
-
ro = RStyx::Message::Ropen.new(RStyx::Message::Qid.new(0x01,0xdeadbeef,0xfeedfacec0ffeeee), 0xfedcba98)
|
663
|
-
bytes = ro.to_bytes
|
554
|
+
ro = RStyx::Message::Ropen.new(:qid => RStyx::Message::Qid.new(0x01,0xdeadbeef,0xfeedfacec0ffeeee), :iounit => 0xfedcba98, :tag => 0x1234)
|
555
|
+
bytes = ro.to_bytes
|
664
556
|
expect = "\x71\x34\x12\x01\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed\xfe\x98\xba\xdc\xfe"
|
665
557
|
len = expect.length + 4
|
666
558
|
packlen = [len].pack("V")
|
@@ -668,10 +560,8 @@ class MessageTest < Test::Unit::TestCase
|
|
668
560
|
assert(expect == bytes)
|
669
561
|
|
670
562
|
# Decode expect
|
671
|
-
ro2 = RStyx::Message::StyxMessage.
|
563
|
+
ro2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
672
564
|
assert(ro2.class == RStyx::Message::Ropen)
|
673
|
-
assert(ro2.length == len)
|
674
|
-
assert(ro2.mtype == RStyx::Message::StyxMessage::ROPEN)
|
675
565
|
assert(ro2.tag == 0x1234)
|
676
566
|
assert(ro2.qid.qtype == 0x01)
|
677
567
|
assert(ro2.qid.version == 0xdeadbeef)
|
@@ -679,16 +569,14 @@ class MessageTest < Test::Unit::TestCase
|
|
679
569
|
assert(ro2.iounit == 0xfedcba98)
|
680
570
|
|
681
571
|
# Try decoding short strings
|
682
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
683
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
572
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x71\x34\x12\x01\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed\xfe\x98\xba") }
|
573
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x71\x34\x12\x01\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed") }
|
684
574
|
|
685
575
|
# Decode with trailing garbage
|
686
576
|
assert_nothing_raised do
|
687
|
-
ro2 = RStyx::Message::StyxMessage.
|
577
|
+
ro2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
688
578
|
end
|
689
579
|
assert(ro2.class == RStyx::Message::Ropen)
|
690
|
-
assert(ro2.length == len)
|
691
|
-
assert(ro2.mtype == RStyx::Message::StyxMessage::ROPEN)
|
692
580
|
assert(ro2.tag == 0x1234)
|
693
581
|
assert(ro2.qid.qtype == 0x01)
|
694
582
|
assert(ro2.qid.version == 0xdeadbeef)
|
@@ -700,12 +588,12 @@ class MessageTest < Test::Unit::TestCase
|
|
700
588
|
# Test the Tcreate class
|
701
589
|
#
|
702
590
|
def test_tcreate
|
703
|
-
tc = RStyx::Message::Tcreate.new(0x12345678, "foo",
|
704
|
-
RStyx::
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
bytes = tc.to_bytes
|
591
|
+
tc = RStyx::Message::Tcreate.new(:fid => 0x12345678, :name => "foo",
|
592
|
+
:mode => RStyx::OWRITE | RStyx::OTRUNC |
|
593
|
+
RStyx::ORCLOSE,
|
594
|
+
:perm => 0xfedcba98,
|
595
|
+
:tag => 0x1234)
|
596
|
+
bytes = tc.to_bytes
|
709
597
|
expect = "\x72\x34\x12\x78\x56\x34\x12\x03\x00foo\x98\xba\xdc\xfe\x51"
|
710
598
|
len = expect.length + 4
|
711
599
|
packlen = [len].pack("V")
|
@@ -713,10 +601,8 @@ class MessageTest < Test::Unit::TestCase
|
|
713
601
|
assert(expect == bytes)
|
714
602
|
|
715
603
|
# Decode expect
|
716
|
-
tc2 = RStyx::Message::StyxMessage.
|
604
|
+
tc2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
717
605
|
assert(tc2.class == RStyx::Message::Tcreate)
|
718
|
-
assert(tc2.length == len)
|
719
|
-
assert(tc2.mtype == RStyx::Message::StyxMessage::TCREATE)
|
720
606
|
assert(tc2.tag == 0x1234)
|
721
607
|
assert(tc2.fid == 0x12345678)
|
722
608
|
assert(tc2.name == "foo")
|
@@ -724,18 +610,16 @@ class MessageTest < Test::Unit::TestCase
|
|
724
610
|
assert(tc2.mode == 0x51)
|
725
611
|
|
726
612
|
# Try decoding short strings
|
727
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
728
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
729
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
730
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
613
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x72\x34\x12\x78\x56\x34\x12\x03\x00foo\x98\xba\xdc\xfe") }
|
614
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x72\x34\x12\x78\x56\x34\x12\x03\x00foo\x98\xba") }
|
615
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x72\x34\x12\x78\x56\x34\x12\x03\x00f") }
|
616
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x72\x34\x12\x78\x56\x34") }
|
731
617
|
# Decode with trailing garbage
|
732
618
|
tc2 = nil
|
733
619
|
assert_nothing_raised do
|
734
|
-
tc2 = RStyx::Message::StyxMessage.
|
620
|
+
tc2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
735
621
|
end
|
736
622
|
assert(tc2.class == RStyx::Message::Tcreate)
|
737
|
-
assert(tc2.length == len)
|
738
|
-
assert(tc2.mtype == RStyx::Message::StyxMessage::TCREATE)
|
739
623
|
assert(tc2.tag == 0x1234)
|
740
624
|
assert(tc2.fid == 0x12345678)
|
741
625
|
assert(tc2.name == "foo")
|
@@ -747,8 +631,8 @@ class MessageTest < Test::Unit::TestCase
|
|
747
631
|
# Test the Rcreate class.
|
748
632
|
#
|
749
633
|
def test_rcreate
|
750
|
-
rc = RStyx::Message::Rcreate.new(RStyx::Message::Qid.new(0x01,0xdeadbeef,0xfeedfacec0ffeeee), 0xfedcba98)
|
751
|
-
bytes = rc.to_bytes
|
634
|
+
rc = RStyx::Message::Rcreate.new(:qid => RStyx::Message::Qid.new(0x01,0xdeadbeef,0xfeedfacec0ffeeee), :iounit => 0xfedcba98, :tag => 0x1234)
|
635
|
+
bytes = rc.to_bytes
|
752
636
|
expect = "\x73\x34\x12\x01\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed\xfe\x98\xba\xdc\xfe"
|
753
637
|
len = expect.length + 4
|
754
638
|
packlen = [len].pack("V")
|
@@ -756,10 +640,8 @@ class MessageTest < Test::Unit::TestCase
|
|
756
640
|
assert(expect == bytes)
|
757
641
|
|
758
642
|
# Decode expect
|
759
|
-
rc2 = RStyx::Message::StyxMessage.
|
643
|
+
rc2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
760
644
|
assert(rc2.class == RStyx::Message::Rcreate)
|
761
|
-
assert(rc2.length == len)
|
762
|
-
assert(rc2.mtype == RStyx::Message::StyxMessage::RCREATE)
|
763
645
|
assert(rc2.tag == 0x1234)
|
764
646
|
assert(rc2.qid.qtype == 0x01)
|
765
647
|
assert(rc2.qid.version == 0xdeadbeef)
|
@@ -767,17 +649,15 @@ class MessageTest < Test::Unit::TestCase
|
|
767
649
|
assert(rc2.iounit == 0xfedcba98)
|
768
650
|
|
769
651
|
# Try decoding short strings
|
770
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
771
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
652
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x73\x34\x12\x01\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed\xfe\x98\xba") }
|
653
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x73\x34\x12\x01\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed") }
|
772
654
|
|
773
655
|
# Decode with trailing garbage
|
774
656
|
rc2 = nil
|
775
657
|
assert_nothing_raised do
|
776
|
-
rc2 = RStyx::Message::StyxMessage.
|
658
|
+
rc2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
777
659
|
end
|
778
660
|
assert(rc2.class == RStyx::Message::Rcreate)
|
779
|
-
assert(rc2.length == len)
|
780
|
-
assert(rc2.mtype == RStyx::Message::StyxMessage::RCREATE)
|
781
661
|
assert(rc2.tag == 0x1234)
|
782
662
|
assert(rc2.qid.qtype == 0x01)
|
783
663
|
assert(rc2.qid.version == 0xdeadbeef)
|
@@ -789,8 +669,8 @@ class MessageTest < Test::Unit::TestCase
|
|
789
669
|
# Test the Tread class.
|
790
670
|
#
|
791
671
|
def test_tread
|
792
|
-
tr = RStyx::Message::Tread.new(0xdeadbeef, 0xfeedfacec0ffeeee, 0xcafebabe)
|
793
|
-
bytes = tr.to_bytes
|
672
|
+
tr = RStyx::Message::Tread.new(:fid => 0xdeadbeef, :offset => 0xfeedfacec0ffeeee, :count => 0xcafebabe, :tag => 0x1234)
|
673
|
+
bytes = tr.to_bytes
|
794
674
|
expect = "\x74\x34\x12\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed\xfe\xbe\xba\xfe\xca"
|
795
675
|
len = expect.length + 4
|
796
676
|
packlen = [len].pack("V")
|
@@ -798,31 +678,27 @@ class MessageTest < Test::Unit::TestCase
|
|
798
678
|
assert(expect == bytes)
|
799
679
|
|
800
680
|
# Decode expect
|
801
|
-
tr2 = RStyx::Message::StyxMessage.
|
681
|
+
tr2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
802
682
|
assert(tr2.class == RStyx::Message::Tread)
|
803
|
-
assert(tr2.length == len)
|
804
|
-
assert(tr2.mtype == RStyx::Message::StyxMessage::TREAD)
|
805
683
|
assert(tr2.tag == 0x1234)
|
806
684
|
assert(tr2.fid == 0xdeadbeef)
|
807
685
|
assert(tr2.offset == 0xfeedfacec0ffeeee)
|
808
686
|
assert(tr2.count == 0xcafebabe)
|
809
687
|
|
810
688
|
# Try decoding short strings
|
811
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
812
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
813
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
814
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
815
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
816
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
689
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x74\x34\x12\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed\xfe\xbe\xba\xfe") }
|
690
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x74\x34\x12\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed") }
|
691
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x74\x34\x12\xef\xbe\xad\xde\xee\xee\xff\xc0\xce") }
|
692
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x74\x34\x12\xef\xbe\xad\xde\xee") }
|
693
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x74\x34\x12\xef\xbe\xad\xde\xee") }
|
694
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x74\x34\x12\xef\xbe\xad") }
|
817
695
|
|
818
696
|
# Decode with trailing garbage
|
819
697
|
tr2 = nil
|
820
698
|
assert_nothing_raised do
|
821
|
-
tr2 = RStyx::Message::StyxMessage.
|
699
|
+
tr2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
822
700
|
end
|
823
701
|
assert(tr2.class == RStyx::Message::Tread)
|
824
|
-
assert(tr2.length == len)
|
825
|
-
assert(tr2.mtype == RStyx::Message::StyxMessage::TREAD)
|
826
702
|
assert(tr2.tag == 0x1234)
|
827
703
|
assert(tr2.fid == 0xdeadbeef)
|
828
704
|
assert(tr2.offset == 0xfeedfacec0ffeeee)
|
@@ -833,9 +709,9 @@ class MessageTest < Test::Unit::TestCase
|
|
833
709
|
# test cases for Rread class
|
834
710
|
#
|
835
711
|
def test_rread
|
836
|
-
data = "alpha bravo charlie delta echo foxtrot golf hotel india juliet kilo lima mama nancy oscar papa quebec romeo sierra tango uniform victor whiskey xray yankee
|
837
|
-
rr = RStyx::Message::Rread.new(data)
|
838
|
-
bytes = rr.to_bytes
|
712
|
+
data = "alpha bravo charlie delta echo foxtrot golf hotel india juliet kilo lima mama nancy oscar papa quebec romeo sierra tango uniform victor whiskey xray yankee \xff\xfe\xfd\xfc"
|
713
|
+
rr = RStyx::Message::Rread.new(:data => data, :tag => 0x1234)
|
714
|
+
bytes = rr.to_bytes
|
839
715
|
expect = "\x75\x34\x12\xa0\x00\x00\x00" + data
|
840
716
|
len = expect.length + 4
|
841
717
|
packlen = [len].pack("V")
|
@@ -843,28 +719,24 @@ class MessageTest < Test::Unit::TestCase
|
|
843
719
|
assert(expect == bytes)
|
844
720
|
|
845
721
|
# Decode expect
|
846
|
-
rr2 = RStyx::Message::StyxMessage.
|
722
|
+
rr2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
847
723
|
assert(rr2.class == RStyx::Message::Rread)
|
848
|
-
assert(rr2.length == len)
|
849
|
-
assert(rr2.mtype == RStyx::Message::StyxMessage::RREAD)
|
850
724
|
assert(rr2.tag == 0x1234)
|
851
725
|
assert(rr2.count == data.length)
|
852
726
|
assert(rr2.data == data)
|
853
727
|
|
854
728
|
# Try decoding short strings
|
855
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
856
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
729
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(expect.chop) }
|
730
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x75\x34\x12\xa0\x00\x00") }
|
857
731
|
# Try decoding empty
|
858
|
-
assert_nothing_raised { RStyx::Message::StyxMessage.
|
732
|
+
assert_nothing_raised { RStyx::Message::StyxMessage.from_bytes("\x0b\x00\x00\x00\x75\x34\x12\x00\x00\x00\x00") }
|
859
733
|
|
860
734
|
# Decode with trailing garbage
|
861
735
|
rr2 = nil
|
862
736
|
assert_nothing_raised do
|
863
|
-
rr2 = RStyx::Message::StyxMessage.
|
737
|
+
rr2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
864
738
|
end
|
865
739
|
assert(rr2.class == RStyx::Message::Rread)
|
866
|
-
assert(rr2.length == len)
|
867
|
-
assert(rr2.mtype == RStyx::Message::StyxMessage::RREAD)
|
868
740
|
assert(rr2.tag == 0x1234)
|
869
741
|
assert(rr2.count == data.length)
|
870
742
|
assert(rr2.data == data)
|
@@ -875,49 +747,45 @@ class MessageTest < Test::Unit::TestCase
|
|
875
747
|
#
|
876
748
|
def test_twrite
|
877
749
|
data = "alpha bravo charlie delta echo foxtrot golf hotel india juliet kilo lima mama nancy oscar papa quebec romeo sierra tango uniform victor whiskey xray yankee zulu"
|
878
|
-
tw = RStyx::Message::Twrite.new(0x12345678, 0xfeedfacec0ffeeee, data)
|
879
|
-
bytes = tw.to_bytes(0x1234)
|
750
|
+
tw = RStyx::Message::Twrite.new(:fid => 0x12345678, :offset => 0xfeedfacec0ffeeee, :data => data, :tag => 0x1234)
|
880
751
|
expect = "\x76\x34\x12\x78\x56\x34\x12\xee\xee\xff\xc0\xce\xfa\xed\xfe\xa0\x00\x00\x00" + data
|
881
752
|
len = expect.length + 4
|
882
753
|
packlen = [len].pack("V")
|
883
754
|
expect = packlen + expect
|
755
|
+
bytes = tw.to_bytes
|
884
756
|
assert(expect == bytes)
|
885
757
|
|
886
758
|
# Decode expect
|
887
|
-
tw2 = RStyx::Message::StyxMessage.
|
759
|
+
tw2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
888
760
|
assert(tw2.class == RStyx::Message::Twrite)
|
889
|
-
assert(tw2.length == len)
|
890
|
-
assert(tw2.mtype == RStyx::Message::StyxMessage::TWRITE)
|
891
761
|
assert(tw2.tag == 0x1234)
|
892
762
|
assert(tw2.fid == 0x12345678)
|
893
763
|
assert(tw2.offset == 0xfeedfacec0ffeeee)
|
894
|
-
assert(tw2.count == data.length)
|
895
764
|
assert(tw2.data == data)
|
896
765
|
# Try decoding short strings
|
897
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
766
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(expect.chop) }
|
898
767
|
|
899
768
|
# Try decoding empty
|
900
|
-
|
769
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::Twrite.from_bytes("1234567890123456789012") }
|
770
|
+
|
771
|
+
assert_nothing_raised { RStyx::Message::StyxMessage.from_bytes("\x17\x00\x00\x00\x75\x34\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00") }
|
901
772
|
# Decode with trailing garbage
|
902
773
|
tw2 = nil
|
903
774
|
assert_nothing_raised do
|
904
|
-
tw2 = RStyx::Message::StyxMessage.
|
775
|
+
tw2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
905
776
|
end
|
906
777
|
assert(tw2.class == RStyx::Message::Twrite)
|
907
|
-
assert(tw2.length == len)
|
908
|
-
assert(tw2.mtype == RStyx::Message::StyxMessage::TWRITE)
|
909
778
|
assert(tw2.tag == 0x1234)
|
910
779
|
assert(tw2.fid == 0x12345678)
|
911
780
|
assert(tw2.offset == 0xfeedfacec0ffeeee)
|
912
|
-
assert(tw2.count == data.length)
|
913
781
|
assert(tw2.data == data)
|
914
782
|
end
|
915
783
|
|
916
784
|
##
|
917
785
|
# Tests for Rwrite class
|
918
786
|
def test_rwrite
|
919
|
-
rw = RStyx::Message::Rwrite.new(0x12345678)
|
920
|
-
bytes = rw.to_bytes
|
787
|
+
rw = RStyx::Message::Rwrite.new(:count => 0x12345678, :tag => 0x1234)
|
788
|
+
bytes = rw.to_bytes
|
921
789
|
expect = "\x77\x34\x12\x78\x56\x34\x12"
|
922
790
|
len = expect.length + 4
|
923
791
|
packlen = [len].pack("V")
|
@@ -925,23 +793,19 @@ class MessageTest < Test::Unit::TestCase
|
|
925
793
|
assert(expect == bytes)
|
926
794
|
|
927
795
|
# decode expect
|
928
|
-
rw2 = RStyx::Message::StyxMessage.
|
796
|
+
rw2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
929
797
|
assert(rw2.class == RStyx::Message::Rwrite)
|
930
|
-
assert(rw2.length == len)
|
931
|
-
assert(rw2.mtype == RStyx::Message::StyxMessage::RWRITE)
|
932
798
|
assert(rw2.tag == 0x1234)
|
933
799
|
assert(rw2.count == 0x12345678)
|
934
800
|
|
935
801
|
# Try decoding short strings
|
936
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
802
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(expect.chop) }
|
937
803
|
# Decode with trailing garbage
|
938
804
|
rw2 = nil
|
939
805
|
assert_nothing_raised do
|
940
|
-
rw2 = RStyx::Message::StyxMessage.
|
806
|
+
rw2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
941
807
|
end
|
942
808
|
assert(rw2.class == RStyx::Message::Rwrite)
|
943
|
-
assert(rw2.length == len)
|
944
|
-
assert(rw2.mtype == RStyx::Message::StyxMessage::RWRITE)
|
945
809
|
assert(rw2.tag == 0x1234)
|
946
810
|
assert(rw2.count == 0x12345678)
|
947
811
|
end
|
@@ -950,34 +814,29 @@ class MessageTest < Test::Unit::TestCase
|
|
950
814
|
# Test the Tclunk class.
|
951
815
|
#
|
952
816
|
def test_tclunk
|
953
|
-
tc = RStyx::Message::Tclunk.new(0xdeadbeef)
|
954
|
-
bytes = tc.to_bytes(0x1234)
|
817
|
+
tc = RStyx::Message::Tclunk.new(:fid => 0xdeadbeef, :tag => 0x1234)
|
955
818
|
expect = "\x78\x34\x12\xef\xbe\xad\xde"
|
956
819
|
len = expect.length + 4
|
957
820
|
packlen = [len].pack("V")
|
958
821
|
expect = packlen + expect
|
959
|
-
assert(expect ==
|
822
|
+
assert(expect == tc.to_bytes)
|
960
823
|
|
961
824
|
# decode expect
|
962
|
-
tc2 = RStyx::Message::StyxMessage.
|
825
|
+
tc2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
963
826
|
assert(tc2.class == RStyx::Message::Tclunk)
|
964
|
-
assert(tc2.length == len)
|
965
|
-
assert(tc2.mtype == RStyx::Message::StyxMessage::TCLUNK)
|
966
827
|
assert(tc2.tag == 0x1234)
|
967
828
|
assert(tc2.fid == 0xdeadbeef)
|
968
829
|
|
969
830
|
# try decoding short strings
|
970
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
971
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
831
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x78\x34\x12\xef\xbe\xad") }
|
832
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x78\x34\x12") }
|
972
833
|
|
973
834
|
# decode with trailing garbage
|
974
835
|
tc2 = nil
|
975
836
|
assert_nothing_raised do
|
976
|
-
tc2 = RStyx::Message::StyxMessage.
|
837
|
+
tc2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
977
838
|
end
|
978
839
|
assert(tc2.class == RStyx::Message::Tclunk)
|
979
|
-
assert(tc2.length == len)
|
980
|
-
assert(tc2.mtype == RStyx::Message::StyxMessage::TCLUNK)
|
981
840
|
assert(tc2.tag == 0x1234)
|
982
841
|
assert(tc2.fid == 0xdeadbeef)
|
983
842
|
end
|
@@ -986,8 +845,8 @@ class MessageTest < Test::Unit::TestCase
|
|
986
845
|
# Test the Rclunk class.
|
987
846
|
#
|
988
847
|
def test_rclunk
|
989
|
-
rc = RStyx::Message::Rclunk.new
|
990
|
-
bytes = rc.to_bytes
|
848
|
+
rc = RStyx::Message::Rclunk.new(:tag => 0x1234)
|
849
|
+
bytes = rc.to_bytes
|
991
850
|
expect = "\x79\x34\x12"
|
992
851
|
len = expect.length + 4
|
993
852
|
packlen = [len].pack("V")
|
@@ -995,23 +854,19 @@ class MessageTest < Test::Unit::TestCase
|
|
995
854
|
assert(expect == bytes)
|
996
855
|
|
997
856
|
# decode expect
|
998
|
-
rc2 = RStyx::Message::StyxMessage.
|
857
|
+
rc2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
999
858
|
assert(rc2.class == RStyx::Message::Rclunk)
|
1000
|
-
assert(rc2.length == len)
|
1001
|
-
assert(rc2.mtype == RStyx::Message::StyxMessage::RCLUNK)
|
1002
859
|
assert(rc2.tag == 0x1234)
|
1003
860
|
|
1004
861
|
# try decoding short strings
|
1005
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
862
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x79\x34") }
|
1006
863
|
|
1007
864
|
# decode with trailing garbage
|
1008
865
|
rc2 = nil
|
1009
866
|
assert_nothing_raised do
|
1010
|
-
rc2 = RStyx::Message::StyxMessage.
|
867
|
+
rc2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
1011
868
|
end
|
1012
869
|
assert(rc2.class == RStyx::Message::Rclunk)
|
1013
|
-
assert(rc2.length == len)
|
1014
|
-
assert(rc2.mtype == RStyx::Message::StyxMessage::RCLUNK)
|
1015
870
|
assert(rc2.tag == 0x1234)
|
1016
871
|
end
|
1017
872
|
|
@@ -1019,8 +874,8 @@ class MessageTest < Test::Unit::TestCase
|
|
1019
874
|
# Test the Tremove class.
|
1020
875
|
#
|
1021
876
|
def test_tremove
|
1022
|
-
tr = RStyx::Message::Tremove.new(0xdeadbeef)
|
1023
|
-
bytes = tr.to_bytes
|
877
|
+
tr = RStyx::Message::Tremove.new(:fid => 0xdeadbeef, :tag => 0x1234)
|
878
|
+
bytes = tr.to_bytes
|
1024
879
|
expect = "\x7a\x34\x12\xef\xbe\xad\xde"
|
1025
880
|
len = expect.length + 4
|
1026
881
|
packlen = [len].pack("V")
|
@@ -1028,25 +883,21 @@ class MessageTest < Test::Unit::TestCase
|
|
1028
883
|
assert(expect == bytes)
|
1029
884
|
|
1030
885
|
# decode expect
|
1031
|
-
tr2 = RStyx::Message::StyxMessage.
|
886
|
+
tr2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
1032
887
|
assert(tr2.class == RStyx::Message::Tremove)
|
1033
|
-
assert(tr2.length == len)
|
1034
|
-
assert(tr2.mtype == RStyx::Message::StyxMessage::TREMOVE)
|
1035
888
|
assert(tr2.tag == 0x1234)
|
1036
889
|
assert(tr2.fid == 0xdeadbeef)
|
1037
890
|
|
1038
891
|
# try decoding short strings
|
1039
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
1040
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
892
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x7a\x34\x12\xef\xbe\xad") }
|
893
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x7a\x34\x12") }
|
1041
894
|
|
1042
895
|
# decode with trailing garbage
|
1043
896
|
tr2 = nil
|
1044
897
|
assert_nothing_raised do
|
1045
|
-
tr2 = RStyx::Message::StyxMessage.
|
898
|
+
tr2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
1046
899
|
end
|
1047
900
|
assert(tr2.class == RStyx::Message::Tremove)
|
1048
|
-
assert(tr2.length == len)
|
1049
|
-
assert(tr2.mtype == RStyx::Message::StyxMessage::TREMOVE)
|
1050
901
|
assert(tr2.tag == 0x1234)
|
1051
902
|
assert(tr2.fid == 0xdeadbeef)
|
1052
903
|
end
|
@@ -1055,8 +906,8 @@ class MessageTest < Test::Unit::TestCase
|
|
1055
906
|
# Test the Rremove class.
|
1056
907
|
#
|
1057
908
|
def test_rremove
|
1058
|
-
rr = RStyx::Message::Rremove.new
|
1059
|
-
bytes = rr.to_bytes
|
909
|
+
rr = RStyx::Message::Rremove.new(:tag => 0x1234)
|
910
|
+
bytes = rr.to_bytes
|
1060
911
|
expect = "\x7b\x34\x12"
|
1061
912
|
len = expect.length + 4
|
1062
913
|
packlen = [len].pack("V")
|
@@ -1064,23 +915,19 @@ class MessageTest < Test::Unit::TestCase
|
|
1064
915
|
assert(expect == bytes)
|
1065
916
|
|
1066
917
|
# decode expect
|
1067
|
-
rr2 = RStyx::Message::StyxMessage.
|
918
|
+
rr2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
1068
919
|
assert(rr2.class == RStyx::Message::Rremove)
|
1069
|
-
assert(rr2.length == len)
|
1070
|
-
assert(rr2.mtype == RStyx::Message::StyxMessage::RREMOVE)
|
1071
920
|
assert(rr2.tag == 0x1234)
|
1072
921
|
|
1073
922
|
# try decoding short strings
|
1074
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
923
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x7b\x34") }
|
1075
924
|
|
1076
925
|
# decode with trailing garbage
|
1077
926
|
rr2 = nil
|
1078
927
|
assert_nothing_raised do
|
1079
|
-
rr2 = RStyx::Message::StyxMessage.
|
928
|
+
rr2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
1080
929
|
end
|
1081
930
|
assert(rr2.class == RStyx::Message::Rremove)
|
1082
|
-
assert(rr2.length == len)
|
1083
|
-
assert(rr2.mtype == RStyx::Message::StyxMessage::RREMOVE)
|
1084
931
|
assert(rr2.tag == 0x1234)
|
1085
932
|
end
|
1086
933
|
|
@@ -1088,8 +935,8 @@ class MessageTest < Test::Unit::TestCase
|
|
1088
935
|
# Test the Tstat class.
|
1089
936
|
#
|
1090
937
|
def test_tstat
|
1091
|
-
ts = RStyx::Message::Tstat.new(0xdeadbeef)
|
1092
|
-
bytes = ts.to_bytes
|
938
|
+
ts = RStyx::Message::Tstat.new(:fid => 0xdeadbeef, :tag => 0x1234)
|
939
|
+
bytes = ts.to_bytes
|
1093
940
|
expect = "\x7c\x34\x12\xef\xbe\xad\xde"
|
1094
941
|
len = expect.length + 4
|
1095
942
|
packlen = [len].pack("V")
|
@@ -1097,25 +944,21 @@ class MessageTest < Test::Unit::TestCase
|
|
1097
944
|
assert(expect == bytes)
|
1098
945
|
|
1099
946
|
# decode expect
|
1100
|
-
ts2 = RStyx::Message::StyxMessage.
|
947
|
+
ts2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
1101
948
|
assert(ts2.class == RStyx::Message::Tstat)
|
1102
|
-
assert(ts2.length == len)
|
1103
|
-
assert(ts2.mtype == RStyx::Message::StyxMessage::TSTAT)
|
1104
949
|
assert(ts2.tag == 0x1234)
|
1105
950
|
assert(ts2.fid == 0xdeadbeef)
|
1106
951
|
|
1107
952
|
# try decoding short strings
|
1108
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
1109
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
953
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x7c\x34\x12\xef\xbe\xad") }
|
954
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(packlen + "\x7c\x34\x12") }
|
1110
955
|
|
1111
956
|
# decode with trailing garbage
|
1112
957
|
ts2 = nil
|
1113
958
|
assert_nothing_raised do
|
1114
|
-
ts2 = RStyx::Message::StyxMessage.
|
959
|
+
ts2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage")
|
1115
960
|
end
|
1116
961
|
assert(ts2.class == RStyx::Message::Tstat)
|
1117
|
-
assert(ts2.length == len)
|
1118
|
-
assert(ts2.mtype == RStyx::Message::StyxMessage::TSTAT)
|
1119
962
|
assert(ts2.tag == 0x1234)
|
1120
963
|
assert(ts2.fid == 0xdeadbeef)
|
1121
964
|
end
|
@@ -1124,7 +967,7 @@ class MessageTest < Test::Unit::TestCase
|
|
1124
967
|
# Test the Rstat class.
|
1125
968
|
#
|
1126
969
|
def test_rstat
|
1127
|
-
de = RStyx::Message::
|
970
|
+
de = RStyx::Message::Stat.new
|
1128
971
|
de.dtype = 0x1234
|
1129
972
|
de.dev = 0x567890ab
|
1130
973
|
de.qid = RStyx::Message::Qid.new(0x01, 0xdeadbeef,0xfeedfacec0ffeeee)
|
@@ -1136,20 +979,17 @@ class MessageTest < Test::Unit::TestCase
|
|
1136
979
|
de.uid = "bar"
|
1137
980
|
de.gid = "baz"
|
1138
981
|
de.muid = "quux"
|
1139
|
-
rs = RStyx::Message::Rstat.new(de)
|
1140
|
-
bytes = rs.to_bytes
|
982
|
+
rs = RStyx::Message::Rstat.new(:stat => de, :tag => 0x1234)
|
983
|
+
bytes = rs.to_bytes
|
1141
984
|
expect = "\x7d\x34\x12\x3e\x00\x3c\x00\x34\x12\xab\x90\x78\x56\x01\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed\xfe\xf0\xde\xbc\x9a\xef\xbe\xad\xde\xbe\xba\xfe\xca\x10\x32\x54\x76\x98\xba\xdc\xfe\x03\x00foo\x03\x00bar\x03\x00baz\x04\x00quux"
|
1142
985
|
len = expect.length + 4
|
1143
986
|
packlen = [len].pack("V")
|
1144
987
|
expect = packlen + expect
|
1145
|
-
puts ""
|
1146
988
|
assert(expect == bytes)
|
1147
989
|
|
1148
990
|
# decode expect
|
1149
|
-
rs2 = RStyx::Message::StyxMessage.
|
991
|
+
rs2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
1150
992
|
assert(rs2.class == RStyx::Message::Rstat)
|
1151
|
-
assert(rs2.length == len)
|
1152
|
-
assert(rs2.mtype == RStyx::Message::StyxMessage::RSTAT)
|
1153
993
|
assert(rs2.tag == 0x1234)
|
1154
994
|
assert(rs2.stat.dtype == 0x1234)
|
1155
995
|
assert(rs2.stat.dev == 0x567890ab)
|
@@ -1166,14 +1006,12 @@ class MessageTest < Test::Unit::TestCase
|
|
1166
1006
|
assert(rs2.stat.muid == "quux")
|
1167
1007
|
|
1168
1008
|
# try decoding short strings
|
1169
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
1009
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(expect.chop) }
|
1170
1010
|
|
1171
1011
|
# Trailing garbage test
|
1172
1012
|
rs2 = nil
|
1173
|
-
assert_nothing_raised { rs2 = RStyx::Message::StyxMessage.
|
1013
|
+
assert_nothing_raised { rs2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage") }
|
1174
1014
|
assert(rs2.class == RStyx::Message::Rstat)
|
1175
|
-
assert(rs2.length == len)
|
1176
|
-
assert(rs2.mtype == RStyx::Message::StyxMessage::RSTAT)
|
1177
1015
|
assert(rs2.tag == 0x1234)
|
1178
1016
|
assert(rs2.stat.dtype == 0x1234)
|
1179
1017
|
assert(rs2.stat.dev == 0x567890ab)
|
@@ -1194,7 +1032,7 @@ class MessageTest < Test::Unit::TestCase
|
|
1194
1032
|
# Test the Twstat class.
|
1195
1033
|
#
|
1196
1034
|
def test_twstat
|
1197
|
-
de = RStyx::Message::
|
1035
|
+
de = RStyx::Message::Stat.new
|
1198
1036
|
de.dtype = 0x1234
|
1199
1037
|
de.dev = 0x567890ab
|
1200
1038
|
de.qid = RStyx::Message::Qid.new(0x01, 0xdeadbeef,0xfeedfacec0ffeeee)
|
@@ -1206,8 +1044,8 @@ class MessageTest < Test::Unit::TestCase
|
|
1206
1044
|
de.uid = "bar"
|
1207
1045
|
de.gid = "baz"
|
1208
1046
|
de.muid = "quux"
|
1209
|
-
tw = RStyx::Message::Twstat.new(0x12345678, de)
|
1210
|
-
bytes = tw.to_bytes
|
1047
|
+
tw = RStyx::Message::Twstat.new(:fid => 0x12345678, :stat => de, :tag => 0x1234)
|
1048
|
+
bytes = tw.to_bytes
|
1211
1049
|
expect = "\x7e\x34\x12\x78\x56\x34\x12\x3e\x00\x3c\x00\x34\x12\xab\x90\x78\x56\x01\xef\xbe\xad\xde\xee\xee\xff\xc0\xce\xfa\xed\xfe\xf0\xde\xbc\x9a\xef\xbe\xad\xde\xbe\xba\xfe\xca\x10\x32\x54\x76\x98\xba\xdc\xfe\x03\x00foo\x03\x00bar\x03\x00baz\x04\x00quux"
|
1212
1050
|
len = expect.length + 4
|
1213
1051
|
packlen = [len].pack("V")
|
@@ -1215,10 +1053,8 @@ class MessageTest < Test::Unit::TestCase
|
|
1215
1053
|
assert(expect == bytes)
|
1216
1054
|
|
1217
1055
|
# decode expect
|
1218
|
-
tw2 = RStyx::Message::StyxMessage.
|
1056
|
+
tw2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
1219
1057
|
assert(tw2.class == RStyx::Message::Twstat)
|
1220
|
-
assert(tw2.length == len)
|
1221
|
-
assert(tw2.mtype == RStyx::Message::StyxMessage::TWSTAT)
|
1222
1058
|
assert(tw2.tag == 0x1234)
|
1223
1059
|
assert(tw2.stat.dtype == 0x1234)
|
1224
1060
|
assert(tw2.stat.dev == 0x567890ab)
|
@@ -1235,13 +1071,11 @@ class MessageTest < Test::Unit::TestCase
|
|
1235
1071
|
assert(tw2.stat.muid == "quux")
|
1236
1072
|
|
1237
1073
|
# try decoding short strings
|
1238
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
1074
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(expect.chop) }
|
1239
1075
|
# Trailing garbage test
|
1240
1076
|
tw2 = nil
|
1241
|
-
assert_nothing_raised { tw2 = RStyx::Message::StyxMessage.
|
1077
|
+
assert_nothing_raised { tw2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage") }
|
1242
1078
|
assert(tw2.class == RStyx::Message::Twstat)
|
1243
|
-
assert(tw2.length == len)
|
1244
|
-
assert(tw2.mtype == RStyx::Message::StyxMessage::TWSTAT)
|
1245
1079
|
assert(tw2.tag == 0x1234)
|
1246
1080
|
assert(tw2.stat.dtype == 0x1234)
|
1247
1081
|
assert(tw2.stat.dev == 0x567890ab)
|
@@ -1262,8 +1096,8 @@ class MessageTest < Test::Unit::TestCase
|
|
1262
1096
|
# Test the Rwstat class.
|
1263
1097
|
#
|
1264
1098
|
def test_rwstat
|
1265
|
-
rw = RStyx::Message::Rwstat.new
|
1266
|
-
bytes = rw.to_bytes
|
1099
|
+
rw = RStyx::Message::Rwstat.new(:tag => 0x1234)
|
1100
|
+
bytes = rw.to_bytes
|
1267
1101
|
expect = "\x7f\x34\x12"
|
1268
1102
|
len = expect.length + 4
|
1269
1103
|
packlen = [len].pack("V")
|
@@ -1271,19 +1105,42 @@ class MessageTest < Test::Unit::TestCase
|
|
1271
1105
|
assert(expect == bytes)
|
1272
1106
|
|
1273
1107
|
# decode expect
|
1274
|
-
rw2 = RStyx::Message::StyxMessage.
|
1108
|
+
rw2 = RStyx::Message::StyxMessage.from_bytes(expect)
|
1275
1109
|
assert(rw2.class == RStyx::Message::Rwstat)
|
1276
|
-
assert(rw2.length == len)
|
1277
|
-
assert(rw2.mtype == RStyx::Message::StyxMessage::RWSTAT)
|
1278
1110
|
assert(rw2.tag == 0x1234)
|
1279
1111
|
# try decoding short strings
|
1280
|
-
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.
|
1112
|
+
assert_raise(RStyx::StyxException) { RStyx::Message::StyxMessage.from_bytes(expect.chop) }
|
1281
1113
|
# trailing garbage test
|
1282
|
-
assert_nothing_raised { rw2 = RStyx::Message::StyxMessage.
|
1114
|
+
assert_nothing_raised { rw2 = RStyx::Message::StyxMessage.from_bytes(expect + "trailing garbage") }
|
1283
1115
|
assert(rw2.class == RStyx::Message::Rwstat)
|
1284
|
-
assert(rw2.length == len)
|
1285
|
-
assert(rw2.mtype == RStyx::Message::StyxMessage::RWSTAT)
|
1286
1116
|
assert(rw2.tag == 0x1234)
|
1287
1117
|
end
|
1288
1118
|
|
1119
|
+
# Decode live Styx messages received from actual Styx server
|
1120
|
+
# implementations.
|
1121
|
+
def test_decode
|
1122
|
+
# Rversion from Inferno
|
1123
|
+
str = "\023\000\000\000eA\271\030 \000\000\006\0009P2000"
|
1124
|
+
m = RStyx::Message::StyxMessage.from_bytes(str)
|
1125
|
+
assert_equal(RStyx::Message::Rversion, m.class)
|
1126
|
+
assert_equal(47425, m.tag)
|
1127
|
+
assert_equal(8216, m.msize)
|
1128
|
+
assert_equal("9P2000", m.version)
|
1129
|
+
|
1130
|
+
# Rattach from Inferno
|
1131
|
+
str = "\024\000\000\000i.w\200\240q^F\240\307\006\000\000\000\000\000"
|
1132
|
+
m = RStyx::Message::StyxMessage.from_bytes(str)
|
1133
|
+
assert_equal(RStyx::Message::Rattach, m.class)
|
1134
|
+
assert_equal(30510, m.tag)
|
1135
|
+
assert_equal(1180594592, m.qid.version)
|
1136
|
+
assert_equal(128, m.qid.qtype)
|
1137
|
+
assert_equal(444320, m.qid.path)
|
1138
|
+
|
1139
|
+
# Rclunk from Inferno
|
1140
|
+
str = "\a\000\000\000y7\372"
|
1141
|
+
m = RStyx::Message::StyxMessage.from_bytes(str)
|
1142
|
+
assert_equal(RStyx::Message::Rclunk, m.class)
|
1143
|
+
assert_equal(64055, m.tag)
|
1144
|
+
end
|
1145
|
+
|
1289
1146
|
end
|