// 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. package linebreaks import ( "bytes" "fmt" "io" "os" "reflect" "strings" "testing" ) type writerTestEntry struct { header *Header contents string } type writerTest struct { file string // filename of expected output entries []*writerTestEntry } var writerTests = []*writerTest{ &writerTest{ file: "testdata/writer.tar", entries: []*writerTestEntry{ &writerTestEntry{ header: &Header{ Name: "small.txt", Mode: 0640, Uid: 73025, Gid: 5000, Size: 5, Mtime: 1246508266, Typeflag: '0', Uname: "dsymonds", Gname: "eng", }, contents: "Kilts", }, &writerTestEntry{ header: &Header{ Name: "small2.txt", Mode: 0640, Uid: 73025, Gid: 5000, Size: 11, Mtime: 1245217492, Typeflag: '0', Uname: "dsymonds", Gname: "eng", }, contents: "Google.com\n", }, }, }, // The truncated test file was produced using these commands: // dd if=/dev/zero bs=1048576 count=16384 > /tmp/16gig.txt // tar -b 1 -c -f- /tmp/16gig.txt | dd bs=512 count=8 > writer-big.tar &writerTest{ file: "testdata/writer-big.tar", entries: []*writerTestEntry{ &writerTestEntry{ header: &Header{ Name: "tmp/16gig.txt", Mode: 0640, Uid: 73025, Gid: 5000, Size: 16 << 30, Mtime: 1254699560, Typeflag: '0', Uname: "dsymonds", Gname: "eng", }, // no contents }, }, }, } type untarTest struct { file string headers []*Header } var untarTests = []*untarTest{ &untarTest{ file: "testdata/gnu.tar", headers: []*Header{ &Header{ Name: "small.txt", Mode: 0640, Uid: 73025, Gid: 5000, Size: 5, Mtime: 1244428340, Typeflag: '0', Uname: "dsymonds", Gname: "eng", }, &Header{ Name: "small2.txt", Mode: 0640, Uid: 73025, Gid: 5000, Size: 11, Mtime: 1244436044, Typeflag: '0', Uname: "dsymonds", Gname: "eng", }, }, }, &untarTest{ file: "testdata/star.tar", headers: []*Header{ &Header{ Name: "small.txt", Mode: 0640, Uid: 73025, Gid: 5000, Size: 5, Mtime: 1244592783, Typeflag: '0', Uname: "dsymonds", Gname: "eng", Atime: 1244592783, Ctime: 1244592783, }, &Header{ Name: "small2.txt", Mode: 0640, Uid: 73025, Gid: 5000, Size: 11, Mtime: 1244592783, Typeflag: '0', Uname: "dsymonds", Gname: "eng", Atime: 1244592783, Ctime: 1244592783, }, }, }, &untarTest{ file: "testdata/v7.tar", headers: []*Header{ &Header{ Name: "small.txt", Mode: 0444, Uid: 73025, Gid: 5000, Size: 5, Mtime: 1244593104, Typeflag: '\x00', }, &Header{ Name: "small2.txt", Mode: 0444, Uid: 73025, Gid: 5000, Size: 11, Mtime: 1244593104, Typeflag: '\x00', }, }, }, } var facts = map[int] string { 0: "1", 1: "1", 2: "2", 10: "3628800", 20: "2432902008176640000", 100: "933262154439441526816992388562667004907159682643816214685929" + "638952175999932299156089414639761565182862536979208272237582" + "51185210916864000000000000000000000000", } func usage() { fmt.Fprintf(os.Stderr, // TODO(gri): the 2nd string of this string list should not be indented "usage: godoc package [name ...]\n" + " godoc -http=:6060\n") flag.PrintDefaults() os.Exit(2) } func TestReader(t *testing.T) { testLoop: for i, test := range untarTests { f, err := os.Open(test.file, os.O_RDONLY, 0444) if err != nil { t.Errorf("test %d: Unexpected error: %v", i, err) continue } tr := NewReader(f) for j, header := range test.headers { hdr, err := tr.Next() if err != nil || hdr == nil { t.Errorf("test %d, entry %d: Didn't get entry: %v", i, j, err) f.Close() continue testLoop } if !reflect.DeepEqual(hdr, header) { t.Errorf("test %d, entry %d: Incorrect header:\nhave %+v\nwant %+v", i, j, *hdr, *header) } } hdr, err := tr.Next() if hdr != nil || err != nil { t.Errorf("test %d: Unexpected entry or error: hdr=%v err=%v", i, err) } f.Close() } } // Respect line breaks in function calls. func _() { f(x) f(x, x) f(x, x, ) f( x, x) f( x, x, ) } // Respect line breaks in function declarations. func _(x T) {} func _(x T, y T) {} func _(x T, y T, ) {} func _( x T, y T) {} func _( x T, y T, ) {} // Example from issue #2597. func ManageStatus0( in <-chan *Status, req <-chan Request, stat chan<- *TargetInfo, TargetHistorySize int) { } func ManageStatus1( in <-chan *Status, req <-chan Request, stat chan<- *TargetInfo, TargetHistorySize int, ) { } // Example from issue #9064. func (y *y) xerrors() error { _ = "xerror.test" //TODO- _ = []byte(` foo bar foo bar foo bar `) //TODO- } func _() { _ = "abc" // foo _ = `abc_0123456789_` // foo } func _() { _ = "abc" // foo _ = `abc 0123456789 ` // foo } // There should be exactly one linebreak after this comment.