1 // Copyright 2012 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 os_test 6 7 import ( 8 "fmt" 9 "io/ioutil" 10 "os" 11 "path/filepath" 12 "testing" 13 ) 14 15 func TestErrIsExist(t *testing.T) { 16 f, err := ioutil.TempFile("", "_Go_ErrIsExist") 17 if err != nil { 18 t.Fatalf("open ErrIsExist tempfile: %s", err) 19 return 20 } 21 defer os.Remove(f.Name()) 22 defer f.Close() 23 f2, err := os.OpenFile(f.Name(), os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) 24 if err == nil { 25 f2.Close() 26 t.Fatal("Open should have failed") 27 return 28 } 29 if s := checkErrorPredicate("os.IsExist", os.IsExist, err); s != "" { 30 t.Fatal(s) 31 return 32 } 33 } 34 35 func testErrNotExist(name string) string { 36 f, err := os.Open(name) 37 if err == nil { 38 f.Close() 39 return "Open should have failed" 40 } 41 if s := checkErrorPredicate("os.IsNotExist", os.IsNotExist, err); s != "" { 42 return s 43 } 44 45 err = os.Chdir(name) 46 if err == nil { 47 return "Chdir should have failed" 48 } 49 if s := checkErrorPredicate("os.IsNotExist", os.IsNotExist, err); s != "" { 50 return s 51 } 52 return "" 53 } 54 55 func TestErrIsNotExist(t *testing.T) { 56 tmpDir, err := ioutil.TempDir("", "_Go_ErrIsNotExist") 57 if err != nil { 58 t.Fatalf("create ErrIsNotExist tempdir: %s", err) 59 return 60 } 61 defer os.RemoveAll(tmpDir) 62 63 name := filepath.Join(tmpDir, "NotExists") 64 if s := testErrNotExist(name); s != "" { 65 t.Fatal(s) 66 return 67 } 68 69 name = filepath.Join(name, "NotExists2") 70 if s := testErrNotExist(name); s != "" { 71 t.Fatal(s) 72 return 73 } 74 } 75 76 func checkErrorPredicate(predName string, pred func(error) bool, err error) string { 77 if !pred(err) { 78 return fmt.Sprintf("%s does not work as expected for %#v", predName, err) 79 } 80 return "" 81 } 82 83 var isExistTests = []struct { 84 err error 85 is bool 86 isnot bool 87 }{ 88 {&os.PathError{Err: os.ErrInvalid}, false, false}, 89 {&os.PathError{Err: os.ErrPermission}, false, false}, 90 {&os.PathError{Err: os.ErrExist}, true, false}, 91 {&os.PathError{Err: os.ErrNotExist}, false, true}, 92 {&os.LinkError{Err: os.ErrInvalid}, false, false}, 93 {&os.LinkError{Err: os.ErrPermission}, false, false}, 94 {&os.LinkError{Err: os.ErrExist}, true, false}, 95 {&os.LinkError{Err: os.ErrNotExist}, false, true}, 96 {nil, false, false}, 97 } 98 99 func TestIsExist(t *testing.T) { 100 for _, tt := range isExistTests { 101 if is := os.IsExist(tt.err); is != tt.is { 102 t.Errorf("os.IsExist(%T %v) = %v, want %v", tt.err, tt.err, is, tt.is) 103 } 104 if isnot := os.IsNotExist(tt.err); isnot != tt.isnot { 105 t.Errorf("os.IsNotExist(%T %v) = %v, want %v", tt.err, tt.err, isnot, tt.isnot) 106 } 107 } 108 } 109 110 func TestErrPathNUL(t *testing.T) { 111 f, err := ioutil.TempFile("", "_Go_ErrPathNUL\x00") 112 if err == nil { 113 f.Close() 114 t.Fatal("TempFile should have failed") 115 } 116 f, err = ioutil.TempFile("", "_Go_ErrPathNUL") 117 if err != nil { 118 t.Fatalf("open ErrPathNUL tempfile: %s", err) 119 } 120 defer os.Remove(f.Name()) 121 defer f.Close() 122 f2, err := os.OpenFile(f.Name(), os.O_RDWR, 0600) 123 if err != nil { 124 t.Fatalf("open ErrPathNUL: %s", err) 125 } 126 f2.Close() 127 f2, err = os.OpenFile(f.Name()+"\x00", os.O_RDWR, 0600) 128 if err == nil { 129 f2.Close() 130 t.Fatal("Open should have failed") 131 } 132 } 133