scotttam-RocketAMF 0.2.2
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/README.rdoc +45 -0
- data/Rakefile +54 -0
- data/lib/rocketamf.rb +128 -0
- data/lib/rocketamf/class_mapping.rb +231 -0
- data/lib/rocketamf/constants.rb +46 -0
- data/lib/rocketamf/pure.rb +28 -0
- data/lib/rocketamf/pure/deserializer.rb +419 -0
- data/lib/rocketamf/pure/io_helpers.rb +94 -0
- data/lib/rocketamf/pure/remoting.rb +134 -0
- data/lib/rocketamf/pure/serializer.rb +433 -0
- data/lib/rocketamf/remoting.rb +144 -0
- data/lib/rocketamf/values/array_collection.rb +13 -0
- data/lib/rocketamf/values/messages.rb +133 -0
- data/lib/rocketamf/values/typed_hash.rb +13 -0
- data/spec/amf/class_mapping_spec.rb +150 -0
- data/spec/amf/deserializer_spec.rb +367 -0
- data/spec/amf/remoting_spec.rb +132 -0
- data/spec/amf/serializer_spec.rb +384 -0
- data/spec/amf/values/array_collection_spec.rb +19 -0
- data/spec/amf/values/messages_spec.rb +31 -0
- data/spec/fixtures/objects/amf0-boolean.bin +1 -0
- data/spec/fixtures/objects/amf0-complexEncodedStringArray.bin +0 -0
- data/spec/fixtures/objects/amf0-date.bin +0 -0
- data/spec/fixtures/objects/amf0-ecma-ordinal-array.bin +0 -0
- data/spec/fixtures/objects/amf0-hash.bin +0 -0
- data/spec/fixtures/objects/amf0-null.bin +1 -0
- data/spec/fixtures/objects/amf0-number.bin +0 -0
- data/spec/fixtures/objects/amf0-object.bin +0 -0
- data/spec/fixtures/objects/amf0-ref-test.bin +0 -0
- data/spec/fixtures/objects/amf0-strict-array.bin +0 -0
- data/spec/fixtures/objects/amf0-string.bin +0 -0
- data/spec/fixtures/objects/amf0-typed-object.bin +0 -0
- data/spec/fixtures/objects/amf0-undefined.bin +1 -0
- data/spec/fixtures/objects/amf0-untyped-object.bin +0 -0
- data/spec/fixtures/objects/amf0-xmlDoc.bin +0 -0
- data/spec/fixtures/objects/amf3-0.bin +0 -0
- data/spec/fixtures/objects/amf3-arrayCollection.bin +2 -0
- data/spec/fixtures/objects/amf3-arrayRef.bin +1 -0
- data/spec/fixtures/objects/amf3-bigNum.bin +0 -0
- data/spec/fixtures/objects/amf3-byteArray.bin +0 -0
- data/spec/fixtures/objects/amf3-byteArrayRef.bin +1 -0
- data/spec/fixtures/objects/amf3-complexEncodedStringArray.bin +1 -0
- data/spec/fixtures/objects/amf3-date.bin +0 -0
- data/spec/fixtures/objects/amf3-datesRef.bin +0 -0
- data/spec/fixtures/objects/amf3-dictionary.bin +0 -0
- data/spec/fixtures/objects/amf3-dynObject.bin +2 -0
- data/spec/fixtures/objects/amf3-emptyArray.bin +1 -0
- data/spec/fixtures/objects/amf3-emptyArrayRef.bin +1 -0
- data/spec/fixtures/objects/amf3-emptyDictionary.bin +0 -0
- data/spec/fixtures/objects/amf3-emptyStringRef.bin +1 -0
- data/spec/fixtures/objects/amf3-encodedStringRef.bin +0 -0
- data/spec/fixtures/objects/amf3-false.bin +1 -0
- data/spec/fixtures/objects/amf3-float.bin +0 -0
- data/spec/fixtures/objects/amf3-graphMember.bin +0 -0
- data/spec/fixtures/objects/amf3-hash.bin +2 -0
- data/spec/fixtures/objects/amf3-largeMax.bin +0 -0
- data/spec/fixtures/objects/amf3-largeMin.bin +0 -0
- data/spec/fixtures/objects/amf3-max.bin +1 -0
- data/spec/fixtures/objects/amf3-min.bin +0 -0
- data/spec/fixtures/objects/amf3-mixedArray.bin +11 -0
- data/spec/fixtures/objects/amf3-null.bin +1 -0
- data/spec/fixtures/objects/amf3-objRef.bin +0 -0
- data/spec/fixtures/objects/amf3-primArray.bin +1 -0
- data/spec/fixtures/objects/amf3-string.bin +1 -0
- data/spec/fixtures/objects/amf3-stringRef.bin +0 -0
- data/spec/fixtures/objects/amf3-symbol.bin +1 -0
- data/spec/fixtures/objects/amf3-traitRef.bin +3 -0
- data/spec/fixtures/objects/amf3-true.bin +1 -0
- data/spec/fixtures/objects/amf3-typedObject.bin +2 -0
- data/spec/fixtures/objects/amf3-xml.bin +1 -0
- data/spec/fixtures/objects/amf3-xmlDoc.bin +1 -0
- data/spec/fixtures/objects/amf3-xmlRef.bin +1 -0
- data/spec/fixtures/request/acknowledge-response.bin +0 -0
- data/spec/fixtures/request/amf0-error-response.bin +0 -0
- data/spec/fixtures/request/commandMessage.bin +0 -0
- data/spec/fixtures/request/remotingMessage.bin +0 -0
- data/spec/fixtures/request/simple-response.bin +0 -0
- data/spec/fixtures/request/unsupportedCommandMessage.bin +0 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +31 -0
- metadata +153 -0
@@ -0,0 +1,367 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
4
|
+
|
5
|
+
describe "when deserializing" do
|
6
|
+
before :each do
|
7
|
+
RocketAMF::ClassMapper.reset
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "AMF0" do
|
11
|
+
it "should deserialize numbers" do
|
12
|
+
input = object_fixture('amf0-number.bin')
|
13
|
+
output = RocketAMF.deserialize(input, 0)
|
14
|
+
output.should == 3.5
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should deserialize booleans" do
|
18
|
+
input = object_fixture('amf0-boolean.bin')
|
19
|
+
output = RocketAMF.deserialize(input, 0)
|
20
|
+
output.should === true
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should deserialize UTF8 strings" do
|
24
|
+
input = object_fixture('amf0-string.bin')
|
25
|
+
output = RocketAMF.deserialize(input, 0)
|
26
|
+
output.should == "this is a テスト"
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should deserialize anonymous objects" do
|
30
|
+
input = object_fixture('amf0-object.bin')
|
31
|
+
output = RocketAMF.deserialize(input, 0)
|
32
|
+
output.should == {:foo => 'baz', :bar => 3.14}
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should deserialize nulls" do
|
36
|
+
input = object_fixture('amf0-null.bin')
|
37
|
+
output = RocketAMF.deserialize(input, 0)
|
38
|
+
output.should == nil
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should deserialize undefineds" do
|
42
|
+
input = object_fixture('amf0-undefined.bin')
|
43
|
+
output = RocketAMF.deserialize(input, 0)
|
44
|
+
output.should == nil
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should deserialize references properly" do
|
48
|
+
input = object_fixture('amf0-ref-test.bin')
|
49
|
+
output = RocketAMF.deserialize(input, 0)
|
50
|
+
output.length.should == 2
|
51
|
+
output[0].should === output[1]
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should deserialize hashes" do
|
55
|
+
input = object_fixture('amf0-hash.bin')
|
56
|
+
output = RocketAMF.deserialize(input, 0)
|
57
|
+
output.should == {:a => 'b', :c => 'd'}
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should deserialize arrays from flash player" do
|
61
|
+
# Even Array is serialized as a "hash", so check that deserializer converts to array
|
62
|
+
input = object_fixture('amf0-ecma-ordinal-array.bin')
|
63
|
+
output = RocketAMF.deserialize(input, 0)
|
64
|
+
output.should == ['a', 'b', 'c', 'd']
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should serialize strict arrays" do
|
68
|
+
input = object_fixture('amf0-strict-array.bin')
|
69
|
+
output = RocketAMF.deserialize(input, 0)
|
70
|
+
output.should == ['a', 'b', 'c', 'd']
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should deserialize dates" do
|
74
|
+
input = object_fixture('amf0-date.bin')
|
75
|
+
output = RocketAMF.deserialize(input, 0)
|
76
|
+
output.should == Time.utc(2003, 2, 13, 5)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should deserialize an XML document" do
|
80
|
+
input = object_fixture('amf0-xmlDoc.bin')
|
81
|
+
output = RocketAMF.deserialize(input, 0)
|
82
|
+
output.should == '<parent><child prop="test" /></parent>'
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should deserialize an unmapped object as a dynamic anonymous object" do
|
86
|
+
input = object_fixture("amf0-typed-object.bin")
|
87
|
+
output = RocketAMF.deserialize(input, 0)
|
88
|
+
|
89
|
+
output.type.should == 'org.rocketAMF.ASClass'
|
90
|
+
output.should == {:foo => 'bar', :baz => nil}
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should deserialize a mapped object as a mapped ruby class instance" do
|
94
|
+
RocketAMF::ClassMapper.define {|m| m.map :as => 'org.rocketAMF.ASClass', :ruby => 'RubyClass'}
|
95
|
+
|
96
|
+
input = object_fixture("amf0-typed-object.bin")
|
97
|
+
output = RocketAMF.deserialize(input, 0)
|
98
|
+
|
99
|
+
output.should be_a(RubyClass)
|
100
|
+
output.foo.should == 'bar'
|
101
|
+
output.baz.should == nil
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "AMF3" do
|
106
|
+
describe "simple messages" do
|
107
|
+
it "should deserialize a null" do
|
108
|
+
input = object_fixture("amf3-null.bin")
|
109
|
+
output = RocketAMF.deserialize(input, 3)
|
110
|
+
output.should == nil
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should deserialize a false" do
|
114
|
+
input = object_fixture("amf3-false.bin")
|
115
|
+
output = RocketAMF.deserialize(input, 3)
|
116
|
+
output.should == false
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should deserialize a true" do
|
120
|
+
input = object_fixture("amf3-true.bin")
|
121
|
+
output = RocketAMF.deserialize(input, 3)
|
122
|
+
output.should == true
|
123
|
+
end
|
124
|
+
|
125
|
+
it "should deserialize integers" do
|
126
|
+
input = object_fixture("amf3-max.bin")
|
127
|
+
output = RocketAMF.deserialize(input, 3)
|
128
|
+
output.should == RocketAMF::MAX_INTEGER
|
129
|
+
|
130
|
+
input = object_fixture("amf3-0.bin")
|
131
|
+
output = RocketAMF.deserialize(input, 3)
|
132
|
+
output.should == 0
|
133
|
+
|
134
|
+
input = object_fixture("amf3-min.bin")
|
135
|
+
output = RocketAMF.deserialize(input, 3)
|
136
|
+
output.should == RocketAMF::MIN_INTEGER
|
137
|
+
end
|
138
|
+
|
139
|
+
it "should deserialize large integers" do
|
140
|
+
input = object_fixture("amf3-largeMax.bin")
|
141
|
+
output = RocketAMF.deserialize(input, 3)
|
142
|
+
output.should == RocketAMF::MAX_INTEGER + 1
|
143
|
+
|
144
|
+
input = object_fixture("amf3-largeMin.bin")
|
145
|
+
output = RocketAMF.deserialize(input, 3)
|
146
|
+
output.should == RocketAMF::MIN_INTEGER - 1
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should deserialize BigNums" do
|
150
|
+
input = object_fixture("amf3-bigNum.bin")
|
151
|
+
output = RocketAMF.deserialize(input, 3)
|
152
|
+
output.should == 2**1000
|
153
|
+
end
|
154
|
+
|
155
|
+
it "should deserialize a simple string" do
|
156
|
+
input = object_fixture("amf3-string.bin")
|
157
|
+
output = RocketAMF.deserialize(input, 3)
|
158
|
+
output.should == "String . String"
|
159
|
+
end
|
160
|
+
|
161
|
+
it "should deserialize a symbol as a string" do
|
162
|
+
input = object_fixture("amf3-symbol.bin")
|
163
|
+
output = RocketAMF.deserialize(input, 3)
|
164
|
+
output.should == "foo"
|
165
|
+
end
|
166
|
+
|
167
|
+
it "should deserialize dates" do
|
168
|
+
input = object_fixture("amf3-date.bin")
|
169
|
+
output = RocketAMF.deserialize(input, 3)
|
170
|
+
output.should == Time.at(0)
|
171
|
+
end
|
172
|
+
|
173
|
+
it "should deserialize XML" do
|
174
|
+
# XMLDocument tag
|
175
|
+
input = object_fixture("amf3-xmlDoc.bin")
|
176
|
+
output = RocketAMF.deserialize(input, 3)
|
177
|
+
output.should == '<parent><child prop="test" /></parent>'
|
178
|
+
|
179
|
+
# XML tag
|
180
|
+
input = object_fixture("amf3-xml.bin")
|
181
|
+
output = RocketAMF.deserialize(input, 3)
|
182
|
+
output.should == '<parent><child prop="test"/></parent>'
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
describe "objects" do
|
187
|
+
it "should deserialize an unmapped object as a dynamic anonymous object" do
|
188
|
+
input = object_fixture("amf3-dynObject.bin")
|
189
|
+
output = RocketAMF.deserialize(input, 3)
|
190
|
+
|
191
|
+
expected = {
|
192
|
+
:property_one => 'foo',
|
193
|
+
:property_two => 1,
|
194
|
+
:nil_property => nil,
|
195
|
+
:another_public_property => 'a_public_value'
|
196
|
+
}
|
197
|
+
output.should == expected
|
198
|
+
end
|
199
|
+
|
200
|
+
it "should deserialize a mapped object as a mapped ruby class instance" do
|
201
|
+
RocketAMF::ClassMapper.define {|m| m.map :as => 'org.rocketAMF.ASClass', :ruby => 'RubyClass'}
|
202
|
+
|
203
|
+
input = object_fixture("amf3-typedObject.bin")
|
204
|
+
output = RocketAMF.deserialize(input, 3)
|
205
|
+
|
206
|
+
output.should be_a(RubyClass)
|
207
|
+
output.foo.should == 'bar'
|
208
|
+
output.baz.should == nil
|
209
|
+
end
|
210
|
+
|
211
|
+
it "should deserialize a hash as a dynamic anonymous object" do
|
212
|
+
input = object_fixture("amf3-hash.bin")
|
213
|
+
output = RocketAMF.deserialize(input, 3)
|
214
|
+
output.should == {:foo => "bar", :answer => 42}
|
215
|
+
end
|
216
|
+
|
217
|
+
it "should deserialize an empty array" do
|
218
|
+
input = object_fixture("amf3-emptyArray.bin")
|
219
|
+
output = RocketAMF.deserialize(input, 3)
|
220
|
+
output.should == []
|
221
|
+
end
|
222
|
+
|
223
|
+
it "should deserialize an array of primitives" do
|
224
|
+
input = object_fixture("amf3-primArray.bin")
|
225
|
+
output = RocketAMF.deserialize(input, 3)
|
226
|
+
output.should == [1,2,3,4,5]
|
227
|
+
end
|
228
|
+
|
229
|
+
it "should deserialize an array of mixed objects" do
|
230
|
+
input = object_fixture("amf3-mixedArray.bin")
|
231
|
+
output = RocketAMF.deserialize(input, 3)
|
232
|
+
|
233
|
+
h1 = {:foo_one => "bar_one"}
|
234
|
+
h2 = {:foo_two => ""}
|
235
|
+
so1 = {:foo_three => 42}
|
236
|
+
output.should == [h1, h2, so1, {:foo_three => nil}, {}, [h1, h2, so1], [], 42, "", [], "", {}, "bar_one", so1]
|
237
|
+
end
|
238
|
+
|
239
|
+
it "should deserialize a byte array" do
|
240
|
+
input = object_fixture("amf3-byteArray.bin")
|
241
|
+
output = RocketAMF.deserialize(input, 3)
|
242
|
+
|
243
|
+
output.should be_a(StringIO)
|
244
|
+
expected = "\000\003これtest\100"
|
245
|
+
expected.force_encoding("ASCII-8BIT") if expected.respond_to?(:force_encoding)
|
246
|
+
output.string.should == expected
|
247
|
+
end
|
248
|
+
|
249
|
+
it "should deserialize an empty dictionary" do
|
250
|
+
input = object_fixture("amf3-emptyDictionary.bin")
|
251
|
+
output = RocketAMF.deserialize(input, 3)
|
252
|
+
output.should == {}
|
253
|
+
end
|
254
|
+
|
255
|
+
it "should deserialize a dictionary" do
|
256
|
+
input = object_fixture("amf3-dictionary.bin")
|
257
|
+
output = RocketAMF.deserialize(input, 3)
|
258
|
+
|
259
|
+
keys = output.keys
|
260
|
+
keys.length.should == 2
|
261
|
+
obj_key, str_key = keys[0].is_a?(RocketAMF::Values::TypedHash) ? [keys[0], keys[1]] : [keys[1], keys[0]]
|
262
|
+
obj_key.type.should == 'org.rocketAMF.ASClass'
|
263
|
+
output[obj_key].should == "asdf2"
|
264
|
+
str_key.should == "bar"
|
265
|
+
output[str_key].should == "asdf1"
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
describe "and implementing the AMF Spec" do
|
270
|
+
it "should keep references of duplicate strings" do
|
271
|
+
input = object_fixture("amf3-stringRef.bin")
|
272
|
+
output = RocketAMF.deserialize(input, 3)
|
273
|
+
|
274
|
+
class StringCarrier; attr_accessor :str; end
|
275
|
+
foo = "foo"
|
276
|
+
bar = "str"
|
277
|
+
sc = StringCarrier.new
|
278
|
+
sc = {:str => foo}
|
279
|
+
output.should == [foo, bar, foo, bar, foo, sc]
|
280
|
+
end
|
281
|
+
|
282
|
+
it "should not reference the empty string" do
|
283
|
+
input = object_fixture("amf3-emptyStringRef.bin")
|
284
|
+
output = RocketAMF.deserialize(input, 3)
|
285
|
+
output.should == ["",""]
|
286
|
+
end
|
287
|
+
|
288
|
+
it "should keep references of duplicate dates" do
|
289
|
+
input = object_fixture("amf3-datesRef.bin")
|
290
|
+
output = RocketAMF.deserialize(input, 3)
|
291
|
+
|
292
|
+
output[0].should equal(output[1])
|
293
|
+
# Expected object:
|
294
|
+
# [DateTime.parse "1/1/1970", DateTime.parse "1/1/1970"]
|
295
|
+
end
|
296
|
+
|
297
|
+
it "should keep reference of duplicate objects" do
|
298
|
+
input = object_fixture("amf3-objRef.bin")
|
299
|
+
output = RocketAMF.deserialize(input, 3)
|
300
|
+
|
301
|
+
obj1 = {:foo => "bar"}
|
302
|
+
obj2 = {:foo => obj1[:foo]}
|
303
|
+
output.should == [[obj1, obj2], "bar", [obj1, obj2]]
|
304
|
+
end
|
305
|
+
|
306
|
+
it "should keep reference of duplicate object traits" do
|
307
|
+
RocketAMF::ClassMapper.define {|m| m.map :as => 'org.rocketAMF.ASClass', :ruby => 'RubyClass'}
|
308
|
+
|
309
|
+
input = object_fixture("amf3-traitRef.bin")
|
310
|
+
output = RocketAMF.deserialize(input, 3)
|
311
|
+
|
312
|
+
output[0].foo.should == "foo"
|
313
|
+
output[1].foo.should == "bar"
|
314
|
+
end
|
315
|
+
|
316
|
+
it "should keep references of duplicate arrays" do
|
317
|
+
input = object_fixture("amf3-arrayRef.bin")
|
318
|
+
output = RocketAMF.deserialize(input, 3)
|
319
|
+
|
320
|
+
a = [1,2,3]
|
321
|
+
b = %w{ a b c }
|
322
|
+
output.should == [a, b, a, b]
|
323
|
+
end
|
324
|
+
|
325
|
+
it "should not keep references of duplicate empty arrays unless the object_id matches" do
|
326
|
+
input = object_fixture("amf3-emptyArrayRef.bin")
|
327
|
+
output = RocketAMF.deserialize(input, 3)
|
328
|
+
|
329
|
+
a = []
|
330
|
+
b = []
|
331
|
+
output.should == [a,b,a,b]
|
332
|
+
end
|
333
|
+
|
334
|
+
it "should keep references of duplicate XML and XMLDocuments" do
|
335
|
+
input = object_fixture("amf3-xmlRef.bin")
|
336
|
+
output = RocketAMF.deserialize(input, 3)
|
337
|
+
output.should == ['<parent><child prop="test"/></parent>', '<parent><child prop="test"/></parent>']
|
338
|
+
end
|
339
|
+
|
340
|
+
it "should keep references of duplicate byte arrays" do
|
341
|
+
input = object_fixture("amf3-byteArrayRef.bin")
|
342
|
+
output = RocketAMF.deserialize(input, 3)
|
343
|
+
output[0].object_id.should == output[1].object_id
|
344
|
+
output[0].string.should == "ASDF"
|
345
|
+
end
|
346
|
+
|
347
|
+
it "should deserialize a deep object graph with circular references" do
|
348
|
+
input = object_fixture("amf3-graphMember.bin")
|
349
|
+
output = RocketAMF.deserialize(input, 3)
|
350
|
+
|
351
|
+
output[:children][0][:parent].should === output
|
352
|
+
output[:parent].should === nil
|
353
|
+
output[:children].length.should == 2
|
354
|
+
# Expected object:
|
355
|
+
# parent = Hash.new
|
356
|
+
# child1 = Hash.new
|
357
|
+
# child1[:parent] = parent
|
358
|
+
# child1[:children] = []
|
359
|
+
# child2 = Hash.new
|
360
|
+
# child2[:parent] = parent
|
361
|
+
# child2[:children] = []
|
362
|
+
# parent[:parent] = nil
|
363
|
+
# parent[:children] = [child1, child2]
|
364
|
+
end
|
365
|
+
end
|
366
|
+
end
|
367
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper.rb')
|
2
|
+
|
3
|
+
describe RocketAMF::Envelope do
|
4
|
+
describe 'deserializer' do
|
5
|
+
it "should handle remoting message from remote object" do
|
6
|
+
req = create_envelope("remotingMessage.bin")
|
7
|
+
|
8
|
+
req.headers.length.should == 0
|
9
|
+
req.messages.length.should == 1
|
10
|
+
message = req.messages[0].data
|
11
|
+
message.should be_a(RocketAMF::Values::RemotingMessage)
|
12
|
+
message.messageId.should == "FE4AF2BC-DD3C-5470-05D8-9971D51FF89D"
|
13
|
+
message.body.should == [true]
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should handle command message from remote object" do
|
17
|
+
req = create_envelope("commandMessage.bin")
|
18
|
+
|
19
|
+
req.headers.length.should == 0
|
20
|
+
req.messages.length.should == 1
|
21
|
+
message = req.messages[0].data
|
22
|
+
message.should be_a(RocketAMF::Values::CommandMessage)
|
23
|
+
message.messageId.should == "7B0ACE15-8D57-6AE5-B9D4-99C2D32C8246"
|
24
|
+
message.body.should == {}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "#deserialize" do
|
29
|
+
it "should parse the message envelope into a hash" do
|
30
|
+
parsed_amf = RocketAMF::Envelope.new.deserialize(create_envelope('commandMessage.bin').serialize)
|
31
|
+
parsed_amf[:amf_version].should == 3
|
32
|
+
parsed_amf[:headers].should == []
|
33
|
+
parsed_amf[:bodies].first[:target_uri].should == "null"
|
34
|
+
parsed_amf[:bodies].first[:response_uri].should == "/1"
|
35
|
+
puts parsed_amf[:bodies].first[:content].class.should == RocketAMF::Values::CommandMessage
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should return nil if nil is passed in" do
|
39
|
+
RocketAMF::Envelope.new.deserialize(nil).should be_nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe 'serializer' do
|
44
|
+
it "should serialize response when converted to string" do
|
45
|
+
res = RocketAMF::Envelope.new
|
46
|
+
res.should_receive(:serialize).and_return('serialized')
|
47
|
+
res.to_s.should == 'serialized'
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should serialize a simple call" do
|
51
|
+
res = RocketAMF::Envelope.new :amf_version => 3
|
52
|
+
res.messages << RocketAMF::Message.new('/1/onResult', '', 'hello')
|
53
|
+
|
54
|
+
expected = request_fixture('simple-response.bin')
|
55
|
+
res.serialize.should == expected
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should serialize a AcknowledgeMessage response" do
|
59
|
+
ak = RocketAMF::Values::AcknowledgeMessage.new
|
60
|
+
ak.clientId = "7B0ACE15-8D57-6AE5-B9D4-99C2D32C8246"
|
61
|
+
ak.messageId = "7B0ACE15-8D57-6AE5-B9D4-99C2D32C8246"
|
62
|
+
ak.timestamp = 0
|
63
|
+
res = RocketAMF::Envelope.new :amf_version => 3
|
64
|
+
res.messages << RocketAMF::Message.new('/1/onResult', '', ak)
|
65
|
+
|
66
|
+
expected = request_fixture('acknowledge-response.bin')
|
67
|
+
res.serialize.should == expected
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe 'message handler' do
|
72
|
+
it "should respond to ping command" do
|
73
|
+
res = RocketAMF::Envelope.new
|
74
|
+
req = create_envelope('commandMessage.bin')
|
75
|
+
res.each_method_call req do |method, args|
|
76
|
+
nil
|
77
|
+
end
|
78
|
+
|
79
|
+
res.messages.length.should == 1
|
80
|
+
res.messages[0].data.should be_a(RocketAMF::Values::AcknowledgeMessage)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should fail on unsupported command" do
|
84
|
+
res = RocketAMF::Envelope.new
|
85
|
+
req = create_envelope('unsupportedCommandMessage.bin')
|
86
|
+
res.each_method_call req do |method, args|
|
87
|
+
nil
|
88
|
+
end
|
89
|
+
|
90
|
+
res.messages.length.should == 1
|
91
|
+
res.messages[0].data.should be_a(RocketAMF::Values::ErrorMessage)
|
92
|
+
res.messages[0].data.faultString.should == "CommandMessage 10000 not implemented"
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should handle RemotingMessages properly" do
|
96
|
+
res = RocketAMF::Envelope.new
|
97
|
+
req = create_envelope('remotingMessage.bin')
|
98
|
+
res.each_method_call req do |method, args|
|
99
|
+
method.should == 'WritesController.save'
|
100
|
+
args.should == [true]
|
101
|
+
true
|
102
|
+
end
|
103
|
+
|
104
|
+
res.messages.length.should == 1
|
105
|
+
res.messages[0].data.should be_a(RocketAMF::Values::AcknowledgeMessage)
|
106
|
+
res.messages[0].data.body.should == true
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should catch exceptions properly" do
|
110
|
+
res = RocketAMF::Envelope.new
|
111
|
+
req = create_envelope('remotingMessage.bin')
|
112
|
+
res.each_method_call req do |method, args|
|
113
|
+
raise 'Error in call'
|
114
|
+
end
|
115
|
+
|
116
|
+
res.messages.length.should == 1
|
117
|
+
res.messages[0].data.should be_a(RocketAMF::Values::ErrorMessage)
|
118
|
+
res.messages[0].target_uri.should =~ /onStatus$/
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should not crash if source missing on RemotingMessage" do
|
122
|
+
res = RocketAMF::Envelope.new
|
123
|
+
req = create_envelope('remotingMessage.bin')
|
124
|
+
req.messages[0].data.instance_variable_set("@source", nil)
|
125
|
+
lambda {
|
126
|
+
res.each_method_call req do |method,args|
|
127
|
+
true
|
128
|
+
end
|
129
|
+
}.should_not raise_error
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|