All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonTest.maryk.rocksdb.KeyMayExistTest.kt Maven / Gradle / Ivy

package maryk.rocksdb

import maryk.assertContentEquals
import maryk.encodeToByteArray
import maryk.decodeToString
import maryk.rocksdb.util.createTestDBFolder
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertFalse
import kotlin.test.assertNotNull
import kotlin.test.assertTrue

class KeyMayExistTest {
    init {
        loadRocksDBLibrary()
    }

    private fun createTestFolder() = createTestDBFolder("KeyMayExistTest")

    @Test
    fun keyMayExist() {
        val cfDescriptors = listOf(
            ColumnFamilyDescriptor(defaultColumnFamily),
            ColumnFamilyDescriptor("new_cf".encodeToByteArray())
        )

        val columnFamilyHandleList = mutableListOf()
        DBOptions().apply {
            setCreateIfMissing(true)
            setCreateMissingColumnFamilies(true)
        }.use { options ->
            openRocksDB(
                options,
                createTestFolder(),
                cfDescriptors, columnFamilyHandleList
            ).use { db ->
                try {
                    assertEquals(2, columnFamilyHandleList.size)
                    db.put("key".encodeToByteArray(), "value".encodeToByteArray())
                    // Test without column family
                    var holder = Holder()
                    var exists = db.keyMayExist("key".encodeToByteArray(), holder)
                    assertTrue(exists)
                    assertNotNull(holder.getValue())
                    assertEquals("value", holder.getValue()?.decodeToString())

                    // Slice key
                    val builder = StringBuilder("prefix")
                    val offset = builder.toString().length
                    builder.append("slice key 0")
                    val len = builder.toString().length - offset
                    builder.append("suffix")

                    val sliceKey = builder.toString().encodeToByteArray()
                    val sliceValue = "slice value 0".encodeToByteArray()
                    db.put(sliceKey, offset, len, sliceValue, 0, sliceValue.size)

                    exists = db.keyMayExist(sliceKey, offset, len, holder)
                    assertTrue(exists)
                    assertContentEquals(sliceValue, holder.getValue())

                    // Test without column family but with readOptions
                    ReadOptions().use { readOptions ->
                        exists = db.keyMayExist(readOptions, "key".encodeToByteArray(), holder)
                        assertTrue(exists)
                        assertNotNull(holder.getValue())
                        assertEquals("value", holder.getValue()?.decodeToString())

                        exists = db.keyMayExist(readOptions, sliceKey, offset, len, holder)
                        assertTrue(exists)
                        assertNotNull(holder.getValue())
                        assertContentEquals(sliceValue, holder.getValue())
                    }

                    // Test with column family
                    exists = db.keyMayExist(
                        columnFamilyHandleList[0], "key".encodeToByteArray(),
                        holder
                    )
                    assertTrue(exists)
                    assertNotNull(holder.getValue())
                    assertEquals("value", holder.getValue()?.decodeToString())

                    // Test slice sky with column family
                    holder = Holder()
                    exists = db.keyMayExist(
                        columnFamilyHandleList[0], sliceKey, offset, len,
                        holder
                    )
                    assertTrue(exists)
                    assertContentEquals(sliceValue, holder.getValue())

                    // Test with column family and readOptions
                    ReadOptions().use { readOptions ->
                        exists = db.keyMayExist(
                            columnFamilyHandleList[0], readOptions,
                            "key".encodeToByteArray(),
                            holder
                        )
                        assertTrue(exists)
                        assertEquals("value", holder.getValue()?.decodeToString())

                        // Test slice key with column family and read options
                        exists = db.keyMayExist(
                            columnFamilyHandleList[0], readOptions,
                            sliceKey, offset, len,
                            holder
                        )
                        assertTrue(exists)
                        assertContentEquals(sliceValue, holder.getValue())
                    }

                    // KeyMayExist in CF1 must return false
                    assertFalse(
                        db.keyMayExist(
                            columnFamilyHandleList[1],
                            "key".encodeToByteArray(), holder
                        )
                    )

                    // slice key
                    assertFalse(
                        db.keyMayExist(
                            columnFamilyHandleList[1],
                            sliceKey, 1, 3, holder
                        )
                    )
                } finally {
                    for (columnFamilyHandle in columnFamilyHandleList) {
                        columnFamilyHandle.close()
                    }
                }
            }
        }
    }

    @Test
    fun keyMayExistNonUnicodeString() {
        Options().apply {
            setCreateIfMissing(true)
            setCreateMissingColumnFamilies(true)
        }.use { options ->
            openRocksDB(
                options,
                createTestFolder()
            ).use { db ->
                val key = "key".encodeToByteArray()
                val value = byteArrayOf(0x80.toByte()) // invalid unicode code-point

                db.put(key, value)

                val buf = ByteArray(10)
                val read = db.get(key, buf)
                assertEquals(1, read)
                assertTrue { buf[0] == 0x80.toByte() }

                val holder = Holder()
                var exists = db.keyMayExist(key, holder)
                assertTrue(exists)
                assertNotNull(holder.getValue())
                assertContentEquals(value, holder.getValue())
                exists = db.keyMayExist(key, null)
                assertTrue(exists)
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy