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

org.jetbrains.kotlinx.jupyter.test.CapturingStreamTests.kt Maven / Gradle / Ivy

package org.jetbrains.kotlinx.jupyter.test

import org.jetbrains.kotlinx.jupyter.repl.OutputConfig
import org.jetbrains.kotlinx.jupyter.streams.CapturingOutputStream
import org.junit.jupiter.api.Assertions.assertArrayEquals
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.Test
import java.io.OutputStream
import java.io.PrintStream
import java.util.concurrent.atomic.AtomicInteger

class CapturingStreamTests {
    private val nullOStream =
        object : OutputStream() {
            override fun write(b: Int) {
            }
        }

    private fun getStream(
        stdout: OutputStream = nullOStream,
        captureOutput: Boolean = true,
        maxBufferLifeTimeMs: Long = 1000,
        maxBufferSize: Int = 1000,
        maxOutputSize: Int = 1000,
        maxBufferNewlineSize: Int = 1,
        onCaptured: (String) -> Unit = {},
    ): CapturingOutputStream {
        val printStream = PrintStream(stdout, false, "UTF-8")
        val config = OutputConfig(captureOutput, maxBufferLifeTimeMs, maxBufferSize, maxOutputSize, maxBufferNewlineSize)
        return CapturingOutputStream(printStream, config, captureOutput, onCaptured)
    }

    @Test
    fun testMaxOutputSizeOk() {
        val s = getStream(maxOutputSize = 6)
        s.write("kotlin".toByteArray())
    }

    @Test
    fun testMaxOutputSizeError() {
        val s = getStream(maxOutputSize = 3)
        s.write("java".toByteArray())
        assertArrayEquals("jav".toByteArray(), s.contents)
    }

    @Test
    fun testOutputCapturingFlag() {
        val contents = "abc".toByteArray()

        val s1 = getStream(captureOutput = false)
        s1.write(contents)
        assertEquals(0, s1.contents.size)

        val s2 = getStream(captureOutput = true)
        s2.write(contents)
        assertArrayEquals(contents, s2.contents)
    }

    @Test
    fun testMaxBufferSize() {
        val contents = "0123456789\nfortran".toByteArray()
        val expected = arrayOf("012", "345", "678", "9\n", "for", "tra", "n")

        val i = AtomicInteger()
        val s =
            getStream(maxBufferSize = 3) {
                assertEquals(expected[i.getAndIncrement()], it)
            }

        s.write(contents)
        s.flush()

        assertEquals(expected.size, i.get())
    }

    @Test
    fun testNewlineBufferSize() {
        val contents = "12345\n12\n3451234567890".toByteArray()
        val expected = arrayOf("12345\n", "12\n", "345123456", "7890")

        val i = AtomicInteger()
        val s =
            getStream(maxBufferSize = 9, maxBufferNewlineSize = 6) {
                assertEquals(expected[i.getAndIncrement()], it)
            }

        s.write(contents)
        s.flush()

        assertEquals(expected.size, i.get())
    }

    @Test
    @Disabled("This test is flaky, enable after fix")
    fun testMaxBufferLifeTime() {
        val strings = arrayOf("11", "22", "33", "44", "55", "66")
        val expected = arrayOf("1122", "3344", "5566")

        val timeDelta = 2000L
        var i = 0
        val s =
            getStream(maxBufferLifeTimeMs = 2 * timeDelta) {
                synchronized(this) {
                    assertEquals(expected[i++], it)
                }
            }

        Thread.sleep(timeDelta / 2)
        strings.forEach {
            s.write(it.toByteArray())
            Thread.sleep(timeDelta)
        }

        s.flush()
        s.close()

        assertEquals(expected.size, i)
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy