| // Copyright 2022 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 safefilepath_test |
| |
| import ( |
| "internal/safefilepath" |
| "os" |
| "path/filepath" |
| "runtime" |
| "testing" |
| ) |
| |
| type PathTest struct { |
| path, result string |
| } |
| |
| const invalid = "" |
| |
| var fspathtests = []PathTest{ |
| {".", "."}, |
| {"/a/b/c", "/a/b/c"}, |
| {"a\x00b", invalid}, |
| } |
| |
| var winreservedpathtests = []PathTest{ |
| {`a\b`, `a\b`}, |
| {`a:b`, `a:b`}, |
| {`a/b:c`, `a/b:c`}, |
| {`NUL`, `NUL`}, |
| {`./com1`, `./com1`}, |
| {`a/nul/b`, `a/nul/b`}, |
| } |
| |
| // Whether a reserved name with an extension is reserved or not varies by |
| // Windows version. |
| var winreservedextpathtests = []PathTest{ |
| {"nul.txt", "nul.txt"}, |
| {"a/nul.txt/b", "a/nul.txt/b"}, |
| } |
| |
| var plan9reservedpathtests = []PathTest{ |
| {`#c`, `#c`}, |
| } |
| |
| func TestFromFS(t *testing.T) { |
| switch runtime.GOOS { |
| case "windows": |
| if canWriteFile(t, "NUL") { |
| t.Errorf("can unexpectedly write a file named NUL on Windows") |
| } |
| if canWriteFile(t, "nul.txt") { |
| fspathtests = append(fspathtests, winreservedextpathtests...) |
| } else { |
| winreservedpathtests = append(winreservedpathtests, winreservedextpathtests...) |
| } |
| for i := range winreservedpathtests { |
| winreservedpathtests[i].result = invalid |
| } |
| for i := range fspathtests { |
| fspathtests[i].result = filepath.FromSlash(fspathtests[i].result) |
| } |
| case "plan9": |
| for i := range plan9reservedpathtests { |
| plan9reservedpathtests[i].result = invalid |
| } |
| } |
| tests := fspathtests |
| tests = append(tests, winreservedpathtests...) |
| tests = append(tests, plan9reservedpathtests...) |
| for _, test := range tests { |
| got, err := safefilepath.FromFS(test.path) |
| if (got == "") != (err != nil) { |
| t.Errorf(`FromFS(%q) = %q, %v; want "" only if err != nil`, test.path, got, err) |
| } |
| if got != test.result { |
| t.Errorf("FromFS(%q) = %q, %v; want %q", test.path, got, err, test.result) |
| } |
| } |
| } |
| |
| func canWriteFile(t *testing.T, name string) bool { |
| path := filepath.Join(t.TempDir(), name) |
| os.WriteFile(path, []byte("ok"), 0666) |
| b, _ := os.ReadFile(path) |
| return string(b) == "ok" |
| } |