aboutsummaryrefslogtreecommitdiff
path: root/src/vendor/github.com/julienschmidt/httprouter/path_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/vendor/github.com/julienschmidt/httprouter/path_test.go')
-rw-r--r--src/vendor/github.com/julienschmidt/httprouter/path_test.go92
1 files changed, 92 insertions, 0 deletions
diff --git a/src/vendor/github.com/julienschmidt/httprouter/path_test.go b/src/vendor/github.com/julienschmidt/httprouter/path_test.go
new file mode 100644
index 0000000..c4ceda5
--- /dev/null
+++ b/src/vendor/github.com/julienschmidt/httprouter/path_test.go
@@ -0,0 +1,92 @@
+// Copyright 2013 Julien Schmidt. All rights reserved.
+// Based on the path package, Copyright 2009 The Go Authors.
+// Use of this source code is governed by a BSD-style license that can be found
+// in the LICENSE file.
+
+package httprouter
+
+import (
+ "runtime"
+ "testing"
+)
+
+var cleanTests = []struct {
+ path, result string
+}{
+ // Already clean
+ {"/", "/"},
+ {"/abc", "/abc"},
+ {"/a/b/c", "/a/b/c"},
+ {"/abc/", "/abc/"},
+ {"/a/b/c/", "/a/b/c/"},
+
+ // missing root
+ {"", "/"},
+ {"abc", "/abc"},
+ {"abc/def", "/abc/def"},
+ {"a/b/c", "/a/b/c"},
+
+ // Remove doubled slash
+ {"//", "/"},
+ {"/abc//", "/abc/"},
+ {"/abc/def//", "/abc/def/"},
+ {"/a/b/c//", "/a/b/c/"},
+ {"/abc//def//ghi", "/abc/def/ghi"},
+ {"//abc", "/abc"},
+ {"///abc", "/abc"},
+ {"//abc//", "/abc/"},
+
+ // Remove . elements
+ {".", "/"},
+ {"./", "/"},
+ {"/abc/./def", "/abc/def"},
+ {"/./abc/def", "/abc/def"},
+ {"/abc/.", "/abc/"},
+
+ // Remove .. elements
+ {"..", "/"},
+ {"../", "/"},
+ {"../../", "/"},
+ {"../..", "/"},
+ {"../../abc", "/abc"},
+ {"/abc/def/ghi/../jkl", "/abc/def/jkl"},
+ {"/abc/def/../ghi/../jkl", "/abc/jkl"},
+ {"/abc/def/..", "/abc"},
+ {"/abc/def/../..", "/"},
+ {"/abc/def/../../..", "/"},
+ {"/abc/def/../../..", "/"},
+ {"/abc/def/../../../ghi/jkl/../../../mno", "/mno"},
+
+ // Combinations
+ {"abc/./../def", "/def"},
+ {"abc//./../def", "/def"},
+ {"abc/../../././../def", "/def"},
+}
+
+func TestPathClean(t *testing.T) {
+ for _, test := range cleanTests {
+ if s := CleanPath(test.path); s != test.result {
+ t.Errorf("CleanPath(%q) = %q, want %q", test.path, s, test.result)
+ }
+ if s := CleanPath(test.result); s != test.result {
+ t.Errorf("CleanPath(%q) = %q, want %q", test.result, s, test.result)
+ }
+ }
+}
+
+func TestPathCleanMallocs(t *testing.T) {
+ if testing.Short() {
+ t.Skip("skipping malloc count in short mode")
+ }
+ if runtime.GOMAXPROCS(0) > 1 {
+ t.Log("skipping AllocsPerRun checks; GOMAXPROCS>1")
+ return
+ }
+
+ for _, test := range cleanTests {
+ allocs := testing.AllocsPerRun(100, func() { CleanPath(test.result) })
+ if allocs > 0 {
+ t.Errorf("CleanPath(%q): %v allocs, want zero", test.result, allocs)
+ }
+ }
+}