| // Copyright 2009 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package http | |
| import ( | |
| "fmt"; | |
| "http"; | |
| "os"; | |
| "reflect"; | |
| "testing"; | |
| ) | |
| // TODO(rsc): | |
| // test URLUnescape | |
| // test URLEscape | |
| // test ParseURL | |
| type URLTest struct { | |
| in string; | |
| out *URL; | |
| } | |
| var urltests = []URLTest { | |
| // no path | |
| URLTest{ | |
| "http://www.google.com", | |
| &URL{ | |
| "http://www.google.com", | |
| "http", "//www.google.com", | |
| "www.google.com", "", "www.google.com", | |
| "", "", "" | |
| } | |
| }, | |
| // path | |
| URLTest{ | |
| "http://www.google.com/", | |
| &URL{ | |
| "http://www.google.com/", | |
| "http", "//www.google.com/", | |
| "www.google.com", "", "www.google.com", | |
| "/", "", "" | |
| } | |
| }, | |
| // user | |
| URLTest{ | |
| "ftp://webmaster@www.google.com/", | |
| &URL{ | |
| "ftp://webmaster@www.google.com/", | |
| "ftp", "//webmaster@www.google.com/", | |
| "webmaster@www.google.com", "webmaster", "www.google.com", | |
| "/", "", "" | |
| } | |
| }, | |
| // query | |
| URLTest{ | |
| "http://www.google.com/?q=go+language", | |
| &URL{ | |
| "http://www.google.com/?q=go+language", | |
| "http", "//www.google.com/?q=go+language", | |
| "www.google.com", "", "www.google.com", | |
| "/", "q=go+language", "" | |
| } | |
| }, | |
| // path without /, so no query parsing | |
| URLTest{ | |
| "http:www.google.com/?q=go+language", | |
| &URL{ | |
| "http:www.google.com/?q=go+language", | |
| "http", "www.google.com/?q=go+language", | |
| "", "", "", | |
| "www.google.com/?q=go+language", "", "" | |
| } | |
| }, | |
| // non-authority | |
| URLTest{ | |
| "mailto:/webmaster@golang.org", | |
| &URL{ | |
| "mailto:/webmaster@golang.org", | |
| "mailto", "/webmaster@golang.org", | |
| "", "", "", | |
| "/webmaster@golang.org", "", "" | |
| } | |
| }, | |
| // non-authority | |
| URLTest{ | |
| "mailto:webmaster@golang.org", | |
| &URL{ | |
| "mailto:webmaster@golang.org", | |
| "mailto", "webmaster@golang.org", | |
| "", "", "", | |
| "webmaster@golang.org", "", "" | |
| } | |
| }, | |
| } | |
| var urlnofragtests = []URLTest { | |
| URLTest{ | |
| "http://www.google.com/?q=go+language#foo", | |
| &URL{ | |
| "http://www.google.com/?q=go+language#foo", | |
| "http", "//www.google.com/?q=go+language#foo", | |
| "www.google.com", "", "www.google.com", | |
| "/", "q=go+language#foo", "" | |
| } | |
| }, | |
| } | |
| var urlfragtests = []URLTest { | |
| URLTest{ | |
| "http://www.google.com/?q=go+language#foo", | |
| &URL{ | |
| "http://www.google.com/?q=go+language", | |
| "http", "//www.google.com/?q=go+language", | |
| "www.google.com", "", "www.google.com", | |
| "/", "q=go+language", "foo" | |
| } | |
| }, | |
| } | |
| // more useful string for debugging than fmt's struct printer | |
| func ufmt(u *URL) string { | |
| return fmt.Sprintf("%q, %q, %q, %q, %q, %q, %q, %q, %q", | |
| u.Raw, u.Scheme, u.RawPath, u.Authority, u.Userinfo, | |
| u.Host, u.Path, u.Query, u.Fragment); | |
| } | |
| func DoTest(t *testing.T, parse func(string) (*URL, os.Error), name string, tests []URLTest) { | |
| for i, tt := range tests { | |
| u, err := parse(tt.in); | |
| if err != nil { | |
| t.Errorf("%s(%q) returned error %s", name, tt.in, err); | |
| continue; | |
| } | |
| if !reflect.DeepEqual(u, tt.out) { | |
| t.Errorf("%s(%q):\n\thave %v\n\twant %v\n", | |
| name, tt.in, ufmt(u), ufmt(tt.out)); | |
| } | |
| } | |
| } | |
| func TestParseURL(t *testing.T) { | |
| DoTest(t, ParseURL, "ParseURL", urltests); | |
| DoTest(t, ParseURL, "ParseURL", urlnofragtests); | |
| } | |
| func TestParseURLReference(t *testing.T) { | |
| DoTest(t, ParseURLReference, "ParseURLReference", urltests); | |
| DoTest(t, ParseURLReference, "ParseURLReference", urlfragtests); | |
| } | |
| func DoTestString(t *testing.T, parse func(string) (*URL, os.Error), name string, tests []URLTest) { | |
| for i, tt := range tests { | |
| u, err := parse(tt.in); | |
| if err != nil { | |
| t.Errorf("%s(%q) returned error %s", name, tt.in, err); | |
| continue; | |
| } | |
| s := u.String(); | |
| if s != tt.in { | |
| t.Errorf("%s(%q).String() == %q", tt.in, s); | |
| } | |
| } | |
| } | |
| func TestURLString(t *testing.T) { | |
| DoTestString(t, ParseURL, "ParseURL", urltests); | |
| DoTestString(t, ParseURL, "ParseURL", urlfragtests); | |
| DoTestString(t, ParseURL, "ParseURL", urlnofragtests); | |
| DoTestString(t, ParseURLReference, "ParseURLReference", urltests); | |
| DoTestString(t, ParseURLReference, "ParseURLReference", urlfragtests); | |
| DoTestString(t, ParseURLReference, "ParseURLReference", urlnofragtests); | |
| } |