That fuck shit the fascists are using
1package org.tm.archive.database
2
3import android.net.Uri
4import androidx.test.ext.junit.runners.AndroidJUnit4
5import androidx.test.filters.FlakyTest
6import org.junit.Assert.assertEquals
7import org.junit.Assert.assertNotEquals
8import org.junit.Before
9import org.junit.Ignore
10import org.junit.Test
11import org.junit.runner.RunWith
12import org.tm.archive.attachments.AttachmentId
13import org.tm.archive.attachments.UriAttachment
14import org.tm.archive.mms.MediaStream
15import org.tm.archive.mms.SentMediaQuality
16import org.tm.archive.providers.BlobProvider
17import org.tm.archive.testing.assertIs
18import org.tm.archive.testing.assertIsNot
19import org.tm.archive.util.MediaUtil
20import java.util.Optional
21
22@RunWith(AndroidJUnit4::class)
23class AttachmentTableTest {
24
25 @Before
26 fun setUp() {
27 SignalDatabase.attachments.deleteAllAttachments()
28 }
29
30 @Test
31 fun givenABlob_whenIInsert2AttachmentsForPreUpload_thenIExpectDistinctIdsButSameFileName() {
32 val blob = BlobProvider.getInstance().forData(byteArrayOf(1, 2, 3, 4, 5)).createForSingleSessionInMemory()
33 val highQualityProperties = createHighQualityTransformProperties()
34 val highQualityImage = createAttachment(1, blob, highQualityProperties)
35 val attachment = SignalDatabase.attachments.insertAttachmentForPreUpload(highQualityImage)
36 val attachment2 = SignalDatabase.attachments.insertAttachmentForPreUpload(highQualityImage)
37
38 assertNotEquals(attachment2.attachmentId, attachment.attachmentId)
39 assertEquals(attachment2.fileName, attachment.fileName)
40 }
41
42 @FlakyTest
43 @Test
44 fun givenABlobAndDifferentTransformQuality_whenIInsert2AttachmentsForPreUpload_thenIExpectDifferentFileInfos() {
45 val blob = BlobProvider.getInstance().forData(byteArrayOf(1, 2, 3, 4, 5)).createForSingleSessionInMemory()
46 val highQualityProperties = createHighQualityTransformProperties()
47 val highQualityImage = createAttachment(1, blob, highQualityProperties)
48 val lowQualityImage = createAttachment(1, blob, AttachmentTable.TransformProperties.empty())
49 val attachment = SignalDatabase.attachments.insertAttachmentForPreUpload(highQualityImage)
50 val attachment2 = SignalDatabase.attachments.insertAttachmentForPreUpload(lowQualityImage)
51
52 SignalDatabase.attachments.updateAttachmentData(
53 attachment,
54 createMediaStream(byteArrayOf(1, 2, 3, 4, 5))
55 )
56
57 SignalDatabase.attachments.updateAttachmentData(
58 attachment2,
59 createMediaStream(byteArrayOf(1, 2, 3))
60 )
61
62 val attachment1Info = SignalDatabase.attachments.getDataFileInfo(attachment.attachmentId)
63 val attachment2Info = SignalDatabase.attachments.getDataFileInfo(attachment2.attachmentId)
64
65 assertNotEquals(attachment1Info, attachment2Info)
66 }
67
68 @FlakyTest
69 @Ignore("test is flaky")
70 @Test
71 fun givenIdenticalAttachmentsInsertedForPreUpload_whenIUpdateAttachmentDataAndSpecifyOnlyModifyThisAttachment_thenIExpectDifferentFileInfos() {
72 val blob = BlobProvider.getInstance().forData(byteArrayOf(1, 2, 3, 4, 5)).createForSingleSessionInMemory()
73 val highQualityProperties = createHighQualityTransformProperties()
74 val highQualityImage = createAttachment(1, blob, highQualityProperties)
75 val attachment = SignalDatabase.attachments.insertAttachmentForPreUpload(highQualityImage)
76 val attachment2 = SignalDatabase.attachments.insertAttachmentForPreUpload(highQualityImage)
77
78 SignalDatabase.attachments.updateAttachmentData(
79 attachment,
80 createMediaStream(byteArrayOf(1, 2, 3, 4, 5))
81 )
82
83 SignalDatabase.attachments.updateAttachmentData(
84 attachment2,
85 createMediaStream(byteArrayOf(1, 2, 3, 4))
86 )
87
88 val attachment1Info = SignalDatabase.attachments.getDataFileInfo(attachment.attachmentId)
89 val attachment2Info = SignalDatabase.attachments.getDataFileInfo(attachment2.attachmentId)
90
91 assertNotEquals(attachment1Info, attachment2Info)
92 }
93
94 /**
95 * Given: A previous attachment and two pre-upload attachments with the same data but different transform properties (standard and high).
96 *
97 * When changing content of standard pre-upload attachment to match pre-existing attachment
98 *
99 * Then update standard pre-upload attachment to match previous attachment, do not update high pre-upload attachment, and do
100 * not delete shared pre-upload uri from disk as it is still being used by the high pre-upload attachment.
101 */
102 @Test
103 fun doNotDeleteDedupedFileIfUsedByAnotherAttachmentWithADifferentTransformProperties() {
104 // GIVEN
105 val uncompressData = byteArrayOf(1, 2, 3, 4, 5)
106 val compressedData = byteArrayOf(1, 2, 3)
107
108 val blobUncompressed = BlobProvider.getInstance().forData(uncompressData).createForSingleSessionInMemory()
109
110 val previousAttachment = createAttachment(1, BlobProvider.getInstance().forData(compressedData).createForSingleSessionInMemory(), AttachmentTable.TransformProperties.empty())
111 val previousDatabaseAttachmentId: AttachmentId = SignalDatabase.attachments.insertAttachmentsForMessage(1, listOf(previousAttachment), emptyList()).values.first()
112
113 val standardQualityPreUpload = createAttachment(1, blobUncompressed, AttachmentTable.TransformProperties.empty())
114 val standardDatabaseAttachment = SignalDatabase.attachments.insertAttachmentForPreUpload(standardQualityPreUpload)
115
116 val highQualityPreUpload = createAttachment(1, blobUncompressed, AttachmentTable.TransformProperties.forSentMediaQuality(Optional.empty(), SentMediaQuality.HIGH))
117 val highDatabaseAttachment = SignalDatabase.attachments.insertAttachmentForPreUpload(highQualityPreUpload)
118
119 // WHEN
120 SignalDatabase.attachments.updateAttachmentData(standardDatabaseAttachment, createMediaStream(compressedData))
121
122 // THEN
123 val previousInfo = SignalDatabase.attachments.getDataFileInfo(previousDatabaseAttachmentId)!!
124 val standardInfo = SignalDatabase.attachments.getDataFileInfo(standardDatabaseAttachment.attachmentId)!!
125 val highInfo = SignalDatabase.attachments.getDataFileInfo(highDatabaseAttachment.attachmentId)!!
126
127 assertNotEquals(standardInfo, highInfo)
128 highInfo.file assertIsNot standardInfo.file
129 highInfo.file.exists() assertIs true
130 }
131
132 /**
133 * Given: Three pre-upload attachments with the same data but different transform properties (1x standard and 2x high).
134 *
135 * When inserting content of high pre-upload attachment.
136 *
137 * Then do not deduplicate with standard pre-upload attachment, but do deduplicate second high insert.
138 */
139 @Test
140 fun doNotDedupedFileIfUsedByAnotherAttachmentWithADifferentTransformProperties() {
141 // GIVEN
142 val uncompressData = byteArrayOf(1, 2, 3, 4, 5)
143 val blobUncompressed = BlobProvider.getInstance().forData(uncompressData).createForSingleSessionInMemory()
144
145 val standardQualityPreUpload = createAttachment(1, blobUncompressed, AttachmentTable.TransformProperties.empty())
146 val standardDatabaseAttachment = SignalDatabase.attachments.insertAttachmentForPreUpload(standardQualityPreUpload)
147
148 // WHEN
149 val highQualityPreUpload = createAttachment(1, blobUncompressed, AttachmentTable.TransformProperties.forSentMediaQuality(Optional.empty(), SentMediaQuality.HIGH))
150 val highDatabaseAttachment = SignalDatabase.attachments.insertAttachmentForPreUpload(highQualityPreUpload)
151
152 val secondHighQualityPreUpload = createAttachment(1, blobUncompressed, AttachmentTable.TransformProperties.forSentMediaQuality(Optional.empty(), SentMediaQuality.HIGH))
153 val secondHighDatabaseAttachment = SignalDatabase.attachments.insertAttachmentForPreUpload(secondHighQualityPreUpload)
154
155 // THEN
156 val standardInfo = SignalDatabase.attachments.getDataFileInfo(standardDatabaseAttachment.attachmentId)!!
157 val highInfo = SignalDatabase.attachments.getDataFileInfo(highDatabaseAttachment.attachmentId)!!
158 val secondHighInfo = SignalDatabase.attachments.getDataFileInfo(secondHighDatabaseAttachment.attachmentId)!!
159
160 highInfo.file assertIsNot standardInfo.file
161 secondHighInfo.file assertIs highInfo.file
162 standardInfo.file.exists() assertIs true
163 highInfo.file.exists() assertIs true
164 }
165
166 private fun createAttachment(id: Long, uri: Uri, transformProperties: AttachmentTable.TransformProperties): UriAttachment {
167 return UriAttachmentBuilder.build(
168 id,
169 uri = uri,
170 contentType = MediaUtil.IMAGE_JPEG,
171 transformProperties = transformProperties
172 )
173 }
174
175 private fun createHighQualityTransformProperties(): AttachmentTable.TransformProperties {
176 return AttachmentTable.TransformProperties.forSentMediaQuality(Optional.empty(), SentMediaQuality.HIGH)
177 }
178
179 private fun createMediaStream(byteArray: ByteArray): MediaStream {
180 return MediaStream(byteArray.inputStream(), MediaUtil.IMAGE_JPEG, 2, 2)
181 }
182}