ry / ebb fork watch download tarball
public
Description: web server
Homepage: http://ebb.rubyforge.org
Clone URL: git://github.com/ry/ebb.git
Ryan Dahl (author)
Mon Feb 25 08:32:09 -0800 2008
commit  02b6f662e1a4fec2a15807ce1d76e48aa9067b0b
tree    7669437a22a55651241741dd0d3542976e0d5032
parent  5b6d59ac6933821590e887157931a712a88e95c4
ebb / benchmark / test.rb
100644 114 lines (96 sloc) 2.772 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
require File.dirname(__FILE__) + '/../ruby_lib/ebb'
require 'test/unit'
require 'net/http'
require 'rubygems'
require 'ruby-debug'
Debugger.start
 
 
class EbbTest < Test::Unit::TestCase
  def setup
    @pid = fork do
      server = Ebb::Server.new(self, :port => 4044)
      server.start
    end
    sleep 0.5
  end
  
  def teardown
    Process.kill('KILL', @pid)
    sleep 0.5
  end
  
  def get(path)
    Net::HTTP.get_response(URI.parse("http://0.0.0.0:4044#{path}"))
  end
  
  def post(path, data)
    Net::HTTP.post_form(URI.parse("http://0.0.0.0:4044#{path}"), data)
  end
  
  @@responses = {}
  def call(env)
    commands = env['PATH_INFO'].split('/')
    
    if commands.include?('bytes')
      n = commands.last.to_i
      raise "bytes called with n <= 0" if n <= 0
      body = @@responses[n] || "C"*n
      status = 200
      
    elsif commands.include?('test_post_length')
      input_body = ""
      while chunk = env['rack.input'].read(512)
        input_body << chunk
      end
      
      content_length_header = env['HTTP_CONTENT_LENGTH'].to_i
      
      if content_length_header == input_body.length
        body = "Content-Length matches input length"
        status = 200
      else
        body = "Content-Length header is #{content_length_header} but body length is #{input_body.length}"
        # content_length = #{env['HTTP_CONTENT_LENGTH'].to_i}
        # input_body.length = #{input_body.length}"
        status = 500
      end
    
    else
      status = 404
      body = "Undefined url"
    end
    
    [status, {'Content-Type' => 'text/plain'}, body]
  end
  
  def test_get_bytes
    [1,10,1000].each do |i|
      response = get("/bytes/#{i}")
      assert_equal "#{'C'*i.to_i}", response.body
    end
  end
  
  def test_get_unknown
    response = get('/blah')
    assert_equal "Undefined url", response.body
  end
  
  def test_small_posts
    [1,10,321,123,1000].each do |i|
      response = post("/test_post_length", 'C'*i)
      assert_equal 200, response.code.to_i, response.body
    end
  end
  
  # this is rough but does detect errors
  def test_ab
    r = %x{ab -n 1000 -c 50 -q http://0.0.0.0:4044/bytes/123}
    assert r =~ /Requests per second:\s*(\d+)/, r
    assert $1.to_i > 100, r
  end
  
  def test_large_post
    response = post("/test_post_length", 'C'*1024*15)
    assert_equal 200, response.code.to_i, response.body
  end
end
 
#
# class SocketTest < Test::Unit::TestCase
# def test_socket_creation
# filename = '/tmp/ebb.socket'
# @pid = fork do
# server = Ebb::Server.new(TestApp.new, {:socket => filename})
# server.start
# end
# sleep(1)
# assert File.exists?(filename)
#
# Process.kill('KILL', @pid)
#
# assert !File.exists?(filename)
# end
# end