LockFreeListLinearizabilityTest using Lincheck
diff --git a/kotlinx-coroutines-core/pom.xml b/kotlinx-coroutines-core/pom.xml
index 462a9b8..1f00939 100644
--- a/kotlinx-coroutines-core/pom.xml
+++ b/kotlinx-coroutines-core/pom.xml
@@ -33,6 +33,22 @@
<kotlin.compiler.jdkHome>${env.JDK_16}</kotlin.compiler.jdkHome>
</properties>
+ <repositories>
+ <repository>
+ <id>bintray-devexperts</id>
+ <url>https://dl.bintray.com/devexperts/Maven/</url>
+ </repository>
+ </repositories>
+
+ <dependencies>
+ <dependency>
+ <groupId>com.devexperts.lincheck</groupId>
+ <artifactId>core</artifactId>
+ <version>1.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
<build>
<sourceDirectory>src/main/kotlin</sourceDirectory>
<testSourceDirectory>src/test/kotlin</testSourceDirectory>
diff --git a/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/internal/LockFreeListLinearizabilityTest.kt b/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/internal/LockFreeListLinearizabilityTest.kt
new file mode 100644
index 0000000..96c3c19
--- /dev/null
+++ b/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/internal/LockFreeListLinearizabilityTest.kt
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2016-2017 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package kotlinx.coroutines.experimental.internal
+
+import com.devexperts.dxlab.lincheck.LinChecker
+import com.devexperts.dxlab.lincheck.annotations.CTest
+import com.devexperts.dxlab.lincheck.annotations.Operation
+import com.devexperts.dxlab.lincheck.annotations.Param
+import com.devexperts.dxlab.lincheck.annotations.Reset
+import com.devexperts.dxlab.lincheck.generators.IntGen
+import org.junit.Test
+
+
+@CTest(iterations = 100, actorsPerThread = arrayOf("1:2", "1:2", "1:2", "1:2"))
+@Param(name = "value", gen = IntGen::class, conf = "1:3")
+class LockFreeListLinearizabilityTest {
+ class Node(val value: Int): LockFreeLinkedListNode()
+
+ lateinit var q: LockFreeLinkedListHead
+
+ @Reset
+ fun reset() {
+ q = LockFreeLinkedListHead()
+ }
+
+ @Operation
+ fun addLast(@Param(name = "value") value: Int) {
+ q.addLast(Node(value))
+ }
+
+ @Operation
+ fun addLastIfNotSame(@Param(name = "value") value: Int) {
+ q.addLastIfPrev(Node(value)) { !it.isSame(value) }
+ }
+
+ @Operation
+ fun removeFirst(): Int? {
+ val node = q.removeFirstOrNull() ?: return null
+ return (node as Node).value
+ }
+
+ @Operation
+ fun removeFirstOrPeekIfNotSame(@Param(name = "value") value: Int): Int? {
+ val node = q.removeFirstIfIsInstanceOfOrPeekIf<Node> { !it.isSame(value) } ?: return null
+ return (node as Node).value
+ }
+
+ fun Any.isSame(value: Int) = this is Node && this.value == value
+
+ @Test
+ fun testAddRemoveLinearizability() {
+ LinChecker.check(this)
+ }
+}
\ No newline at end of file