That fuck shit the fascists are using
at master 182 lines 8.7 kB view raw
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}