From 467f8751f91516fa13c85f1604212d5974190ec4 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Wed, 8 Feb 2012 08:47:02 -0800 Subject: [PATCH] gofmt: replace defunct test.sh with a go test R=r, rsc CC=golang-dev https://golang.org/cl/5639053 --- src/cmd/gofmt/long_test.go | 157 ++++++++++++++++++++++++++++++++++ src/cmd/gofmt/test.sh | 168 ------------------------------------- 2 files changed, 157 insertions(+), 168 deletions(-) create mode 100644 src/cmd/gofmt/long_test.go delete mode 100755 src/cmd/gofmt/test.sh diff --git a/src/cmd/gofmt/long_test.go b/src/cmd/gofmt/long_test.go new file mode 100644 index 0000000000..8a8617c2e8 --- /dev/null +++ b/src/cmd/gofmt/long_test.go @@ -0,0 +1,157 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This test applies gofmt to all Go files under -root. +// To test specific files provide a list of comma-separated +// filenames via the -files flag: go test -files=gofmt.go . + +package main + +import ( + "bytes" + "flag" + "fmt" + "go/ast" + "go/printer" + "io" + "os" + "path/filepath" + "runtime" + "strings" + "testing" +) + +var ( + root = flag.String("root", runtime.GOROOT(), "test root directory") + files = flag.String("files", "", "comma-separated list of files to test") + ngo = flag.Int("n", runtime.NumCPU(), "number of goroutines used") + verbose = flag.Bool("verbose", false, "verbose mode") + nfiles int // number of files processed +) + +func gofmt(filename string, src *bytes.Buffer) error { + f, _, err := parse(filename, src.Bytes(), false) + if err != nil { + return err + } + ast.SortImports(fset, f) + src.Reset() + return (&printer.Config{printerMode, *tabWidth}).Fprint(src, fset, f) +} + +func testFile(t *testing.T, b1, b2 *bytes.Buffer, filename string) { + // open file + f, err := os.Open(filename) + if err != nil { + t.Error(err) + return + } + + // read file + b1.Reset() + _, err = io.Copy(b1, f) + f.Close() + if err != nil { + t.Error(err) + return + } + + // exclude files w/ syntax errors (typically test cases) + if _, _, err = parse(filename, b1.Bytes(), false); err != nil { + if *verbose { + fmt.Fprintf(os.Stderr, "ignoring %s\n", err) + } + return + } + + // gofmt file + if err = gofmt(filename, b1); err != nil { + t.Errorf("1st gofmt failed: %v", err) + return + } + + // make a copy of the result + b2.Reset() + b2.Write(b1.Bytes()) + + // gofmt result again + if err = gofmt(filename, b2); err != nil { + t.Errorf("2nd gofmt failed: %v", err) + return + } + + // the first and 2nd result should be identical + if bytes.Compare(b1.Bytes(), b2.Bytes()) != 0 { + t.Errorf("%s: not idempotent", filename) + } +} + +func testFiles(t *testing.T, filenames <-chan string, done chan<- int) { + b1 := new(bytes.Buffer) + b2 := new(bytes.Buffer) + for filename := range filenames { + testFile(t, b1, b2, filename) + } + done <- 0 +} + +func genFilenames(t *testing.T, filenames chan<- string) { + defer close(filenames) + + handleFile := func(filename string, fi os.FileInfo, err error) error { + if err != nil { + t.Error(err) + return nil + } + if isGoFile(fi) { + filenames <- filename + nfiles++ + } + return nil + } + + // test Go files provided via -files, if any + if *files != "" { + for _, filename := range strings.Split(*files, ",") { + fi, err := os.Stat(filename) + handleFile(filename, fi, err) + } + return // ignore files under -root + } + + // otherwise, test all Go files under *root + filepath.Walk(*root, handleFile) +} + +func TestAll(t *testing.T) { + if testing.Short() { + return + } + + if *ngo < 1 { + *ngo = 1 // make sure test is run + } + if *verbose { + fmt.Printf("running test using %d goroutines\n", *ngo) + } + + // generate filenames + filenames := make(chan string, 32) + go genFilenames(t, filenames) + + // launch test goroutines + done := make(chan int) + for i := 0; i < *ngo; i++ { + go testFiles(t, filenames, done) + } + + // wait for all test goroutines to complete + for i := 0; i < *ngo; i++ { + <-done + } + + if *verbose { + fmt.Printf("processed %d files\n", nfiles) + } +} diff --git a/src/cmd/gofmt/test.sh b/src/cmd/gofmt/test.sh deleted file mode 100755 index 65601b1013..0000000000 --- a/src/cmd/gofmt/test.sh +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2009 The Go Authors. All rights reserved. -# Use of this source code is governed by a BSD-style -# license that can be found in the LICENSE file. - -eval $(go tool make --no-print-directory -f ../../Make.inc go-env) -if [ -z "$O" ]; then - echo 'missing $O - maybe no Make.$GOARCH?' 1>&2 - exit 1 -fi - -CMD="./gofmt" -TMP1=test_tmp1.go -TMP2=test_tmp2.go -TMP3=test_tmp3.go -COUNT=0 -rm -f _failed - -count() { - #echo $1 - let COUNT=$COUNT+1 - let M=$COUNT%10 - if [ $M == 0 ]; then - echo -n "." - fi -} - - -error() { - echo $1 - touch _failed -} - -# apply to one file -apply1() { - # the following files are skipped because they are test cases - # for syntax errors and thus won't parse in the first place: - case `basename "$F"` in - func3.go | const2.go | char_lit1.go | blank1.go | ddd1.go | \ - bug014.go | bug050.go | bug068.go | bug083.go | bug088.go | \ - bug106.go | bug121.go | bug125.go | bug133.go | bug160.go | \ - bug163.go | bug166.go | bug169.go | bug217.go | bug222.go | \ - bug226.go | bug228.go | bug248.go | bug274.go | bug280.go | \ - bug282.go | bug287.go | bug298.go | bug299.go | bug300.go | \ - bug302.go | bug306.go | bug322.go | bug324.go | bug335.go | \ - bug340.go | bug349.go | bug351.go | bug358.go | bug367.go | \ - bug388.go | bug394.go ) return ;; - esac - # the following directories are skipped because they contain test - # cases for syntax errors and thus won't parse in the first place: - case `dirname "$F"` in - $GOROOT/test/syntax ) return ;; - esac - #echo $1 $2 - "$1" "$2"; count "$F" -} - - -# apply to local files -applydot() { - for F in `find . -name "*.go" | grep -v "._"`; do - apply1 "$1" $F - done -} - - -# apply to all .go files we can find -apply() { - for F in `find "$GOROOT" -name "*.go" | grep -v "._"`; do - apply1 "$1" $F - done -} - - -cleanup() { - rm -f $TMP1 $TMP2 $TMP3 -} - - -silent() { - cleanup - $CMD "$1" > /dev/null 2> $TMP1 - if [ $? != 0 ]; then - cat $TMP1 - error "Error (silent mode test): test.sh $1" - fi -} - - -idempotent() { - cleanup - $CMD "$1" > $TMP1 - if [ $? != 0 ]; then - error "Error (step 1 of idempotency test): test.sh $1" - fi - - $CMD $TMP1 > $TMP2 - if [ $? != 0 ]; then - error "Error (step 2 of idempotency test): test.sh $1" - fi - - $CMD $TMP2 > $TMP3 - if [ $? != 0 ]; then - error "Error (step 3 of idempotency test): test.sh $1" - fi - - cmp -s $TMP2 $TMP3 - if [ $? != 0 ]; then - diff $TMP2 $TMP3 - error "Error (step 4 of idempotency test): test.sh $1" - fi -} - - -valid() { - cleanup - $CMD "$1" > $TMP1 - if [ $? != 0 ]; then - error "Error (step 1 of validity test): test.sh $1" - fi - - $GC -o /dev/null $TMP1 - if [ $? != 0 ]; then - error "Error (step 2 of validity test): test.sh $1" - fi -} - - -runtest() { - #echo "Testing silent mode" - cleanup - "$1" silent "$2" - - #echo "Testing idempotency" - cleanup - "$1" idempotent "$2" -} - - -runtests() { - if [ $# = 0 ]; then - runtest apply - # verify the pretty-printed files can be compiled with $GC again - # do it in local directory only because of the prerequisites required - #echo "Testing validity" - # Disabled for now due to dependency problems - # cleanup - # applydot valid - else - for F in "$@"; do - runtest apply1 "$F" - done - fi -} - - -# run over all .go files -runtests "$@" -cleanup - -if [ -f _failed ]; then - rm _failed - exit 1 -fi - -# done -echo -echo "PASSED ($COUNT tests)" -- 2.50.0