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  }