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 }