github.com/ooni/oohttp@v0.7.2/internal/safefilepath/path_test.go (about)

     1  // Copyright 2022 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package safefilepath_test
     6  
     7  import (
     8  	"os"
     9  	"path/filepath"
    10  	"runtime"
    11  	"testing"
    12  
    13  	"github.com/ooni/oohttp/internal/safefilepath"
    14  )
    15  
    16  type PathTest struct {
    17  	path, result string
    18  }
    19  
    20  const invalid = ""
    21  
    22  var fspathtests = []PathTest{
    23  	{".", "."},
    24  	{"/a/b/c", "/a/b/c"},
    25  	{"a\x00b", invalid},
    26  }
    27  
    28  var winreservedpathtests = []PathTest{
    29  	{`a\b`, `a\b`},
    30  	{`a:b`, `a:b`},
    31  	{`a/b:c`, `a/b:c`},
    32  	{`NUL`, `NUL`},
    33  	{`./com1`, `./com1`},
    34  	{`a/nul/b`, `a/nul/b`},
    35  }
    36  
    37  // Whether a reserved name with an extension is reserved or not varies by
    38  // Windows version.
    39  var winreservedextpathtests = []PathTest{
    40  	{"nul.txt", "nul.txt"},
    41  	{"a/nul.txt/b", "a/nul.txt/b"},
    42  }
    43  
    44  var plan9reservedpathtests = []PathTest{
    45  	{`#c`, `#c`},
    46  }
    47  
    48  func TestFromFS(t *testing.T) {
    49  	switch runtime.GOOS {
    50  	case "windows":
    51  		if canWriteFile(t, "NUL") {
    52  			t.Errorf("can unexpectedly write a file named NUL on Windows")
    53  		}
    54  		if canWriteFile(t, "nul.txt") {
    55  			fspathtests = append(fspathtests, winreservedextpathtests...)
    56  		} else {
    57  			winreservedpathtests = append(winreservedpathtests, winreservedextpathtests...)
    58  		}
    59  		for i := range winreservedpathtests {
    60  			winreservedpathtests[i].result = invalid
    61  		}
    62  		for i := range fspathtests {
    63  			fspathtests[i].result = filepath.FromSlash(fspathtests[i].result)
    64  		}
    65  	case "plan9":
    66  		for i := range plan9reservedpathtests {
    67  			plan9reservedpathtests[i].result = invalid
    68  		}
    69  	}
    70  	tests := fspathtests
    71  	tests = append(tests, winreservedpathtests...)
    72  	tests = append(tests, plan9reservedpathtests...)
    73  	for _, test := range tests {
    74  		got, err := safefilepath.FromFS(test.path)
    75  		if (got == "") != (err != nil) {
    76  			t.Errorf(`FromFS(%q) = %q, %v; want "" only if err != nil`, test.path, got, err)
    77  		}
    78  		if got != test.result {
    79  			t.Errorf("FromFS(%q) = %q, %v; want %q", test.path, got, err, test.result)
    80  		}
    81  	}
    82  }
    83  
    84  func canWriteFile(t *testing.T, name string) bool {
    85  	path := filepath.Join(t.TempDir(), name)
    86  	os.WriteFile(path, []byte("ok"), 0666)
    87  	b, _ := os.ReadFile(path)
    88  	return string(b) == "ok"
    89  }