@@ -2,6 +2,7 @@ package com.bazel_diff.hash
22
33import assertk.assertThat
44import assertk.assertions.isEqualTo
5+ import assertk.assertions.isNotEqualTo
56import assertk.assertions.isNull
67import com.bazel_diff.bazel.BazelSourceFileTarget
78import com.bazel_diff.extensions.toHexString
@@ -38,6 +39,7 @@ internal class SourceFileHasherTest : KoinTest {
3839 val expected =
3940 sha256 {
4041 safePutBytes(fixtureFileContent)
42+ putBytes(byteArrayOf(0x01 ))
4143 safePutBytes(seed)
4244 safePutBytes(fixtureFileTarget.toByteArray())
4345 }
@@ -53,6 +55,7 @@ internal class SourceFileHasherTest : KoinTest {
5355 val expected =
5456 sha256 {
5557 safePutBytes(fixtureFileContent)
58+ putBytes(byteArrayOf(0x01 ))
5659 safePutBytes(seed)
5760 safePutBytes(fixtureFileTarget.toByteArray())
5861 }
@@ -68,6 +71,7 @@ internal class SourceFileHasherTest : KoinTest {
6871 hasher.digest(bazelSourceFileTarget, setOf (Paths .get(" some/other/path" ))).toHexString()
6972 val expected =
7073 sha256 {
74+ putBytes(byteArrayOf(0x01 ))
7175 safePutBytes(seed)
7276 safePutBytes(fixtureFileTarget.toByteArray())
7377 }
@@ -89,6 +93,7 @@ internal class SourceFileHasherTest : KoinTest {
8993 val expected =
9094 sha256 {
9195 safePutBytes(externalRepoFileContent.toByteArray())
96+ putBytes(byteArrayOf(0x01 ))
9297 safePutBytes(seed)
9398 safePutBytes(externalRepoFileTarget.toByteArray())
9499 }
@@ -104,6 +109,7 @@ internal class SourceFileHasherTest : KoinTest {
104109 val expected =
105110 sha256 {
106111 safePutBytes(fixtureFileContent)
112+ putBytes(byteArrayOf(0x01 ))
107113 safePutBytes(seed)
108114 safePutBytes(fixtureFileTarget.toByteArray())
109115 }
@@ -136,6 +142,7 @@ internal class SourceFileHasherTest : KoinTest {
136142 val actual = hasher.digest(bazelSourceFileTarget).toHexString()
137143 val expected =
138144 sha256 {
145+ putBytes(byteArrayOf(0x00 ))
139146 safePutBytes(seed)
140147 safePutBytes(target.toByteArray())
141148 }
@@ -163,6 +170,7 @@ internal class SourceFileHasherTest : KoinTest {
163170 val expected =
164171 sha256 {
165172 safePutBytes(" foo-content-hash" .toByteArray())
173+ putBytes(byteArrayOf(0x01 ))
166174 safePutBytes(seed)
167175 safePutBytes(fixtureFileTarget.toByteArray())
168176 }
@@ -180,6 +188,7 @@ internal class SourceFileHasherTest : KoinTest {
180188 val expected =
181189 sha256 {
182190 safePutBytes(fixtureFileContent)
191+ putBytes(byteArrayOf(0x01 ))
183192 safePutBytes(seed)
184193 safePutBytes(fixtureFileTarget.toByteArray())
185194 }
@@ -198,10 +207,40 @@ internal class SourceFileHasherTest : KoinTest {
198207 val expected =
199208 sha256 {
200209 safePutBytes(" foo-content-hash" .toByteArray())
210+ putBytes(byteArrayOf(0x01 ))
201211 safePutBytes(seed)
202212 safePutBytes(targetName.toByteArray())
203213 }
204214 .toHexString()
205215 assertThat(actual).isEqualTo(expected)
206216 }
217+
218+ @Test
219+ fun testHashEmptyFileVsDeletedFile () = runBlocking<Unit > {
220+ // Create a temp directory for testing
221+ val testDir = Files .createTempDirectory(" empty_file_test" )
222+ val emptyFilePath = testDir.resolve(" path/to/empty.txt" )
223+ Files .createDirectories(emptyFilePath.parent)
224+ Files .createFile(emptyFilePath)
225+
226+ val emptyFileTarget = " //path/to:empty.txt"
227+ val hasher = SourceFileHasherImpl (testDir, null , externalRepoResolver)
228+
229+ // Hash the empty file (file exists)
230+ val emptyFileHash = hasher.digest(BazelSourceFileTarget (emptyFileTarget, seed)).toHexString()
231+
232+ // Delete the file
233+ Files .delete(emptyFilePath)
234+
235+ // Hash the non-existent file
236+ val deletedFileHash = hasher.digest(BazelSourceFileTarget (emptyFileTarget, seed)).toHexString()
237+
238+ // The hashes should be different (file exists vs file missing)
239+ assertThat(emptyFileHash).isNotEqualTo(deletedFileHash)
240+
241+ // Clean up
242+ Files .deleteIfExists(emptyFilePath.parent)
243+ Files .deleteIfExists(testDir.resolve(" path" ))
244+ Files .deleteIfExists(testDir)
245+ }
207246}
0 commit comments