github.com/wmuizelaar/kpt@v0.0.0-20221018115725-bd564717b2ed/internal/fnruntime/fnerrors_test.go (about)

     1  // Copyright 2021 Google LLC
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package fnruntime
    16  
    17  import (
    18  	"bytes"
    19  	"testing"
    20  
    21  	"github.com/stretchr/testify/assert"
    22  )
    23  
    24  func TestExecErrorString(t *testing.T) {
    25  	testcases := []struct {
    26  		name        string
    27  		fnExecError ExecError
    28  		truncate    bool
    29  		expected    string
    30  	}{
    31  		{
    32  			name:        "no truncate - empty stderr",
    33  			fnExecError: ExecError{},
    34  			expected: `  Stderr:
    35      ""
    36    Exit Code: 0
    37  `,
    38  		},
    39  		{
    40  			name: "no truncate - normal failure",
    41  			fnExecError: ExecError{
    42  				Stderr: `error message1
    43  error message2`,
    44  				ExitCode: 1,
    45  			},
    46  			expected: `  Stderr:
    47      "error message1"
    48      "error message2"
    49    Exit Code: 1
    50  `,
    51  		},
    52  		{
    53  			name: "no truncate - long stderr",
    54  			fnExecError: ExecError{
    55  				Stderr: `error message
    56  error message
    57  error message
    58  error message
    59  error message`,
    60  				ExitCode: 1,
    61  			},
    62  			expected: `  Stderr:
    63      "error message"
    64      "error message"
    65      "error message"
    66      "error message"
    67      "error message"
    68    Exit Code: 1
    69  `,
    70  		},
    71  		{
    72  			name: "truncate - normal failure",
    73  			fnExecError: ExecError{
    74  				Stderr: `error message
    75  error message
    76  error message
    77  error message`,
    78  				ExitCode: 1,
    79  			},
    80  			truncate: true,
    81  			expected: `  Stderr:
    82      "error message"
    83      "error message"
    84      "error message"
    85      "error message"
    86    Exit Code: 1
    87  `,
    88  		},
    89  		{
    90  			name: "truncate - long stderr 1",
    91  			fnExecError: ExecError{
    92  				Stderr: `error message
    93  error message
    94  error message
    95  error message
    96  error message`,
    97  				ExitCode: 1,
    98  			},
    99  			truncate: true,
   100  			expected: `  Stderr:
   101      "error message"
   102      "error message"
   103      "error message"
   104      "error message"
   105      ...(1 line(s) truncated, use '--truncate-output=false' to disable)
   106    Exit Code: 1
   107  `,
   108  		},
   109  		{
   110  			name: "truncate - long stderr 2",
   111  			fnExecError: ExecError{
   112  				Stderr: `error message
   113  error message
   114  error message
   115  error message
   116  error message
   117  error message
   118  error message
   119  error message`,
   120  				ExitCode: 1,
   121  			},
   122  			truncate: true,
   123  			expected: `  Stderr:
   124      "error message"
   125      "error message"
   126      "error message"
   127      "error message"
   128      ...(4 line(s) truncated, use '--truncate-output=false' to disable)
   129    Exit Code: 1
   130  `,
   131  		},
   132  	}
   133  	for _, tc := range testcases {
   134  		tc := tc
   135  		t.Run(tc.name, func(t *testing.T) {
   136  			tc.fnExecError.TruncateOutput = tc.truncate
   137  			s := tc.fnExecError.String()
   138  			assert.EqualValues(t, tc.expected, s)
   139  		})
   140  	}
   141  }
   142  
   143  func TestDockerCLIOutputFilter(t *testing.T) {
   144  	testcases := []struct {
   145  		name     string
   146  		input    string
   147  		expected string
   148  	}{
   149  		{
   150  			name: "should filter docker CLI output successfully",
   151  			input: `Unable to find image 'gcr.io/kpt-fn/starlark:v0.3' locally
   152  v0.3: Pulling from kpt-fn/starlark
   153  4e9f2cdf4387: Already exists
   154  aafbf7df3ddf: Pulling fs layer
   155  aafbf7df3ddf: Verifying Checksum
   156  aafbf7df3ddf: Download complete
   157  aafbf7df3ddf: Pull complete
   158  6b759ab96cb2: Waiting
   159  Digest: sha256:c347e28606fa1a608e8e02e03541a5a46e4a0152005df4a11e44f6c4ab1edd9a
   160  Status: Downloaded newer image for gcr.io/kpt-fn/starlark:v0.3
   161  `,
   162  			expected: "",
   163  		},
   164  		{
   165  			name: "should filter docker messages and shouldn't truncate trailing lines",
   166  			input: `Unable to find image 'gcr.io/kpt-fn/starlark:v0.3' locally
   167  v0.3: Pulling from kpt-fn/starlark
   168  4e9f2cdf4387: Already exists
   169  aafbf7df3ddf: Pulling fs layer
   170  aafbf7df3ddf: Verifying Checksum
   171  aafbf7df3ddf: Download complete
   172  aafbf7df3ddf: Pull complete
   173  6b759ab96cb2: Waiting
   174  Digest: sha256:c347e28606fa1a608e8e02e03541a5a46e4a0152005df4a11e44f6c4ab1edd9a
   175  Status: Downloaded newer image for gcr.io/kpt-fn/starlark:v0.3
   176  line before last line
   177  lastline
   178  
   179  `,
   180  			expected: `line before last line
   181  lastline
   182  `,
   183  		},
   184  		{
   185  			name: "should filter interleaved docker messages",
   186  			input: `firstline
   187  Unable to find image 'gcr.io/kpt-fn/starlark:v0.3' locally
   188  v0.3: Pulling from kpt-fn/starlark
   189  4e9f2cdf4387: Already exists
   190  aafbf7df3ddf: Pulling fs layer
   191  aafbf7df3ddf: Verifying Checksum
   192  line in the middle
   193  aafbf7df3ddf: Download complete
   194  aafbf7df3ddf: Pull complete
   195  6b759ab96cb2: Waiting
   196  Digest: sha256:c347e28606fa1a608e8e02e03541a5a46e4a0152005df4a11e44f6c4ab1edd9a
   197  Status: Downloaded newer image for gcr.io/kpt-fn/starlark:v0.3
   198  lastline
   199  `,
   200  			expected: `firstline
   201  line in the middle
   202  lastline`,
   203  		},
   204  	}
   205  
   206  	for _, tc := range testcases {
   207  		tc := tc
   208  		t.Run(tc.name, func(t *testing.T) {
   209  			s := filterDockerCLIOutput(bytes.NewBufferString(tc.input))
   210  			assert.Equal(t, tc.expected, s)
   211  		})
   212  	}
   213  }