format.mx raw

   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  	"internal/trace/raw"
  11  	"internal/trace/version"
  12  	"internal/txtar"
  13  	"io"
  14  )
  15  
  16  // ParseFile parses a test file generated by the testgen package.
  17  func ParseFile(testPath []byte) (io.Reader, version.Version, *Expectation, error) {
  18  	ar, err := txtar.ParseFile(testPath)
  19  	if err != nil {
  20  		return nil, 0, nil, fmt.Errorf("failed to read test file for %s: %v", testPath, err)
  21  	}
  22  	if len(ar.Files) != 2 {
  23  		return nil, 0, nil, fmt.Errorf("malformed test %s: wrong number of files", testPath)
  24  	}
  25  	if ar.Files[0].Name != "expect" {
  26  		return nil, 0, 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, 0, 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, 0, 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, 0, 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, 0, nil, fmt.Errorf("malformed test %s: bad trace file: %v", testPath, err)
  47  		}
  48  		if err := tw.WriteEvent(ev); err != nil {
  49  			return nil, 0, 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, 0, nil, fmt.Errorf("internal error during %s: failed to parse expectation %q: %v", testPath, []byte(ar.Files[0].Data), err)
  55  	}
  56  	return &buf, tr.Version(), exp, nil
  57  }
  58