github.com/myhau/pulumi/pkg/v3@v3.70.2-0.20221116134521-f2775972e587/backend/display/progress_test.go (about) 1 package display 2 3 import ( 4 "bytes" 5 "fmt" 6 "os" 7 "path/filepath" 8 "testing" 9 10 "github.com/pulumi/pulumi/pkg/v3/backend/display/internal/terminal" 11 "github.com/pulumi/pulumi/pkg/v3/engine" 12 "github.com/pulumi/pulumi/sdk/v3/go/common/diag/colors" 13 "github.com/pulumi/pulumi/sdk/v3/go/common/util/cmdutil" 14 "github.com/stretchr/testify/assert" 15 "github.com/stretchr/testify/require" 16 ) 17 18 func testProgressEvents(t *testing.T, path string, accept, interactive bool, width, height int, raw bool) { 19 events, err := loadEvents(path) 20 require.NoError(t, err) 21 22 suffix := ".non-interactive" 23 if interactive { 24 suffix = fmt.Sprintf(".interactive-%vx%v", width, height) 25 if !raw { 26 suffix += "-cooked" 27 } 28 } 29 30 var expectedStdout []byte 31 var expectedStderr []byte 32 if !accept { 33 expectedStdout, err = os.ReadFile(path + suffix + ".stdout.txt") 34 require.NoError(t, err) 35 36 expectedStderr, err = os.ReadFile(path + suffix + ".stderr.txt") 37 require.NoError(t, err) 38 } 39 40 eventChannel, doneChannel := make(chan engine.Event), make(chan bool) 41 42 var stdout bytes.Buffer 43 var stderr bytes.Buffer 44 45 go ShowProgressEvents("test", "update", "stack", "project", eventChannel, doneChannel, Options{ 46 IsInteractive: interactive, 47 Color: colors.Raw, 48 ShowConfig: true, 49 ShowReplacementSteps: true, 50 ShowSameResources: true, 51 ShowReads: true, 52 Stdout: &stdout, 53 Stderr: &stderr, 54 term: terminal.NewMockTerminal(&stdout, width, height, true), 55 deterministicOutput: true, 56 }, false) 57 58 for _, e := range events { 59 eventChannel <- e 60 } 61 <-doneChannel 62 63 if !accept { 64 assert.Equal(t, string(expectedStdout), string(stdout.Bytes())) 65 assert.Equal(t, string(expectedStderr), string(stderr.Bytes())) 66 } else { 67 err = os.WriteFile(path+suffix+".stdout.txt", stdout.Bytes(), 0600) 68 require.NoError(t, err) 69 70 err = os.WriteFile(path+suffix+".stderr.txt", stderr.Bytes(), 0600) 71 require.NoError(t, err) 72 } 73 } 74 75 func TestProgressEvents(t *testing.T) { 76 t.Parallel() 77 78 accept := cmdutil.IsTruthy(os.Getenv("PULUMI_ACCEPT")) 79 80 entries, err := os.ReadDir("testdata/not-truncated") 81 require.NoError(t, err) 82 83 dimensions := []struct{ width, height int }{ 84 {width: 80, height: 24}, 85 {width: 100, height: 80}, 86 {width: 200, height: 80}, 87 } 88 89 //nolint:paralleltest 90 for _, entry := range entries { 91 if entry.IsDir() || filepath.Ext(entry.Name()) != ".json" { 92 continue 93 } 94 95 path := filepath.Join("testdata/not-truncated", entry.Name()) 96 97 t.Run(entry.Name()+"interactive", func(t *testing.T) { 98 t.Parallel() 99 100 for _, dim := range dimensions { 101 width, height := dim.width, dim.height 102 t.Run(fmt.Sprintf("%vx%v", width, height), func(t *testing.T) { 103 t.Parallel() 104 105 t.Run("raw", func(t *testing.T) { 106 testProgressEvents(t, path, accept, true, width, height, true) 107 }) 108 109 t.Run("cooked", func(t *testing.T) { 110 testProgressEvents(t, path, accept, true, width, height, false) 111 }) 112 }) 113 } 114 }) 115 116 t.Run(entry.Name()+"non-interactive", func(t *testing.T) { 117 t.Parallel() 118 119 testProgressEvents(t, path, accept, false, 80, 24, false) 120 }) 121 } 122 }