1 package sys
2
3 import (
4 "errors"
5 "fmt"
6 "io"
7 "io/fs"
8 "os"
9 "testing"
10 )
11
12 func TestUnwrapOSError(t *testing.T) {
13 tests := []struct {
14 name string
15 input error
16 expected Errno
17 }{
18 {
19 name: "io.EOF is not an error",
20 input: io.EOF,
21 expected: 0,
22 },
23 {
24 name: "LinkError ErrInvalid",
25 input: &os.LinkError{Err: fs.ErrInvalid},
26 expected: EINVAL,
27 },
28 {
29 name: "PathError ErrInvalid",
30 input: &os.PathError{Err: fs.ErrInvalid},
31 expected: EINVAL,
32 },
33 {
34 name: "SyscallError ErrInvalid",
35 input: &os.SyscallError{Err: fs.ErrInvalid},
36 expected: EINVAL,
37 },
38 {
39 name: "PathError ErrPermission",
40 input: &os.PathError{Err: os.ErrPermission},
41 expected: EPERM,
42 },
43 {
44 name: "PathError ErrExist",
45 input: &os.PathError{Err: os.ErrExist},
46 expected: EEXIST,
47 },
48 {
49 name: "PathError ErrnotExist",
50 input: &os.PathError{Err: os.ErrNotExist},
51 expected: ENOENT,
52 },
53 {
54 name: "PathError ErrClosed",
55 input: &os.PathError{Err: os.ErrClosed},
56 expected: EBADF,
57 },
58 {
59 name: "PathError unknown == EIO",
60 input: &os.PathError{Err: errors.New("ice cream")},
61 expected: EIO,
62 },
63 {
64 name: "unknown == EIO",
65 input: errors.New("ice cream"),
66 expected: EIO,
67 },
68 {
69 name: "very wrapped unknown == EIO",
70 input: fmt.Errorf("%w", fmt.Errorf("%w", fmt.Errorf("%w", errors.New("ice cream")))),
71 expected: EIO,
72 },
73 }
74
75 for _, tt := range tests {
76 tc := tt
77 t.Run(tc.name, func(t *testing.T) {
78
79 if want, have := tc.expected, UnwrapOSError(tc.input); have != want {
80 t.Fatalf("unexpected errno: %v != %v", have, want)
81 }
82 })
83 }
84
85 t.Run("nil -> zero", func(t *testing.T) {
86
87 if want, have := Errno(0), UnwrapOSError(nil); have != want {
88 t.Fatalf("unexpected errno: %v != %v", have, want)
89 }
90 })
91 }
92
View as plain text