/*
 * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
 */

package kotlinx.coroutines.experimental.io

import com.devexperts.dxlab.lincheck.*
import com.devexperts.dxlab.lincheck.annotations.*
import com.devexperts.dxlab.lincheck.paramgen.*
import com.devexperts.dxlab.lincheck.stress.*
import kotlinx.coroutines.experimental.*
import org.junit.*

@Param(name = "value", gen = IntGen::class, conf = "1:8192")
@OpGroupConfigs(
        OpGroupConfig(name = "write", nonParallel = true),
        OpGroupConfig(name = "read", nonParallel = true)
)
class ByteChannelLinearizabilityTest : TestBase() {
    private lateinit var channel: ByteChannel
    private val lr = LinTesting()

    @Reset
    fun reset() {
        channel = ByteChannel()
    }

    @Operation(runOnce = true, group = "write")
    fun writeInt1(@Param(name = "value") value: Int) = lr.run("writeInt1") {
        channel.writeInt(value)
    }

    @Operation(runOnce = true, group = "write")
    fun writeInt2(@Param(name = "value") value: Int) = lr.run("writeInt2") {
        channel.writeInt(value)
    }

    @Operation(runOnce = true, group = "read")
    fun readInt1() = lr.run("readInt1") {
        channel.readInt()
    }

    @Operation(runOnce = true, group = "read")
    fun readInt2() = lr.run("readInt2") {
        channel.readInt()
    }

    @Operation(group = "write")
    fun close() = lr.run("close") {
        channel.close()
    }

    @Operation
    fun flush() = lr.run("flush") {
        channel.flush()
    }

    @Test
    fun test() {
        val options = StressOptions()
            .iterations(100)
            .invocationsPerIteration(1000 * stressTestMultiplier)
            .addThread(1, 1)
            .addThread(1, 1)
            .addThread(1, 1)
            .verifier(LinVerifier::class.java)
        LinChecker.check(ByteChannelLinearizabilityTest::class.java, options)
    }
}