Text file src/cmd/go/testdata/script/build_issue6480.txt

     1  # "go test -c -test.bench=XXX errors" should not hang.
     2  # "go test -c" should also produce reproducible binaries.
     3  # "go test -c" should also appear to write a new binary every time,
     4  # even if it's really just updating the mtime on an existing up-to-date binary.
     5  
     6  [compiler:gccgo] skip
     7  [short] skip
     8  
     9  # Install some commands to compare mtimes
    10  env GOBIN=$WORK/tmp/bin
    11  go install m/now m/mtime m/before
    12  
    13  # Initial builds
    14  go test -c -test.bench=XXX errors
    15  go test -c -o errors2.test errors
    16  cmp errors.test$GOEXE errors2.test # // errors2.test has no exeSuffix because -o above doesn't have it
    17  
    18  # Check errors.test mtime is updated
    19  exec $GOBIN/now
    20  cp stdout start_time.txt
    21  go test -x -c -test.bench=XXX errors
    22  ! stderr '[\\/]link|gccgo' # make sure up-to-date test binary is not relinked
    23  exec $GOBIN/mtime errors.test$GOEXE
    24  cp stdout errors1_mod_time.txt
    25  exec $GOBIN/before start_time.txt errors1_mod_time.txt
    26  rm start_time.txt errors1_mod_time.txt
    27  
    28  # Check errors2.test mtime is updated
    29  exec $GOBIN/now
    30  cp stdout start_time.txt
    31  go test -x -c -o errors2.test errors
    32  ! stderr '[\\/]link|gccgo' # make sure up-to-date test binary is not relinked
    33  exec $GOBIN/mtime errors2.test
    34  cp stdout errors2_mod_time.txt
    35  exec $GOBIN/before start_time.txt errors2_mod_time.txt
    36  
    37  -- go.mod --
    38  module m
    39  
    40  go 1.16
    41  -- now/now.go --
    42  // Writes time.Now() to a file
    43  package main
    44  
    45  import (
    46  	"encoding/json"
    47  	"fmt"
    48  	"os"
    49  	"time"
    50  )
    51  
    52  func main() {
    53  	if err := json.NewEncoder(os.Stdout).Encode(time.Now()); err != nil {
    54  		fmt.Fprintln(os.Stderr, err)
    55  		os.Exit(1)
    56  	}
    57  }
    58  -- mtime/mtime.go --
    59  package main
    60  
    61  import (
    62  	"encoding/json"
    63  	"fmt"
    64  	"os"
    65  )
    66  
    67  func main() {
    68  	info, err := os.Stat(os.Args[1])
    69  	if err != nil {
    70  		fmt.Fprintln(os.Stderr, err)
    71  		os.Exit(1)
    72  	}
    73  	if err := json.NewEncoder(os.Stdout).Encode(info.ModTime()); err != nil {
    74  		fmt.Fprintln(os.Stderr, err)
    75  		os.Exit(1)
    76  	}
    77  }
    78  -- before/before.go --
    79  package main
    80  
    81  import (
    82  	"encoding/json"
    83  	"fmt"
    84  	"os"
    85  	"time"
    86  )
    87  
    88  func truncateLike(t, p time.Time) time.Time {
    89  	nano := p.UnixNano()
    90  	d := 1 * time.Nanosecond
    91  	for nano%int64(d) == 0 && d < 1*time.Second {
    92  		d *= 10
    93  	}
    94  	for nano%int64(d) == 0 && d < 2*time.Second {
    95  		d *= 2
    96  	}
    97  	return t.Truncate(d)
    98  }
    99  
   100  func main() {
   101  	var t1 time.Time
   102  	b1, err := os.ReadFile(os.Args[1])
   103  	if err != nil {
   104  		fmt.Fprintln(os.Stderr, err)
   105  		os.Exit(1)
   106  	}
   107  	if err := json.Unmarshal(b1, &t1); err != nil  {
   108  		fmt.Fprintln(os.Stderr, err)
   109  		os.Exit(1)
   110  	}
   111  
   112  	var t2 time.Time
   113  	b2, err := os.ReadFile(os.Args[2])
   114  	if err != nil {
   115  		fmt.Fprintln(os.Stderr, err)
   116  		os.Exit(1)
   117  	}
   118  	if err := json.Unmarshal(b2, &t2); err != nil  {
   119  		fmt.Fprintln(os.Stderr, err)
   120  		os.Exit(1)
   121  	}
   122  
   123  	t1 = truncateLike(t1, t2)
   124  	if !t1.Before(t2) {
   125  		fmt.Fprintf(os.Stderr, "time in %v (%v) is not before time in %v (%v)", os.Args[1], t1, os.Args[2], t2)
   126  		os.Exit(1)
   127  	}
   128  }
   129  

View as plain text