github.com/replit/upm@v0.0.0-20240423230255-9ce4fc3ea24c/test-suite/utils/backend_t.go (about)

     1  package testUtils
     2  
     3  import (
     4  	"embed"
     5  	"io"
     6  	"os"
     7  	"os/exec"
     8  	"path"
     9  	"strings"
    10  	"testing"
    11  
    12  	"github.com/replit/upm/internal/api"
    13  )
    14  
    15  type BackendT struct {
    16  	Backend   api.LanguageBackend
    17  	t         *testing.T
    18  	templates *embed.FS
    19  	testDir   string
    20  }
    21  
    22  func (bt BackendT) assertT() {
    23  	if bt.t == nil {
    24  		panic("BackendT not started")
    25  	}
    26  }
    27  
    28  func InitBackendT(
    29  	backend api.LanguageBackend,
    30  	templates *embed.FS,
    31  ) BackendT {
    32  	return BackendT{
    33  		Backend:   backend,
    34  		templates: templates,
    35  	}
    36  }
    37  
    38  func (bt BackendT) Fail(fmt string, args ...interface{}) {
    39  	bt.t.Helper()
    40  	bt.t.Fatalf(fmt, args...)
    41  }
    42  
    43  func (bt *BackendT) Start(t *testing.T) {
    44  	bt.t = t
    45  }
    46  
    47  func (bt BackendT) Subtest(name string, test func(bt BackendT)) {
    48  	bt.assertT()
    49  	bt.t.Run(name, func(t *testing.T) {
    50  		inner := InitBackendT(bt.Backend, bt.templates)
    51  		inner.t = t
    52  		test(inner)
    53  	})
    54  }
    55  
    56  func (bt *BackendT) TestDir() string {
    57  	if bt.testDir == "" {
    58  		bt.assertT()
    59  		bt.testDir = bt.t.TempDir()
    60  	}
    61  
    62  	return bt.testDir
    63  }
    64  
    65  func (bt *BackendT) AddTestFile(template, as string) {
    66  	templates := *bt.templates
    67  
    68  	f, err := templates.Open(template)
    69  	if err != nil {
    70  		bt.t.Fatalf("failed to get template %s: %v", template, err)
    71  	}
    72  
    73  	dstPath := path.Join(bt.TestDir(), as)
    74  	dst, err := os.OpenFile(dstPath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0o644)
    75  	if err != nil {
    76  		bt.t.Fatalf("failed to open or create test file %s: %v", dstPath, err)
    77  	}
    78  
    79  	_, err = io.Copy(dst, f)
    80  	if err != nil {
    81  		bt.t.Fatalf("failed to read template %s: %v", template, err)
    82  	}
    83  }
    84  
    85  func (bt *BackendT) Exec(command string, args ...string) (struct{ Stdout, Stderr string }, error) {
    86  	bt.Log("$ %s %s", command, strings.Join(args, " "))
    87  
    88  	cmd := exec.Command(command, args...)
    89  	cmd.Dir = bt.TestDir()
    90  
    91  	stdout := strings.Builder{}
    92  	cmd.Stdout = &stdout
    93  
    94  	stderr := strings.Builder{}
    95  	cmd.Stderr = &stderr
    96  
    97  	err := cmd.Run()
    98  
    99  	Stdout := stdout.String()
   100  	Stderr := stderr.String()
   101  
   102  	bt.Log("=== STDOUT ===\n%s", Stdout)
   103  	bt.Log("=== STDERR ===\n%s", Stderr)
   104  
   105  	return struct{ Stdout, Stderr string }{
   106  		Stdout,
   107  		Stderr,
   108  	}, err
   109  }
   110  
   111  func (bt *BackendT) Log(format string, args ...interface{}) {
   112  	bt.t.Logf(format, args...)
   113  }