about summary refs log tree commit homepage
path: root/test
diff options
context:
space:
mode:
authorevanweaver <evanweaver@19e92222-5c0b-0410-8929-a290d50e31e9>2007-10-17 03:27:51 +0000
committerevanweaver <evanweaver@19e92222-5c0b-0410-8929-a290d50e31e9>2007-10-17 03:27:51 +0000
commit3c411489d16076c2058b904b6b3d7a674643c754 (patch)
tree9b23a1d95ca50cf3fba0e8efa2c72242ad0098fe /test
parent85a3ee1b92d45ef2b4f4288bea156830c24b2702 (diff)
downloadunicorn-3c411489d16076c2058b904b6b3d7a674643c754.tar.gz
git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@662 19e92222-5c0b-0410-8929-a290d50e31e9
Diffstat (limited to 'test')
-rw-r--r--test/java/testParser.rb21
-rw-r--r--test/java/testParserImpl.rb22
-rw-r--r--test/java/test_http11.rb119
-rw-r--r--test/java/test_performance.rb21
4 files changed, 183 insertions, 0 deletions
diff --git a/test/java/testParser.rb b/test/java/testParser.rb
new file mode 100644
index 0000000..476d1b3
--- /dev/null
+++ b/test/java/testParser.rb
@@ -0,0 +1,21 @@
+
+require 'http11'
+
+request_data = "GET /events/show/2 HTTP/1.1\r\n\r\nfield1=value1&field2=value2&field3=value3"
+request_data += ("X" * (16 * 1024 - request_data.size))
+
+parser = Mongrel::HttpParser.new
+parser.reset
+params = {}
+nread = parser.execute(params, request_data, 0)
+puts "finished=#{parser.finished?}"
+nread = parser.execute(params, request_data, nread)
+
+puts "params="
+params.each {|k,v| puts "  #{k} = #{v}"}
+puts "nread=#{nread}"
+puts "error?=#{parser.error?}"
+puts "finished=#{parser.finished?}"
+puts "nread=#{parser.nread}"
+
+puts request_data[parser.nread..-1]
diff --git a/test/java/testParserImpl.rb b/test/java/testParserImpl.rb
new file mode 100644
index 0000000..58ef2c7
--- /dev/null
+++ b/test/java/testParserImpl.rb
@@ -0,0 +1,22 @@
+require "java"
+
+include_class "org.jruby.mongrel.HttpParserImpl"
+
+request_data = "GET /events/show/2 HTTP/1.1\r\n\r\nfield1=value1&field2=value2&field3=value3"
+request_data += ("X" * (16 * 1024 - request_data.size))
+
+parser = HttpParser.new
+parser.reset
+params = {}
+nread = parser.execute(params, request_data)
+puts "finished=#{parser.finished?}"
+nread = parser.execute(params, request_data)
+
+puts "params="
+params.each {|k,v| puts "  #{k} = #{v}"}
+puts "nread=#{nread}"
+puts "error?=#{parser.error?}"
+puts "finished=#{parser.finished?}"
+puts "nread=#{parser.nread}"
+
+puts request_data[parser.nread..-1]
diff --git a/test/java/test_http11.rb b/test/java/test_http11.rb
new file mode 100644
index 0000000..df4e914
--- /dev/null
+++ b/test/java/test_http11.rb
@@ -0,0 +1,119 @@
+# Original work by Zed A. Shaw
+
+require 'test/unit'
+require 'http11'
+require 'benchmark'
+require 'digest/sha1'
+
+include Mongrel
+
+class HttpParserTest < Test::Unit::TestCase
+    
+  def test_parse_simple
+    $stderr.puts "test_parse_simple"
+    parser = HttpParser.new
+    req = {}
+    http = "GET / HTTP/1.1\r\n\r\n"
+    nread = parser.execute(req, http, 0)
+    assert nread == http.length, "Failed to parse the full HTTP request"
+    assert parser.finished?, "Parser didn't finish"
+    assert !parser.error?, "Parser had error"
+    assert nread == parser.nread, "Number read returned from execute does not match"
+    parser.reset
+    assert parser.nread == 0, "Number read after reset should be 0"
+  end
+  
+  
+  def test_parse_error
+    $stderr.puts "test_parse_error"
+    parser = HttpParser.new
+    req = {}
+    bad_http = "GET / SsUTF/1.1"
+
+    error = false
+    begin
+      nread = parser.execute(req, bad_http, 0)
+    rescue => details
+      error = true
+    end
+
+    assert error, "failed to throw exception"
+    assert !parser.finished?, "Parser shouldn't be finished"
+    assert parser.error?, "Parser SHOULD have error"
+  end
+
+  # lame random garbage maker
+  def rand_data(min, max, readable=true)
+    count = min + ((rand(max)+1) *10).to_i
+    res = count.to_s + "/"
+    
+    if readable
+      res << Digest::SHA1.hexdigest(rand(count * 1000).to_s) * (count / 40)
+    else
+      res << Digest::SHA1.digest(rand(count * 1000).to_s) * (count / 20)
+    end
+
+    return res
+  end
+  
+
+  def test_horrible_queries
+    $stderr.puts "test_horrible_queries"
+    parser = HttpParser.new
+
+    $stderr.puts "test_horrible_queries.first"
+    # first verify that large random get requests fail
+    20.times do |c|
+      $stderr.write '.'
+      get = "GET /#{rand_data(1024, 1024+(c*1024))} HTTP/1.1\r\n"
+      assert_raises Mongrel::HttpParserError do
+        parser.execute({}, get, 0)
+        parser.reset
+      end
+    end
+
+    $stderr.puts "test_horrible_queries.second"
+    # then that large header names are caught
+    20.times do |c|
+      $stderr.write '.'
+      get = "GET /#{rand_data(10,120)} HTTP/1.1\r\nX-#{rand_data(1024, 1024+(c*1024))}: Test\r\n\r\n"
+      assert_raises Mongrel::HttpParserError do
+        parser.execute({}, get, 0)
+        parser.reset
+      end
+    end
+
+    $stderr.puts "test_horrible_queries.third"
+    # then that large mangled field values are caught
+    20.times do |c|
+      $stderr.write '.'
+      get = "GET /#{rand_data(10,120)} HTTP/1.1\r\nX-Test: #{rand_data(1024, 1024+(c*1024), false)}\r\n\r\n"
+      assert_raises Mongrel::HttpParserError do
+        parser.execute({}, get, 0)
+        parser.reset
+      end
+    end
+
+    $stderr.puts "test_horrible_queries.fourth"
+    # then large headers are rejected too
+    get = "GET /#{rand_data(10,120)} HTTP/1.1\r\n"
+    get << "X-Test: test\r\n" * (80 * 1024)
+    assert_raises Mongrel::HttpParserError do
+      parser.execute({}, get, 0)
+      parser.reset
+    end
+
+    $stderr.puts "test_horrible_queries.fifth"
+    # finally just that random garbage gets blocked all the time
+    20.times do |c|
+      $stderr.write '.'
+      get = "GET #{rand_data(1024, 1024+(c*1024), false)} #{rand_data(1024, 1024+(c*1024), false)}\r\n\r\n"
+      assert_raises Mongrel::HttpParserError do
+        parser.execute({}, get, 0)
+        parser.reset
+      end
+    end
+
+  end
+end
+
diff --git a/test/java/test_performance.rb b/test/java/test_performance.rb
new file mode 100644
index 0000000..2bed6f2
--- /dev/null
+++ b/test/java/test_performance.rb
@@ -0,0 +1,21 @@
+require 'http11'
+
+include Mongrel
+
+def one_test(pr)
+  req = {}
+  http = "GET / HTTP/1.1\r\n\r\n"
+  nread = pr.execute(req, http, 0)
+  pr.reset
+end
+
+parser = HttpParser.new
+
+before = Time.now
+for n in (1..100000)
+  one_test(parser)
+end
+after = Time.now
+
+puts "Doing 100000 parses took #{after-before} seconds"
+