1 # Copyright (c) 2005 Zed A. Shaw
2 # You can redistribute it and/or modify it under the same terms as Ruby.
4 # Additional work donated by contributors. See http://mongrel.rubyforge.org/attributions.html
5 # for more information.
7 require 'test/test_helper'
11 class URIClassifierTest < Test::Unit::TestCase
14 uri_classifier = URIClassifier.new
15 uri_classifier.register("/test", 1)
17 script_name, path_info, value = uri_classifier.resolve("/test")
19 assert_equal "/test", script_name
22 def test_root_handler_only
23 uri_classifier = URIClassifier.new
24 uri_classifier.register("/", 1)
26 script_name, path_info, value = uri_classifier.resolve("/test")
28 assert_equal "/", script_name
29 assert_equal "/test", path_info
32 def test_uri_prefix_ops
33 test = "/pre/fix/test"
36 uri_classifier = URIClassifier.new
37 uri_classifier.register(prefix,1)
39 script_name, path_info, value = uri_classifier.resolve(prefix)
40 script_name, path_info, value = uri_classifier.resolve(test)
42 assert_equal prefix, script_name
43 assert_equal test[script_name.length .. -1], path_info
45 assert uri_classifier.inspect
46 assert_equal prefix, uri_classifier.uris[0]
50 test = "/cant/find/me"
51 uri_classifier = URIClassifier.new
52 uri_classifier.register(test, 1)
54 script_name, path_info, value = uri_classifier.resolve("/nope/not/here")
55 assert_nil script_name
61 uri_classifier = URIClassifier.new
63 uri_classifier.register("/test", 1)
67 uri_classifier.register("/test", 1)
76 uri_classifier.register("", 1)
85 def test_register_unregister
86 uri_classifier = URIClassifier.new
89 uri_classifier.register("/stuff", 1)
90 value = uri_classifier.unregister("/stuff")
94 uri_classifier.register("/things",1)
95 script_name, path_info, value = uri_classifier.resolve("/things")
98 uri_classifier.unregister("/things")
99 script_name, path_info, value = uri_classifier.resolve("/things")
105 def test_uri_branching
106 uri_classifier = URIClassifier.new
107 uri_classifier.register("/test", 1)
108 uri_classifier.register("/test/this",2)
110 script_name, path_info, handler = uri_classifier.resolve("/test")
111 script_name, path_info, handler = uri_classifier.resolve("/test/that")
112 assert_equal "/test", script_name, "failed to properly find script off branch portion of uri"
113 assert_equal "/that", path_info
114 assert_equal 1, handler, "wrong result for branching uri"
117 def test_all_prefixing
118 tests = ["/test","/test/that","/test/this"]
119 uri = "/test/this/that"
120 uri_classifier = URIClassifier.new
125 uri_classifier.register(current, c)
129 # Try to resolve everything with no asserts as a fuzzing
130 tests.each do |prefix|
132 prefix.each_byte do |c|
134 script_name, path_info, handler = uri_classifier.resolve(current)
141 # Assert that we find stuff
143 script_name, path_info, handler = uri_classifier.resolve(t)
147 # Assert we don't find stuff
148 script_name, path_info, handler = uri_classifier.resolve("chicken")
150 assert_nil script_name
155 # Verifies that a root mounted ("/") handler resolves
156 # such that path info matches the original URI.
157 # This is needed to accommodate real usage of handlers.
158 def test_root_mounted
159 uri_classifier = URIClassifier.new
161 path = "/this/is/a/test"
163 uri_classifier.register(root, 1)
165 script_name, path_info, handler = uri_classifier.resolve(root)
166 assert_equal 1, handler
167 assert_equal root, path_info
168 assert_equal root, script_name
170 script_name, path_info, handler = uri_classifier.resolve(path)
171 assert_equal path, path_info
172 assert_equal root, script_name
173 assert_equal 1, handler
176 # Verifies that a root mounted ("/") handler
177 # is the default point, doesn't matter the order we use
178 # to register the URIs
179 def test_classifier_order
180 tests = ["/before", "/way_past"]
184 uri_classifier = URIClassifier.new
185 uri_classifier.register(path, 1)
186 uri_classifier.register(root, 2)
189 script_name, path_info, handler = uri_classifier.resolve(uri)
190 assert_equal root, script_name, "#{uri} did not resolve to #{root}"
191 assert_equal uri, path_info
192 assert_equal 2, handler
197 # Eventually we will have a suite of benchmarks instead of lamely installing a test
201 # This URI set should favor a TST. Both versions increase linearly until you hit 14
202 # URIs, then the TST flattens out.
205 /dag /dig /digbark /dog /dogbark /dog/bark /dug /dugbarking /puppy
206 /c /cat /cat/tree /cat/tree/mulberry /cats /cot /cot/tree/mulberry /kitty /kittycat
207 # /eag /eig /eigbark /eog /eogbark /eog/bark /eug /eugbarking /iuppy
208 # /f /fat /fat/tree /fat/tree/mulberry /fats /fot /fot/tree/mulberry /jitty /jittyfat
209 # /gag /gig /gigbark /gog /gogbark /gog/bark /gug /gugbarking /kuppy
210 # /h /hat /hat/tree /hat/tree/mulberry /hats /hot /hot/tree/mulberry /litty /littyhat
211 # /ceag /ceig /ceigbark /ceog /ceogbark /ceog/cbark /ceug /ceugbarking /ciuppy
212 # /cf /cfat /cfat/ctree /cfat/ctree/cmulberry /cfats /cfot /cfot/ctree/cmulberry /cjitty /cjittyfat
213 # /cgag /cgig /cgigbark /cgog /cgogbark /cgog/cbark /cgug /cgugbarking /ckuppy
214 # /ch /chat /chat/ctree /chat/ctree/cmulberry /chats /chot /chot/ctree/cmulberry /citty /cittyhat
229 /cat/tree/mulberry/tree
237 @classifier = URIClassifier.new
239 @classifier.register(uri, 1)
242 puts "#{@uris.size} URIs / #{@requests.size * 10000} requests"
246 # require 'ruby-prof'
247 # profile = RubyProf.profile do
249 @requests.each do |request|
250 @classifier.resolve(request)
254 # File.open("profile.html", 'w') { |file| RubyProf::GraphHtmlPrinter.new(profile).print(file, 0) }