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.
16 func TestErrIsExist(t
*testing
.T
) {
17 f
, err
:= os
.CreateTemp("", "_Go_ErrIsExist")
19 t
.Fatalf("open ErrIsExist tempfile: %s", err
)
22 defer os
.Remove(f
.Name())
24 f2
, err
:= os
.OpenFile(f
.Name(), os
.O_RDWR|os
.O_CREATE|os
.O_EXCL
, 0600)
27 t
.Fatal("Open should have failed")
30 if s
:= checkErrorPredicate("os.IsExist", os
.IsExist
, err
, fs
.ErrExist
); s
!= "" {
36 func testErrNotExist(t
*testing
.T
, name
string) string {
37 originalWD
, err
:= os
.Getwd()
42 f
, err
:= os
.Open(name
)
45 return "Open should have failed"
47 if s
:= checkErrorPredicate("os.IsNotExist", os
.IsNotExist
, err
, fs
.ErrNotExist
); s
!= "" {
53 if err
:= os
.Chdir(originalWD
); err
!= nil {
54 t
.Fatalf("Chdir should have failed, failed to restore original working directory: %v", err
)
56 return "Chdir should have failed, restored original working directory"
58 if s
:= checkErrorPredicate("os.IsNotExist", os
.IsNotExist
, err
, fs
.ErrNotExist
); s
!= "" {
64 func TestErrIsNotExist(t
*testing
.T
) {
66 name
:= filepath
.Join(tmpDir
, "NotExists")
67 if s
:= testErrNotExist(t
, name
); s
!= "" {
72 name
= filepath
.Join(name
, "NotExists2")
73 if s
:= testErrNotExist(t
, name
); s
!= "" {
79 func checkErrorPredicate(predName
string, pred
func(error
) bool, err
, target error
) string {
81 return fmt
.Sprintf("%s does not work as expected for %#v", predName
, err
)
83 if !errors
.Is(err
, target
) {
84 return fmt
.Sprintf("errors.Is(%#v, %#v) = false, want true", err
, target
)
89 type isExistTest
struct {
95 var isExistTests
= []isExistTest
{
96 {&fs
.PathError
{Err
: fs
.ErrInvalid
}, false, false},
97 {&fs
.PathError
{Err
: fs
.ErrPermission
}, false, false},
98 {&fs
.PathError
{Err
: fs
.ErrExist
}, true, false},
99 {&fs
.PathError
{Err
: fs
.ErrNotExist
}, false, true},
100 {&fs
.PathError
{Err
: fs
.ErrClosed
}, false, false},
101 {&os
.LinkError
{Err
: fs
.ErrInvalid
}, false, false},
102 {&os
.LinkError
{Err
: fs
.ErrPermission
}, false, false},
103 {&os
.LinkError
{Err
: fs
.ErrExist
}, true, false},
104 {&os
.LinkError
{Err
: fs
.ErrNotExist
}, false, true},
105 {&os
.LinkError
{Err
: fs
.ErrClosed
}, false, false},
106 {&os
.SyscallError
{Err
: fs
.ErrNotExist
}, false, true},
107 {&os
.SyscallError
{Err
: fs
.ErrExist
}, true, false},
111 func TestIsExist(t
*testing
.T
) {
112 for _
, tt
:= range isExistTests
{
113 if is
:= os
.IsExist(tt
.err
); is
!= tt
.is
{
114 t
.Errorf("os.IsExist(%T %v) = %v, want %v", tt
.err
, tt
.err
, is
, tt
.is
)
116 if is
:= errors
.Is(tt
.err
, fs
.ErrExist
); is
!= tt
.is
{
117 t
.Errorf("errors.Is(%T %v, fs.ErrExist) = %v, want %v", tt
.err
, tt
.err
, is
, tt
.is
)
119 if isnot
:= os
.IsNotExist(tt
.err
); isnot
!= tt
.isnot
{
120 t
.Errorf("os.IsNotExist(%T %v) = %v, want %v", tt
.err
, tt
.err
, isnot
, tt
.isnot
)
122 if isnot
:= errors
.Is(tt
.err
, fs
.ErrNotExist
); isnot
!= tt
.isnot
{
123 t
.Errorf("errors.Is(%T %v, fs.ErrNotExist) = %v, want %v", tt
.err
, tt
.err
, isnot
, tt
.isnot
)
128 type isPermissionTest
struct {
133 var isPermissionTests
= []isPermissionTest
{
135 {&fs
.PathError
{Err
: fs
.ErrPermission
}, true},
136 {&os
.SyscallError
{Err
: fs
.ErrPermission
}, true},
139 func TestIsPermission(t
*testing
.T
) {
140 for _
, tt
:= range isPermissionTests
{
141 if got
:= os
.IsPermission(tt
.err
); got
!= tt
.want
{
142 t
.Errorf("os.IsPermission(%#v) = %v; want %v", tt
.err
, got
, tt
.want
)
144 if got
:= errors
.Is(tt
.err
, fs
.ErrPermission
); got
!= tt
.want
{
145 t
.Errorf("errors.Is(%#v, fs.ErrPermission) = %v; want %v", tt
.err
, got
, tt
.want
)
150 func TestErrPathNUL(t
*testing
.T
) {
151 f
, err
:= os
.CreateTemp("", "_Go_ErrPathNUL\x00")
154 t
.Fatal("TempFile should have failed")
156 f
, err
= os
.CreateTemp("", "_Go_ErrPathNUL")
158 t
.Fatalf("open ErrPathNUL tempfile: %s", err
)
160 defer os
.Remove(f
.Name())
162 f2
, err
:= os
.OpenFile(f
.Name(), os
.O_RDWR
, 0600)
164 t
.Fatalf("open ErrPathNUL: %s", err
)
167 f2
, err
= os
.OpenFile(f
.Name()+"\x00", os
.O_RDWR
, 0600)
170 t
.Fatal("Open should have failed")
174 func TestPathErrorUnwrap(t
*testing
.T
) {
175 pe
:= &fs
.PathError
{Err
: fs
.ErrInvalid
}
176 if !errors
.Is(pe
, fs
.ErrInvalid
) {
177 t
.Error("errors.Is failed, wanted success")
181 type myErrorIs
struct{ error
}
183 func (e myErrorIs
) Is(target error
) bool { return target
== e
.error
}
185 func TestErrorIsMethods(t
*testing
.T
) {
186 if os
.IsPermission(myErrorIs
{fs
.ErrPermission
}) {
187 t
.Error("os.IsPermission(err) = true when err.Is(fs.ErrPermission), wanted false")