github.com/kisielk/errcheck@v1.7.1-0.20240411160824-b65821b80eef/main_test.go (about) 1 package main 2 3 import ( 4 "bytes" 5 "io" 6 "os" 7 "regexp" 8 "strings" 9 "testing" 10 11 "github.com/kisielk/errcheck/errcheck" 12 ) 13 14 var dotStar = regexp.MustCompile(".*") 15 16 func TestMainFunc(t *testing.T) { 17 saveStderr := os.Stderr 18 saveStdout := os.Stdout 19 saveCwd, err := os.Getwd() 20 if err != nil { 21 t.Errorf("Cannot receive current directory: %v", err) 22 } 23 24 r, w, err := os.Pipe() 25 if err != nil { 26 t.Errorf("Cannot create pipe: %v", err) 27 } 28 29 os.Stderr = w 30 os.Stdout = w 31 32 bufChannel := make(chan string) 33 34 go func() { 35 buf := new(bytes.Buffer) 36 _, err = io.Copy(buf, r) 37 r.Close() 38 if err != nil { 39 t.Errorf("Cannot copy to buffer: %v", err) 40 } 41 42 bufChannel <- buf.String() 43 }() 44 45 exitCode := mainCmd([]string{"cmd name", "github.com/kisielk/errcheck/testdata"}) 46 47 w.Close() 48 49 os.Stderr = saveStderr 50 os.Stdout = saveStdout 51 _ = os.Chdir(saveCwd) 52 53 out := <-bufChannel 54 55 if exitCode != exitUncheckedError { 56 t.Errorf("Exit code is %d, expected %d", exitCode, exitUncheckedError) 57 } 58 59 expectUnchecked := 29 60 if got := strings.Count(out, "UNCHECKED"); got != expectUnchecked { 61 t.Errorf("Got %d UNCHECKED errors, expected %d in:\n%s", got, expectUnchecked, out) 62 } 63 } 64 65 type parseTestCase struct { 66 args []string 67 paths []string 68 ignore map[string]string // Exclusions.SymbolRegexpsByPackage 69 pkgs []string // Exclusions.Packages 70 tags []string // Tags 71 blank bool // !BlankAssignments 72 asserts bool // !TypeAssertions 73 error int 74 } 75 76 func TestParseFlags(t *testing.T) { 77 cases := []parseTestCase{ 78 parseTestCase{ 79 args: []string{"errcheck"}, 80 paths: []string{"."}, 81 ignore: map[string]string{}, 82 pkgs: []string{}, 83 tags: []string{}, 84 blank: false, 85 asserts: false, 86 error: exitCodeOk, 87 }, 88 parseTestCase{ 89 args: []string{"errcheck", "-blank", "-asserts"}, 90 paths: []string{"."}, 91 ignore: map[string]string{}, 92 pkgs: []string{}, 93 tags: []string{}, 94 blank: true, 95 asserts: true, 96 error: exitCodeOk, 97 }, 98 parseTestCase{ 99 args: []string{"errcheck", "foo", "bar"}, 100 paths: []string{"foo", "bar"}, 101 ignore: map[string]string{}, 102 pkgs: []string{}, 103 tags: []string{}, 104 blank: false, 105 asserts: false, 106 error: exitCodeOk, 107 }, 108 parseTestCase{ 109 args: []string{"errcheck", "-ignore", "fmt:.*,encoding/binary:.*"}, 110 paths: []string{"."}, 111 ignore: map[string]string{"fmt": ".*", "encoding/binary": dotStar.String()}, 112 pkgs: []string{}, 113 tags: []string{}, 114 blank: false, 115 asserts: false, 116 error: exitCodeOk, 117 }, 118 parseTestCase{ 119 args: []string{"errcheck", "-ignore", "fmt:[FS]?[Pp]rint*"}, 120 paths: []string{"."}, 121 ignore: map[string]string{"fmt": "[FS]?[Pp]rint*"}, 122 pkgs: []string{}, 123 tags: []string{}, 124 blank: false, 125 asserts: false, 126 error: exitCodeOk, 127 }, 128 parseTestCase{ 129 args: []string{"errcheck", "-ignore", "[rR]ead|[wW]rite"}, 130 paths: []string{"."}, 131 ignore: map[string]string{"": "[rR]ead|[wW]rite"}, 132 pkgs: []string{}, 133 tags: []string{}, 134 blank: false, 135 asserts: false, 136 error: exitCodeOk, 137 }, 138 parseTestCase{ 139 args: []string{"errcheck", "-ignorepkg", "testing"}, 140 paths: []string{"."}, 141 ignore: map[string]string{}, 142 pkgs: []string{"testing"}, 143 tags: []string{}, 144 blank: false, 145 asserts: false, 146 error: exitCodeOk, 147 }, 148 parseTestCase{ 149 args: []string{"errcheck", "-ignorepkg", "testing,foo"}, 150 paths: []string{"."}, 151 ignore: map[string]string{}, 152 pkgs: []string{"testing", "foo"}, 153 tags: []string{}, 154 blank: false, 155 asserts: false, 156 error: exitCodeOk, 157 }, 158 parseTestCase{ 159 args: []string{"errcheck", "-tags", "foo"}, 160 paths: []string{"."}, 161 ignore: map[string]string{}, 162 pkgs: []string{}, 163 tags: []string{"foo"}, 164 blank: false, 165 asserts: false, 166 error: exitCodeOk, 167 }, 168 parseTestCase{ 169 args: []string{"errcheck", "-tags", "foo bar !baz"}, 170 paths: []string{"."}, 171 ignore: map[string]string{}, 172 pkgs: []string{}, 173 tags: []string{"foo", "bar", "!baz"}, 174 blank: false, 175 asserts: false, 176 error: exitCodeOk, 177 }, 178 parseTestCase{ 179 args: []string{"errcheck", "-tags", "foo,bar,!baz"}, 180 paths: []string{"."}, 181 ignore: map[string]string{}, 182 pkgs: []string{}, 183 tags: []string{"foo", "bar", "!baz"}, 184 blank: false, 185 asserts: false, 186 error: exitCodeOk, 187 }, 188 parseTestCase{ 189 args: []string{"errcheck", "-tags", "foo bar !baz"}, 190 paths: []string{"."}, 191 ignore: map[string]string{}, 192 pkgs: []string{}, 193 tags: []string{"foo", "bar", "!baz"}, 194 blank: false, 195 asserts: false, 196 error: exitCodeOk, 197 }, 198 } 199 200 slicesEqual := func(a, b []string) bool { 201 if len(a) != len(b) { 202 return false 203 } 204 for i := range a { 205 if a[i] != b[i] { 206 return false 207 } 208 } 209 return true 210 } 211 212 ignoresEqual := func(a map[string]*regexp.Regexp, b map[string]string) bool { 213 if (a == nil && b != nil) || (a != nil && b == nil) || (len(a) != len(b)) { 214 return false 215 } 216 for k, v := range a { 217 if v.String() != b[k] { 218 return false 219 } 220 } 221 return true 222 } 223 224 for _, c := range cases { 225 var checker errcheck.Checker 226 p, e := parseFlags(&checker, c.args) 227 228 argsStr := strings.Join(c.args, " ") 229 if !slicesEqual(p, c.paths) { 230 t.Errorf("%q: path got %q want %q", argsStr, p, c.paths) 231 } 232 if ign := checker.Exclusions.SymbolRegexpsByPackage; !ignoresEqual(ign, c.ignore) { 233 t.Errorf("%q: ignore got %q want %q", argsStr, ign, c.ignore) 234 } 235 if pkgs := checker.Exclusions.Packages; !slicesEqual(pkgs, c.pkgs) { 236 t.Errorf("%q: packages got %v want %v", argsStr, pkgs, c.pkgs) 237 } 238 if tags := checker.Tags; !slicesEqual(tags, c.tags) { 239 t.Errorf("%q: tags got %v want %v", argsStr, tags, c.tags) 240 } 241 if b := checker.Exclusions.BlankAssignments; b != !c.blank { 242 t.Errorf("%q: BlankAssignments got %v want %v", argsStr, b, !c.blank) 243 } 244 if a := checker.Exclusions.TypeAssertions; a != !c.asserts { 245 t.Errorf("%q: TypeAssertions got %v want %v", argsStr, a, !c.asserts) 246 } 247 if e != c.error { 248 t.Errorf("%q: error got %q want %q", argsStr, e, c.error) 249 } 250 } 251 }