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