github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/trace/v2/testtrace/format.go (about)

     1  // Copyright 2023 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 testtrace
     6  
     7  import (
     8  	"bytes"
     9  	"fmt"
    10  	"io"
    11  
    12  	"github.com/go-asm/go/trace/v2/raw"
    13  	"github.com/go-asm/go/txtar"
    14  )
    15  
    16  // ParseFile parses a test file generated by the testgen package.
    17  func ParseFile(testPath string) (io.Reader, *Expectation, error) {
    18  	ar, err := txtar.ParseFile(testPath)
    19  	if err != nil {
    20  		return nil, nil, fmt.Errorf("failed to read test file for %s: %v", testPath, err)
    21  	}
    22  	if len(ar.Files) != 2 {
    23  		return nil, nil, fmt.Errorf("malformed test %s: wrong number of files", testPath)
    24  	}
    25  	if ar.Files[0].Name != "expect" {
    26  		return nil, nil, fmt.Errorf("malformed test %s: bad filename %s", testPath, ar.Files[0].Name)
    27  	}
    28  	if ar.Files[1].Name != "trace" {
    29  		return nil, nil, fmt.Errorf("malformed test %s: bad filename %s", testPath, ar.Files[1].Name)
    30  	}
    31  	tr, err := raw.NewTextReader(bytes.NewReader(ar.Files[1].Data))
    32  	if err != nil {
    33  		return nil, nil, fmt.Errorf("malformed test %s: bad trace file: %v", testPath, err)
    34  	}
    35  	var buf bytes.Buffer
    36  	tw, err := raw.NewWriter(&buf, tr.Version())
    37  	if err != nil {
    38  		return nil, nil, fmt.Errorf("failed to create trace byte writer: %v", err)
    39  	}
    40  	for {
    41  		ev, err := tr.ReadEvent()
    42  		if err == io.EOF {
    43  			break
    44  		}
    45  		if err != nil {
    46  			return nil, nil, fmt.Errorf("malformed test %s: bad trace file: %v", testPath, err)
    47  		}
    48  		if err := tw.WriteEvent(ev); err != nil {
    49  			return nil, nil, fmt.Errorf("internal error during %s: failed to write trace bytes: %v", testPath, err)
    50  		}
    51  	}
    52  	exp, err := ParseExpectation(ar.Files[0].Data)
    53  	if err != nil {
    54  		return nil, nil, fmt.Errorf("internal error during %s: failed to parse expectation %q: %v", testPath, string(ar.Files[0].Data), err)
    55  	}
    56  	return &buf, exp, nil
    57  }