root/trunk/tests/test_send_file.rb

Revision 796, 5.2 kB (checked in by raggi, 9 months ago)

Fixed fastfilereaderext tests for CI

  • Property svn:keywords set to Id
Line 
1 # $Id$
2 #
3 # Author:: Francis Cianfrocca (gmail: blackhedd)
4 # Homepage::  http://rubyeventmachine.com
5 # Date:: 8 April 2006
6 #
7 # See EventMachine and EventMachine::Connection for documentation and
8 # usage examples.
9 #
10 #----------------------------------------------------------------------------
11 #
12 # Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
13 # Gmail: blackhedd
14 #
15 # This program is free software; you can redistribute it and/or modify
16 # it under the terms of either: 1) the GNU General Public License
17 # as published by the Free Software Foundation; either version 2 of the
18 # License, or (at your option) any later version; or 2) Ruby's License.
19 #
20 # See the file COPYING for complete licensing information.
21 #
22 #---------------------------------------------------------------------------
23 #
24 #
25 #
26
27 $:.unshift "../lib"
28 require 'eventmachine'
29 require 'socket'
30 require 'test/unit'
31
32 class TestSendFile < Test::Unit::TestCase
33
34         module TestModule
35                 def post_init
36                         send_file_data TestFilename
37                         close_connection_after_writing
38                 end
39         end
40        
41         module TestClient
42           def data_to(&blk)
43             @data_to = blk
44     end
45    
46     def receive_data(data)
47       @data_to.call(data) if @data_to
48     end
49    
50     def unbind
51       EM.stop
52     end
53   end
54
55         TestHost = "0.0.0.0"
56         TestPort = 9055
57         TestFilename = "./xxxxxx"
58
59         def setup
60         end
61
62         def teardown
63                 File.unlink( TestFilename ) if File.exist?( TestFilename )
64         end
65
66         def test_send_file
67                 File.open( TestFilename, "w" ) {|f|
68                         f << ("A" * 5000)
69                 }
70
71                 data = ''
72
73                 EM.run {
74                         EM.start_server TestHost, TestPort, TestModule
75                         EM.add_timer(2) {EM.stop} # avoid hanging in case of error
76                        
77                         EM.connect TestHost, TestPort, TestClient do |c|
78                           c.data_to { |d| data << d }
79                   end
80                 }
81
82                 assert_equal( "A" * 5000, data )
83                 File.unlink TestFilename
84         end
85
86         # EventMachine::Connection#send_file_data has a strict upper limit on the filesize it will work with.
87         def test_send_large_file
88                 File.open( TestFilename, "w" ) {|f|
89                         f << ("A" * 1000000)
90                 }
91
92                 data = ''
93
94                 ex_class = RUBY_PLATFORM == 'java' ? NativeException : RuntimeError
95     assert_raise( ex_class ) {
96                         EM.run {
97                                 EM.start_server TestHost, TestPort, TestModule
98                                 EM.add_timer(2) {EM.stop} # avoid hanging in case of error
99                         EM.connect TestHost, TestPort, TestClient do |c|
100                           c.data_to { |d| data << d }
101                   end
102                         }
103                 }
104
105                 File.unlink TestFilename
106         end
107
108
109         module StreamTestModule
110                 def post_init
111                         EM::Deferrable.future( stream_file_data(TestFilename)) {
112                                 close_connection_after_writing
113                         }
114                 end
115         end
116
117         module ChunkStreamTestModule
118                 def post_init
119                         EM::Deferrable.future( stream_file_data(TestFilename, :http_chunks=>true)) {
120                                 close_connection_after_writing
121                         }
122                 end
123         end
124
125         def test_stream_file_data
126                 File.open( TestFilename, "w" ) {|f|
127                         f << ("A" * 1000)
128                 }
129
130                 data = ''
131
132                 EM.run {
133                         EM.start_server TestHost, TestPort, StreamTestModule
134                         EM.add_timer(2) {EM.stop} # avoid hanging in case of error
135                         EM.connect TestHost, TestPort, TestClient do |c|
136                           c.data_to { |d| data << d }
137                   end
138                 }
139
140                 assert_equal( "A" * 1000, data )
141
142                 File.unlink TestFilename
143         end
144
145         def test_stream_chunked_file_data
146                 File.open( TestFilename, "w" ) {|f|
147                         f << ("A" * 1000)
148                 }
149
150                 data = ''
151
152                 EM.run {
153                         EM.start_server TestHost, TestPort, ChunkStreamTestModule
154                         EM.add_timer(2) {EM.stop} # avoid hanging in case of error
155                         EM.connect TestHost, TestPort, TestClient do |c|
156                           c.data_to { |d| data << d }
157                   end
158                 }
159
160                 assert_equal( "3e8\r\n#{"A" * 1000}\r\n0\r\n\r\n", data )
161
162                 File.unlink TestFilename
163         end
164
165         module BadFileTestModule
166                 def post_init
167                         de = stream_file_data( TestFilename+"..." )
168                         de.errback {|msg|
169                                 send_data msg
170                                 close_connection_after_writing
171                         }
172                 end
173         end
174         def test_stream_bad_file
175                 data = ''
176                 EM.run {
177                         EM.start_server TestHost, TestPort, BadFileTestModule
178                         EM.add_timer(2) {EM.stop} # avoid hanging in case of error
179                         EM.connect TestHost, TestPort, TestClient do |c|
180                           c.data_to { |d| data << d }
181                   end
182                 }
183
184                 assert_equal( "file not found", data )
185         end
186
187         def test_stream_large_file_data
188           begin
189             require 'fastfilereaderext'
190     rescue LoadError
191       $stderr.puts "no fastfilereaderext, not running test_stream_large_file_data"
192       return
193     end
194                 File.open( TestFilename, "w" ) {|f|
195                         f << ("A" * 10000)
196                 }
197
198                 data = ''
199
200                 EM.run {
201                         EM.start_server TestHost, TestPort, StreamTestModule
202                         EM.add_timer(2) {EM.stop} # avoid hanging in case of error
203                         EM.connect TestHost, TestPort, TestClient do |c|
204                           c.data_to { |d| data << d }
205                   end
206                 }
207
208                 assert_equal( "A" * 10000, data )
209
210                 File.unlink TestFilename
211         end
212
213         def test_stream_large_chunked_file_data
214           begin
215             require 'fastfilereaderext'
216     rescue LoadError
217       $stderr.puts "no fastfilereaderext, not running test_stream_large_chunked_file_data"
218       return
219     end
220                 File.open( TestFilename, "w" ) {|f|
221                         f << ("A" * 100000)
222                 }
223
224                 data = ''
225
226                 EM.run {
227                         EM.start_server TestHost, TestPort, ChunkStreamTestModule
228                         EM.add_timer(2) {EM.stop} # avoid hanging in case of error
229                         EM.connect TestHost, TestPort, TestClient do |c|
230                           c.data_to { |d| data << d }
231                   end
232                 }
233
234                 expected = [
235                         "4000\r\n#{"A" * 16384}\r\n" * 6,
236                         "6a0\r\n#{"A" * 0x6a0}\r\n",
237                         "0\r\n\r\n"
238                 ].join
239                 assert_equal( expected, data )
240
241                 File.unlink TestFilename
242         end
243
244 end
245
Note: See TracBrowser for help on using the browser.