@@ -100,13 +100,15 @@ teardown() {
100100@test " download retries on transient failure and succeeds" {
101101 export BUILDKITE_PLUGIN_MONOREPO_DIFF_DOWNLOAD=true
102102 export BUILDKITE_PLUGIN_MONOREPO_DIFF_BUILDKITE_PLUGIN_TEST_MODE=false
103+ # Disable checksum verification for this test to focus on retry logic
104+ export BUILDKITE_PLUGIN_MONOREPO_DIFF_VERIFY_CHECKSUM=false
103105 # Use pinned version to skip get_latest_version API call
104106 export BUILDKITE_PLUGINS=' [{"github.com/buildkite-plugins/monorepo-diff-buildkite-plugin#v1.0.0": {}}]'
105-
107+
106108 # Remove mock binary so it actually needs to download
107109 rm -f " $PWD /monorepo-diff-buildkite-plugin"
108110 rm -f " $PWD /monorepo-diff-buildkite-plugin.version"
109-
111+
110112 # Stub curl: fail twice on download, then succeed and create executable
111113 stub curl \
112114 " -fL * -o * : exit 1" \
@@ -149,3 +151,185 @@ teardown() {
149151
150152 unstub curl
151153}
154+
155+ # Tests for SHA256 checksum verification
156+
157+ @test " integration: download with valid checksum verification succeeds" {
158+ export BUILDKITE_PLUGIN_MONOREPO_DIFF_DOWNLOAD=true
159+ export BUILDKITE_PLUGIN_MONOREPO_DIFF_BUILDKITE_PLUGIN_TEST_MODE=false
160+ export BUILDKITE_PLUGIN_MONOREPO_DIFF_VERIFY_CHECKSUM=true
161+ # Use pinned version to skip get_latest_version API call
162+ export BUILDKITE_PLUGINS=' [{"github.com/buildkite-plugins/monorepo-diff-buildkite-plugin#v1.0.0": {}}]'
163+
164+ # Remove mock binary so it actually needs to download
165+ rm -f " $PWD /monorepo-diff-buildkite-plugin"
166+ rm -f " $PWD /monorepo-diff-buildkite-plugin.version"
167+
168+ # Expected checksum for mock binary
169+ local mock_binary_checksum=" 5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03"
170+
171+ # Stub sha256sum to be available
172+ stub sha256sum \
173+ " * : echo '${mock_binary_checksum} monorepo-diff-buildkite-plugin'"
174+
175+ # Stub curl: download binary and checksums.txt
176+ # Need to match all possible architectures in checksums.txt
177+ stub curl \
178+ " -fL * -o * : echo '#!/bin/bash' > \"\$ {4}\" ; echo 'echo test' >> \"\$ {4}\" ; exit 0" \
179+ " -fL * -o * : printf '%s\n' '${mock_binary_checksum} monorepo-diff-buildkite-plugin_Darwin_amd64' '${mock_binary_checksum} monorepo-diff-buildkite-plugin_Darwin_arm64' '${mock_binary_checksum} monorepo-diff-buildkite-plugin_Linux_amd64' '${mock_binary_checksum} monorepo-diff-buildkite-plugin_Linux_arm64' > \"\$ {4}\" ; exit 0"
180+
181+ run " $PWD /hooks/command"
182+
183+ assert_success
184+ assert_output --partial " Download successful"
185+ assert_output --partial " Checksum verification passed"
186+
187+ unstub curl
188+ unstub sha256sum
189+ }
190+
191+ @test " download with invalid checksum fails and deletes binary" {
192+ export BUILDKITE_PLUGIN_MONOREPO_DIFF_DOWNLOAD=true
193+ export BUILDKITE_PLUGIN_MONOREPO_DIFF_BUILDKITE_PLUGIN_TEST_MODE=false
194+ export BUILDKITE_PLUGIN_MONOREPO_DIFF_VERIFY_CHECKSUM=true
195+ export BUILDKITE_PLUGINS=' [{"github.com/buildkite-plugins/monorepo-diff-buildkite-plugin#v1.0.0": {}}]'
196+
197+ rm -f " $PWD /monorepo-diff-buildkite-plugin"
198+ rm -f " $PWD /monorepo-diff-buildkite-plugin.version"
199+
200+ # Expected checksum (different from actual)
201+ local expected_checksum=" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
202+ local actual_checksum=" bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
203+
204+ # Stub sha256sum to return mismatched checksum
205+ stub sha256sum \
206+ " * : echo '${actual_checksum} monorepo-diff-buildkite-plugin'"
207+
208+ # Stub curl: download binary and checksums.txt (with all architectures)
209+ stub curl \
210+ " -fL * -o * : echo '#!/bin/bash' > \"\$ {4}\" ; echo 'echo test' >> \"\$ {4}\" ; exit 0" \
211+ " -fL * -o * : printf '%s\n' '${expected_checksum} monorepo-diff-buildkite-plugin_Darwin_amd64' '${expected_checksum} monorepo-diff-buildkite-plugin_Darwin_arm64' '${expected_checksum} monorepo-diff-buildkite-plugin_Linux_amd64' '${expected_checksum} monorepo-diff-buildkite-plugin_Linux_arm64' > \"\$ {4}\" ; exit 0"
212+
213+ run " $PWD /hooks/command"
214+
215+ assert_failure
216+ assert_output --partial " Checksum verification failed"
217+ assert_output --partial " Expected: ${expected_checksum} "
218+ assert_output --partial " Actual: ${actual_checksum} "
219+
220+ # Verify binary was deleted
221+ [ ! -f " $PWD /monorepo-diff-buildkite-plugin" ]
222+
223+ unstub curl
224+ unstub sha256sum
225+ }
226+
227+ @test " cached binary with invalid checksum triggers recovery" {
228+ export BUILDKITE_PLUGIN_MONOREPO_DIFF_DOWNLOAD=true
229+ export BUILDKITE_PLUGIN_MONOREPO_DIFF_BUILDKITE_PLUGIN_TEST_MODE=false
230+ export BUILDKITE_PLUGIN_MONOREPO_DIFF_VERIFY_CHECKSUM=true
231+ export BUILDKITE_PLUGINS=' [{"github.com/buildkite-plugins/monorepo-diff-buildkite-plugin#v1.0.0": {}}]'
232+
233+ # Create a cached binary with version file
234+ echo " #!/bin/bash" > " $PWD /monorepo-diff-buildkite-plugin"
235+ echo " echo cached" >> " $PWD /monorepo-diff-buildkite-plugin"
236+ chmod +x " $PWD /monorepo-diff-buildkite-plugin"
237+ echo " v1.0.0" > " $PWD /monorepo-diff-buildkite-plugin.version"
238+
239+ local bad_checksum=" bad_cached_checksum_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
240+ local good_checksum=" 5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03"
241+
242+ # Stub sha256sum: first call returns bad checksum (cached), second returns good (after recovery)
243+ stub sha256sum \
244+ " * : echo '${bad_checksum} monorepo-diff-buildkite-plugin'" \
245+ " * : echo '${good_checksum} monorepo-diff-buildkite-plugin'"
246+
247+ # Stub curl: download checksums (first check), then binary, then checksums again (recovery check)
248+ stub curl \
249+ " -fL * -o * : printf '%s\n' '${good_checksum} monorepo-diff-buildkite-plugin_Darwin_amd64' '${good_checksum} monorepo-diff-buildkite-plugin_Darwin_arm64' '${good_checksum} monorepo-diff-buildkite-plugin_Linux_amd64' '${good_checksum} monorepo-diff-buildkite-plugin_Linux_arm64' > \"\$ {4}\" ; exit 0" \
250+ " -fL * -o * : echo '#!/bin/bash' > \"\$ {4}\" ; echo 'echo recovered' >> \"\$ {4}\" ; exit 0" \
251+ " -fL * -o * : printf '%s\n' '${good_checksum} monorepo-diff-buildkite-plugin_Darwin_amd64' '${good_checksum} monorepo-diff-buildkite-plugin_Darwin_arm64' '${good_checksum} monorepo-diff-buildkite-plugin_Linux_amd64' '${good_checksum} monorepo-diff-buildkite-plugin_Linux_arm64' > \"\$ {4}\" ; exit 0"
252+
253+ run " $PWD /hooks/command"
254+
255+ assert_success
256+ assert_output --partial " Cached binary failed checksum verification"
257+ assert_output --partial " attempting recovery"
258+ assert_output --partial " Binary recovery successful"
259+
260+ unstub curl
261+ unstub sha256sum
262+ }
263+
264+ @test " verify_checksum=false skips verification" {
265+ export BUILDKITE_PLUGIN_MONOREPO_DIFF_DOWNLOAD=true
266+ export BUILDKITE_PLUGIN_MONOREPO_DIFF_BUILDKITE_PLUGIN_TEST_MODE=false
267+ export BUILDKITE_PLUGIN_MONOREPO_DIFF_VERIFY_CHECKSUM=false
268+ export BUILDKITE_PLUGINS=' [{"github.com/buildkite-plugins/monorepo-diff-buildkite-plugin#v1.0.0": {}}]'
269+
270+ rm -f " $PWD /monorepo-diff-buildkite-plugin"
271+ rm -f " $PWD /monorepo-diff-buildkite-plugin.version"
272+
273+ # Stub curl: only download binary, no checksums
274+ stub curl \
275+ " -fL * -o * : echo '#!/bin/bash' > \"\$ {4}\" ; echo 'echo test' >> \"\$ {4}\" ; exit 0"
276+
277+ run " $PWD /hooks/command"
278+
279+ assert_success
280+ assert_output --partial " Download successful"
281+ refute_output --partial " Checksum verification"
282+ refute_output --partial " checksums.txt"
283+
284+ unstub curl
285+ }
286+
287+ @test " missing checksums.txt warns but continues" {
288+ export BUILDKITE_PLUGIN_MONOREPO_DIFF_DOWNLOAD=true
289+ export BUILDKITE_PLUGIN_MONOREPO_DIFF_BUILDKITE_PLUGIN_TEST_MODE=false
290+ export BUILDKITE_PLUGIN_MONOREPO_DIFF_VERIFY_CHECKSUM=true
291+ export BUILDKITE_PLUGINS=' [{"github.com/buildkite-plugins/monorepo-diff-buildkite-plugin#v1.0.0": {}}]'
292+
293+ rm -f " $PWD /monorepo-diff-buildkite-plugin"
294+ rm -f " $PWD /monorepo-diff-buildkite-plugin.version"
295+
296+ # Stub curl: download binary succeeds, checksums.txt fails
297+ stub curl \
298+ " -fL * -o * : echo '#!/bin/bash' > \"\$ {4}\" ; echo 'echo test' >> \"\$ {4}\" ; exit 0" \
299+ " -fL * -o * : exit 1"
300+
301+ run " $PWD /hooks/command"
302+
303+ assert_success
304+ assert_output --partial " Warning: Could not download checksums.txt"
305+ assert_output --partial " skipping verification"
306+
307+ unstub curl
308+ }
309+
310+ @test " missing sha256 command warns but continues" {
311+ export BUILDKITE_PLUGIN_MONOREPO_DIFF_DOWNLOAD=true
312+ export BUILDKITE_PLUGIN_MONOREPO_DIFF_BUILDKITE_PLUGIN_TEST_MODE=false
313+ export BUILDKITE_PLUGIN_MONOREPO_DIFF_VERIFY_CHECKSUM=true
314+ export BUILDKITE_PLUGINS=' [{"github.com/buildkite-plugins/monorepo-diff-buildkite-plugin#v1.0.0": {}}]'
315+
316+ rm -f " $PWD /monorepo-diff-buildkite-plugin"
317+ rm -f " $PWD /monorepo-diff-buildkite-plugin.version"
318+
319+ # Stub curl: download binary and checksums
320+ stub curl \
321+ " -fL * -o * : echo '#!/bin/bash' > \"\$ {4}\" ; echo 'echo test' >> \"\$ {4}\" ; exit 0" \
322+ " -fL * -o * : echo 'abc123 monorepo-diff-buildkite-plugin_Darwin_amd64' > \"\$ {4}\" ; exit 0"
323+
324+ # Ensure sha256sum, shasum, and sha256 are all unavailable by stubbing command -v
325+ # Note: This is tricky in bats. We'll rely on the implementation checking for these commands.
326+ # For this test, we assume the system doesn't have these tools or we mock the check.
327+
328+ run " $PWD /hooks/command"
329+
330+ # This test depends on implementation details. We may need to adjust based on how
331+ # we implement the sha256 command detection. For now, we expect it to warn and continue.
332+ assert_success
333+
334+ unstub curl
335+ }
0 commit comments