From e6b4118df4f18da2c4378fb2388d5274fce65219 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Wed, 10 Feb 2021 23:23:07 +0100
Subject: [PATCH] Cleanup ci containers

---
 ci-containers/build.gradle.kts                | 11 +++++
 .../de/kuschku/ci_containers/CiContainers.kt  | 28 +++++++++++
 .../ci_containers/CiContainersExtension.kt    | 47 +++++++++++++++++++
 .../GitlabCiProvidedContainer.kt              |  2 +-
 .../ci_containers}/ProvidedContainer.kt       |  2 +-
 .../TestContainersProvidedContainer.kt        |  2 +-
 .../ci_containers}/providedContainer.kt       |  2 +-
 libquassel/build.gradle.kts                   |  5 +-
 .../de/kuschku/libquassel/EndToEndTest.kt     | 16 ++-----
 .../libquassel/testutil/quasselContainer.kt   |  3 ++
 settings.gradle.kts                           |  3 +-
 11 files changed, 101 insertions(+), 20 deletions(-)
 create mode 100644 ci-containers/build.gradle.kts
 create mode 100644 ci-containers/src/main/kotlin/de/kuschku/ci_containers/CiContainers.kt
 create mode 100644 ci-containers/src/main/kotlin/de/kuschku/ci_containers/CiContainersExtension.kt
 rename {libquassel/src/test/kotlin/de/kuschku/libquassel/testutil => ci-containers/src/main/kotlin/de/kuschku/ci_containers}/GitlabCiProvidedContainer.kt (95%)
 rename {libquassel/src/test/kotlin/de/kuschku/libquassel/testutil => ci-containers/src/main/kotlin/de/kuschku/ci_containers}/ProvidedContainer.kt (95%)
 rename {libquassel/src/test/kotlin/de/kuschku/libquassel/testutil => ci-containers/src/main/kotlin/de/kuschku/ci_containers}/TestContainersProvidedContainer.kt (96%)
 rename {libquassel/src/test/kotlin/de/kuschku/libquassel/testutil => ci-containers/src/main/kotlin/de/kuschku/ci_containers}/providedContainer.kt (96%)

diff --git a/ci-containers/build.gradle.kts b/ci-containers/build.gradle.kts
new file mode 100644
index 000000000..504442f95
--- /dev/null
+++ b/ci-containers/build.gradle.kts
@@ -0,0 +1,11 @@
+plugins {
+  kotlin("jvm")
+}
+
+dependencies {
+  implementation(kotlin("stdlib"))
+
+  val testContainersVersion: String by project.extra
+  api("org.testcontainers", "testcontainers", testContainersVersion)
+  api("org.testcontainers", "junit-jupiter", testContainersVersion)
+}
diff --git a/ci-containers/src/main/kotlin/de/kuschku/ci_containers/CiContainers.kt b/ci-containers/src/main/kotlin/de/kuschku/ci_containers/CiContainers.kt
new file mode 100644
index 000000000..96cb82e03
--- /dev/null
+++ b/ci-containers/src/main/kotlin/de/kuschku/ci_containers/CiContainers.kt
@@ -0,0 +1,28 @@
+/*
+ * Quasseldroid - Quassel client for Android
+ *
+ * Copyright (c) 2021 Janne Mareike Koschinski
+ * Copyright (c) 2021 The Quassel Project
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package de.kuschku.ci_containers
+
+import org.junit.jupiter.api.extension.ExtendWith
+
+@MustBeDocumented
+@Target(AnnotationTarget.CLASS, AnnotationTarget.ANNOTATION_CLASS)
+@Retention(AnnotationRetention.RUNTIME)
+@ExtendWith(CiContainersExtension::class)
+annotation class CiContainers
diff --git a/ci-containers/src/main/kotlin/de/kuschku/ci_containers/CiContainersExtension.kt b/ci-containers/src/main/kotlin/de/kuschku/ci_containers/CiContainersExtension.kt
new file mode 100644
index 000000000..3a9d84d19
--- /dev/null
+++ b/ci-containers/src/main/kotlin/de/kuschku/ci_containers/CiContainersExtension.kt
@@ -0,0 +1,47 @@
+/*
+ * Quasseldroid - Quassel client for Android
+ *
+ * Copyright (c) 2021 Janne Mareike Koschinski
+ * Copyright (c) 2021 The Quassel Project
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package de.kuschku.ci_containers
+
+import org.junit.jupiter.api.extension.AfterEachCallback
+import org.junit.jupiter.api.extension.BeforeEachCallback
+import org.junit.jupiter.api.extension.ExtensionContext
+
+class CiContainersExtension : BeforeEachCallback, AfterEachCallback {
+  private fun getContainers(context: ExtensionContext?): List<ProvidedContainer> {
+    val containers = mutableListOf<ProvidedContainer>()
+    context?.requiredTestInstances?.allInstances?.forEach { instance ->
+      instance.javaClass.declaredFields.map { field ->
+        if (field.type == ProvidedContainer::class.java) {
+          field.trySetAccessible()
+          containers.add(field.get(instance) as ProvidedContainer)
+        }
+      }
+    }
+    return containers
+  }
+
+  override fun beforeEach(context: ExtensionContext?) {
+    getContainers(context).forEach(ProvidedContainer::start)
+  }
+
+  override fun afterEach(context: ExtensionContext?) {
+    getContainers(context).forEach(ProvidedContainer::stop)
+  }
+}
diff --git a/libquassel/src/test/kotlin/de/kuschku/libquassel/testutil/GitlabCiProvidedContainer.kt b/ci-containers/src/main/kotlin/de/kuschku/ci_containers/GitlabCiProvidedContainer.kt
similarity index 95%
rename from libquassel/src/test/kotlin/de/kuschku/libquassel/testutil/GitlabCiProvidedContainer.kt
rename to ci-containers/src/main/kotlin/de/kuschku/ci_containers/GitlabCiProvidedContainer.kt
index d3b246fef..2f49a38e8 100644
--- a/libquassel/src/test/kotlin/de/kuschku/libquassel/testutil/GitlabCiProvidedContainer.kt
+++ b/ci-containers/src/main/kotlin/de/kuschku/ci_containers/GitlabCiProvidedContainer.kt
@@ -17,7 +17,7 @@
  * with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 
-package de.kuschku.libquassel.testutil
+package de.kuschku.ci_containers
 
 import java.net.InetSocketAddress
 
diff --git a/libquassel/src/test/kotlin/de/kuschku/libquassel/testutil/ProvidedContainer.kt b/ci-containers/src/main/kotlin/de/kuschku/ci_containers/ProvidedContainer.kt
similarity index 95%
rename from libquassel/src/test/kotlin/de/kuschku/libquassel/testutil/ProvidedContainer.kt
rename to ci-containers/src/main/kotlin/de/kuschku/ci_containers/ProvidedContainer.kt
index 743d735bb..7056b507a 100644
--- a/libquassel/src/test/kotlin/de/kuschku/libquassel/testutil/ProvidedContainer.kt
+++ b/ci-containers/src/main/kotlin/de/kuschku/ci_containers/ProvidedContainer.kt
@@ -17,7 +17,7 @@
  * with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 
-package de.kuschku.libquassel.testutil
+package de.kuschku.ci_containers
 
 import java.net.InetSocketAddress
 
diff --git a/libquassel/src/test/kotlin/de/kuschku/libquassel/testutil/TestContainersProvidedContainer.kt b/ci-containers/src/main/kotlin/de/kuschku/ci_containers/TestContainersProvidedContainer.kt
similarity index 96%
rename from libquassel/src/test/kotlin/de/kuschku/libquassel/testutil/TestContainersProvidedContainer.kt
rename to ci-containers/src/main/kotlin/de/kuschku/ci_containers/TestContainersProvidedContainer.kt
index cc91fb4b1..7b76f4bf3 100644
--- a/libquassel/src/test/kotlin/de/kuschku/libquassel/testutil/TestContainersProvidedContainer.kt
+++ b/ci-containers/src/main/kotlin/de/kuschku/ci_containers/TestContainersProvidedContainer.kt
@@ -17,7 +17,7 @@
  * with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 
-package de.kuschku.libquassel.testutil
+package de.kuschku.ci_containers
 
 import org.testcontainers.containers.GenericContainer
 import java.net.InetSocketAddress
diff --git a/libquassel/src/test/kotlin/de/kuschku/libquassel/testutil/providedContainer.kt b/ci-containers/src/main/kotlin/de/kuschku/ci_containers/providedContainer.kt
similarity index 96%
rename from libquassel/src/test/kotlin/de/kuschku/libquassel/testutil/providedContainer.kt
rename to ci-containers/src/main/kotlin/de/kuschku/ci_containers/providedContainer.kt
index 8864b423e..219fb4d55 100644
--- a/libquassel/src/test/kotlin/de/kuschku/libquassel/testutil/providedContainer.kt
+++ b/ci-containers/src/main/kotlin/de/kuschku/ci_containers/providedContainer.kt
@@ -17,7 +17,7 @@
  * with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 
-package de.kuschku.libquassel.testutil
+package de.kuschku.ci_containers
 
 import java.net.InetSocketAddress
 
diff --git a/libquassel/build.gradle.kts b/libquassel/build.gradle.kts
index 3c3971b47..47ed5b5ab 100644
--- a/libquassel/build.gradle.kts
+++ b/libquassel/build.gradle.kts
@@ -31,8 +31,7 @@ dependencies {
   testRuntimeOnly("org.junit.jupiter", "junit-jupiter-engine", junit5Version)
   val hamcrestVersion: String by project.extra
   testImplementation("org.hamcrest", "hamcrest-library", hamcrestVersion)
-  val testContainersVersion: String by project.extra
-  testImplementation("org.testcontainers", "testcontainers", testContainersVersion)
-  testImplementation("org.testcontainers", "junit-jupiter", testContainersVersion)
+
+  testImplementation(project(":ci-containers"))
   testImplementation("org.slf4j", "slf4j-simple", "1.7.30")
 }
diff --git a/libquassel/src/test/kotlin/de/kuschku/libquassel/EndToEndTest.kt b/libquassel/src/test/kotlin/de/kuschku/libquassel/EndToEndTest.kt
index abfc7710c..54ad06b48 100644
--- a/libquassel/src/test/kotlin/de/kuschku/libquassel/EndToEndTest.kt
+++ b/libquassel/src/test/kotlin/de/kuschku/libquassel/EndToEndTest.kt
@@ -20,6 +20,8 @@
 package de.kuschku.libquassel
 
 import de.kuschku.bitflags.of
+import de.kuschku.ci_containers.CiContainers
+import de.kuschku.ci_containers.CiContainersExtension
 import de.kuschku.libquassel.protocol.connection.*
 import de.kuschku.libquassel.protocol.features.FeatureSet
 import de.kuschku.libquassel.protocol.io.ChainedByteBuffer
@@ -34,13 +36,13 @@ import de.kuschku.libquassel.testutil.quasselContainer
 import de.kuschku.quasseldroid.protocol.io.CoroutineChannel
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.runBlocking
-import org.junit.jupiter.api.AfterEach
-import org.junit.jupiter.api.BeforeEach
 import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.extension.ExtendWith
 import java.nio.ByteBuffer
 import javax.net.ssl.SSLContext
 
 @ExperimentalCoroutinesApi
+@CiContainers
 class EndToEndTest {
   private val quassel = quasselContainer()
 
@@ -53,16 +55,6 @@ class EndToEndTest {
   private val sendBuffer = ChainedByteBuffer(direct = true)
   private val channel = CoroutineChannel()
 
-  @BeforeEach
-  fun start() {
-    quassel.start()
-  }
-
-  @AfterEach
-  fun stop() {
-    quassel.stop()
-  }
-
   @Test
   fun testConnect() = runBlocking {
     channel.connect(quassel.address)
diff --git a/libquassel/src/test/kotlin/de/kuschku/libquassel/testutil/quasselContainer.kt b/libquassel/src/test/kotlin/de/kuschku/libquassel/testutil/quasselContainer.kt
index 37a304e91..44b7c1e78 100644
--- a/libquassel/src/test/kotlin/de/kuschku/libquassel/testutil/quasselContainer.kt
+++ b/libquassel/src/test/kotlin/de/kuschku/libquassel/testutil/quasselContainer.kt
@@ -19,6 +19,9 @@
 
 package de.kuschku.libquassel.testutil
 
+import de.kuschku.ci_containers.TestContainersProvidedContainer
+import de.kuschku.ci_containers.providedContainer
+
 fun quasselContainer() = providedContainer("QUASSEL_CONTAINER") {
   TestContainersProvidedContainer(
     QuasselCoreContainer(),
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 74ba77b6a..e1c2b62c8 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -25,5 +25,6 @@ include(
   ":bitflags",
   ":protocol",
   ":coverage-annotations",
-  ":libquassel"
+  ":libquassel",
+  ":ci-containers"
 )
-- 
GitLab