github.com/getkalido/errcheck@v1.7.0-alpha/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/getkalido/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/getkalido/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  }