| // Copyright 2025 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 testtrace | |
| import ( | |
| "flag" | |
| "fmt" | |
| "internal/trace/raw" | |
| "io" | |
| "os" | |
| "testing" | |
| ) | |
| var ( | |
| convert = flag.String("convert", "", "Path to trace text file to convert to binary format") | |
| output = flag.String("out", "", "Output path for converted trace") | |
| ) | |
| // TestConvertDump is not actually a test, it is a tool for converting trace | |
| // text dumps generated by Dump into the binary trace format. Set -convert and | |
| // -o to perform a converison. | |
| // | |
| // go test internal/trace/testtrace -convert in.tracetxt -out out.trace | |
| // | |
| // This would be cleaner as a dedicated internal command rather than a test, | |
| // but cmd/dist does not handle internal (non-distributed) commands in std | |
| // well. | |
| func TestConvertDump(t *testing.T) { | |
| if *convert == "" { | |
| t.Skip("Set -convert to convert a trace text file") | |
| } | |
| if *output == "" { | |
| t.Fatal("Set -out to specify conversion output") | |
| } | |
| if err := convertDump(*convert, *output); err != nil { | |
| t.Error(err) | |
| } | |
| } | |
| func convertDump(inPath, outPath string) error { | |
| in, err := os.Open(inPath) | |
| if err != nil { | |
| return fmt.Errorf("error opening input: %v", err) | |
| } | |
| defer in.Close() | |
| out, err := os.Create(outPath) | |
| if err != nil { | |
| return fmt.Errorf("error creating output: %v", err) | |
| } | |
| defer out.Close() | |
| tr, err := raw.NewTextReader(in) | |
| if err != nil { | |
| return fmt.Errorf("error creating text reader: %v", err) | |
| } | |
| tw, err := raw.NewWriter(out, tr.Version()) | |
| if err != nil { | |
| return fmt.Errorf("error creating raw writer: %v", err) | |
| } | |
| for { | |
| ev, err := tr.ReadEvent() | |
| if err == io.EOF { | |
| break | |
| } | |
| if err != nil { | |
| return fmt.Errorf("bad trace file: %v", err) | |
| } | |
| if err := tw.WriteEvent(ev); err != nil { | |
| return fmt.Errorf("failed to write trace bytes: %v", err) | |
| } | |
| } | |
| return nil | |
| } |