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 }