LegacyInventoryTests.kt (3939B)
1 package tera.smoke 2 3 import java.nio.ByteBuffer 4 import kotlin.test.Test 5 import kotlin.test.assertEquals 6 import kotlin.test.assertFailsWith 7 import kotlin.test.assertFalse 8 import kotlin.test.assertNotNull 9 import kotlin.test.assertNull 10 import kotlin.test.assertTrue 11 import kotlinx.coroutines.runBlocking 12 import uniffi.tera_core.FfiAddCommandType 13 import uniffi.tera_core.FfiConverterTypeFfiLegacyDraftListEntry 14 import uniffi.tera_core.FfiConverterTypeFfiLegacyDraftPageRecord 15 import uniffi.tera_core.FfiLegacyDraftListEntry 16 import uniffi.tera_core.FfiLegacyDraftRepairReason 17 import uniffi.tera_core.TeraAppException 18 19 class LegacyInventoryTests { 20 @Test 21 fun nativeLegacyPagesPreserveOperationsAcrossRestartAndRejectMalformedCursors(): Unit = runBlocking { 22 SmokeFixture().use { fixture -> 23 val runtime = fixture.runtime() 24 val input = fixture.draft(emptyList()).copy(commandType = FfiAddCommandType.CREATE_UPDATE) 25 val saved = (1..2).map { runtime.phase1SaveAddIntent(input, null, null) } 26 val first = try { 27 val page = runtime.legacyDraftPage(1u, 1u, null) 28 assertEquals(PUBLIC_KEY, page.authorPublicKey) 29 assertEquals(1u.toUShort(), page.schemaVersion) 30 assertEquals(1, page.entries.size) 31 assertNotNull(page.nextCursor) 32 val summary = (page.entries.single() as FfiLegacyDraftListEntry.Draft).summary 33 assertTrue(summary.hasForm) 34 assertFalse(summary.isRevision) 35 assertEquals(0uL, summary.mediaCount) 36 assertEquals(0uL, summary.verifiedMediaCount) 37 assertEquals(0uL, summary.possibleOrphanCount) 38 assertNull(summary.settlement) 39 assertEquals(page, FfiConverterTypeFfiLegacyDraftPageRecord.lift(FfiConverterTypeFfiLegacyDraftPageRecord.lower(page))) 40 assertEquals("unsupported_schema_version", assertFailsWith<TeraAppException.Failure> { 41 runtime.legacyDraftPage(2u, 1u, null) 42 }.report.code) 43 assertEquals("draft_inventory_invalid", assertFailsWith<TeraAppException.Failure> { 44 runtime.legacyDraftPage(1u, 0u, null) 45 }.report.code) 46 for (cursor in listOf("invalid", page.nextCursor!!.uppercase(), page.nextCursor!! + "0")) { 47 assertEquals("draft_inventory_cursor_invalid", assertFailsWith<TeraAppException.Failure> { 48 runtime.legacyDraftPage(1u, 1u, cursor) 49 }.report.code) 50 } 51 page 52 } finally { 53 runtime.shutdown() 54 runtime.close() 55 } 56 val reopened = fixture.runtime() 57 try { 58 val last = reopened.legacyDraftPage(1u, 1u, first.nextCursor) 59 assertNull(last.nextCursor) 60 assertEquals(saved.map { it.draftId }.toSet(), (first.entries + last.entries).map { 61 (it as FfiLegacyDraftListEntry.Draft).summary.draftId 62 }.toSet()) 63 for (draft in saved) assertEquals(draft, reopened.phase1DraftStatus(draft.draftId)) 64 for (reason in FfiLegacyDraftRepairReason.entries) { 65 val repair = FfiLegacyDraftListEntry.Repair("00".repeat(16), ULong.MAX_VALUE, reason) 66 assertEquals(repair, FfiConverterTypeFfiLegacyDraftListEntry.lift(FfiConverterTypeFfiLegacyDraftListEntry.lower(repair))) 67 } 68 for (bytes in listOf(byteArrayOf(), byteArrayOf(0, 0, 0, 99), byteArrayOf(0, 0, 0, 1))) { 69 assertFailsWith<RuntimeException> { FfiConverterTypeFfiLegacyDraftListEntry.read(ByteBuffer.wrap(bytes)) } 70 } 71 } finally { 72 reopened.shutdown() 73 reopened.close() 74 } 75 } 76 } 77 }