mirror of
https://github.com/golang/go
synced 2024-11-25 03:37:58 -07:00
gofmt: replace defunct test.sh with a go test
R=r, rsc CC=golang-dev https://golang.org/cl/5639053
This commit is contained in:
parent
bd37349485
commit
467f8751f9
157
src/cmd/gofmt/long_test.go
Normal file
157
src/cmd/gofmt/long_test.go
Normal file
@ -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)
|
||||||
|
}
|
||||||
|
}
|
@ -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)"
|
|
Loading…
Reference in New Issue
Block a user