diff options
| author | Eyal Posener <[email protected]> | 2021-04-08 00:04:50 +0300 | 
|---|---|---|
| committer | GitHub <[email protected]> | 2021-04-08 00:04:50 +0300 | 
| commit | 3f9152130d1c1e72ef5b0091380bfbeb7fafecf5 (patch) | |
| tree | a622156da3220fccf4d72d0dc3bef4175c8bc241 | |
| parent | 495a97af070e804b9000b846173193dd8d9eb1da (diff) | |
| parent | e203f94963fb806fd8c7cc2339b96d458f84766e (diff) | |
Merge pull request #140 from antichris/gocomplete-suppress-errors
gocomplete: suppress error output by default
| -rw-r--r-- | gocomplete/complete.go | 11 | ||||
| -rw-r--r-- | gocomplete/tests_test.go | 80 | 
2 files changed, 90 insertions, 1 deletions
diff --git a/gocomplete/complete.go b/gocomplete/complete.go index 753a38e..4068bb5 100644 --- a/gocomplete/complete.go +++ b/gocomplete/complete.go @@ -2,10 +2,17 @@  package main  import ( +	"io/ioutil" +	"log" +	"os" +  	"github.com/posener/complete/v2"  	"github.com/posener/complete/v2/predict"  ) +// envVerbose is the sys env var that controls error output verbosity. +const envVerbose = "GOCOMP_VERBOSE" +  var (  	ellipsis   = predict.Set{"./..."}  	anyPackage = complete.PredictFunc(predictPackages) @@ -15,6 +22,10 @@ var (  )  func main() { +	if os.Getenv(envVerbose) != "1" { +		log.SetOutput(ioutil.Discard) +	} +  	build := &complete.Command{  		Flags: map[string]complete.Predictor{  			"o": anyFile, diff --git a/gocomplete/tests_test.go b/gocomplete/tests_test.go index a1238a4..dbe72cf 100644 --- a/gocomplete/tests_test.go +++ b/gocomplete/tests_test.go @@ -1,8 +1,14 @@  package main  import ( +	"fmt" +	"io" +	"io/ioutil" +	"log"  	"os"  	"sort" +	"strconv" +	"strings"  	"testing"  	"bou.ke/monkey" @@ -21,7 +27,11 @@ func TestPredictions(t *testing.T) {  		{  			name:      "predict tests ok",  			predictor: predictTest, -			want:      []string{"TestPredictions", "Example"}, +			want: []string{ +				"TestPredictions", +				"Example", +				"TestErrorSupression", +			},  		},  		{  			name:      "predict benchmark ok", @@ -64,3 +74,71 @@ func equal(s1, s2 []string) bool {  	}  	return true  } + +func TestErrorSupression(t *testing.T) { +	defer monkey.Patch(os.Exit, func(int) {}).Unpatch() + +	// Completion API environment variable names. +	const envLine, envPoint = "COMP_LINE", "COMP_POINT" + +	// line should work out to +	// +	// * on most POSIX: +	//     go test /tmp/ +	// * on MacOS X: +	//     go test /var/folders/<randomized_pathname>/T// +	// * on Windows: +	//     go test C:\Users\<username>\AppData\Local\Temp\ +	// +	// which should trigger "failed importing directory: ... no +	// buildable Go source files..." error messages. +	var line = "go test " + os.TempDir() + string(os.PathSeparator) + +	defer os.Unsetenv(envLine) +	defer os.Unsetenv(envPoint) +	os.Setenv(envLine, line) +	os.Setenv(envPoint, strconv.Itoa(len(line))) + +	tests := []struct { +		verbose string +		wantErr bool +	}{{ +		verbose: "", +		wantErr: false, +	}, { +		verbose: "1", +		wantErr: true, +	}} +	for _, tt := range tests { +		t.Run(fmt.Sprintf( +			"%s=%q", envVerbose, tt.verbose, +		), func(t *testing.T) { +			// Discard completion (stdout). +			r, w, err := os.Pipe() +			if err != nil { +				t.Fatal(err) +			} +			defer w.Close() +			defer func(o *os.File) { os.Stdout = o }(os.Stdout) +			os.Stdout = w +			go io.Copy(ioutil.Discard, r) + +			// "Redirect" stderr into a buffer. +			b := &strings.Builder{} +			log.SetOutput(b) + +			defer os.Unsetenv(envVerbose) +			os.Setenv(envVerbose, tt.verbose) + +			main() + +			gotErr := b.Len() != 0 +			if tt.wantErr && !gotErr { +				t.Fatal("want something in stderr, got nothing") +			} else if !tt.wantErr && gotErr { +				t.Fatalf("want nothing in stderr, got %d bytes", +					b.Len()) +			} +		}) +	} +}  | 
