github.com/guyezi/gofrontend@v0.0.0-20200228202240-7a62a49e62c0/libgo/go/runtime/time_test.go (about) 1 // Copyright 2019 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package runtime_test 6 7 import ( 8 "bytes" 9 "encoding/binary" 10 "errors" 11 "internal/testenv" 12 "os/exec" 13 "reflect" 14 "runtime" 15 "testing" 16 ) 17 18 func TestFakeTime(t *testing.T) { 19 if runtime.GOOS == "windows" { 20 t.Skip("faketime not supported on windows") 21 } 22 if runtime.Compiler == "gccgo" { 23 t.Skip("faketime not supported for gccgo") 24 } 25 26 t.Parallel() 27 28 exe, err := buildTestProg(t, "testfaketime", "-tags=faketime") 29 if err != nil { 30 t.Fatal(err) 31 } 32 33 var stdout, stderr bytes.Buffer 34 cmd := exec.Command(exe) 35 cmd.Stdout = &stdout 36 cmd.Stderr = &stderr 37 38 err = testenv.CleanCmdEnv(cmd).Run() 39 if err != nil { 40 t.Fatalf("exit status: %v\n%s", err, stderr.String()) 41 } 42 43 t.Logf("raw stdout: %q", stdout.String()) 44 t.Logf("raw stderr: %q", stdout.String()) 45 46 f1, err1 := parseFakeTime(stdout.Bytes()) 47 if err1 != nil { 48 t.Fatal(err1) 49 } 50 f2, err2 := parseFakeTime(stderr.Bytes()) 51 if err2 != nil { 52 t.Fatal(err2) 53 } 54 55 const time0 = 1257894000000000000 56 got := [][]fakeTimeFrame{f1, f2} 57 var want = [][]fakeTimeFrame{{ 58 {time0 + 1, "line 2\n"}, 59 {time0 + 1, "line 3\n"}, 60 {time0 + 1e9, "line 5\n"}, 61 {time0 + 1e9, "2009-11-10T23:00:01Z"}, 62 }, { 63 {time0, "line 1\n"}, 64 {time0 + 2, "line 4\n"}, 65 }} 66 if !reflect.DeepEqual(want, got) { 67 t.Fatalf("want %v, got %v", want, got) 68 } 69 } 70 71 type fakeTimeFrame struct { 72 time uint64 73 data string 74 } 75 76 func parseFakeTime(x []byte) ([]fakeTimeFrame, error) { 77 var frames []fakeTimeFrame 78 for len(x) != 0 { 79 if len(x) < 4+8+4 { 80 return nil, errors.New("truncated header") 81 } 82 const magic = "\x00\x00PB" 83 if string(x[:len(magic)]) != magic { 84 return nil, errors.New("bad magic") 85 } 86 x = x[len(magic):] 87 time := binary.BigEndian.Uint64(x) 88 x = x[8:] 89 dlen := binary.BigEndian.Uint32(x) 90 x = x[4:] 91 data := string(x[:dlen]) 92 x = x[dlen:] 93 frames = append(frames, fakeTimeFrame{time, data}) 94 } 95 return frames, nil 96 }