From 434b753fa9e169d009eab95784f7f016ffdb0387 Mon Sep 17 00:00:00 2001
From: Simon Ehrenstein <simon.ehrenstein@gmail.com>
Date: Sat, 23 Jan 2021 15:09:08 +0100
Subject: [PATCH] Add executionDuration to BenchmarkExecutor

---
 .../theodolite/execution/BenchmarkExecutor.kt |  3 +-
 .../execution/KafkaBenchmarkExecutor.kt       |  5 ++--
 .../execution/TheodoliteExecutor.kt           |  9 ++++--
 .../strategies/searchstrategy/BinarySearch.kt |  2 +-
 .../main/kotlin/theodolite/util/Benchmark.kt  |  7 ++---
 .../src/main/kotlin/theodolite/util/Config.kt |  4 ++-
 .../kotlin/theodolite/util/KafkaBenchmark.kt  |  2 +-
 .../theodolite/CompositeStrategyTest.kt       | 30 +++++++++++++++++++
 8 files changed, 49 insertions(+), 13 deletions(-)

diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/execution/BenchmarkExecutor.kt b/theodolite-quarkus/src/main/kotlin/theodolite/execution/BenchmarkExecutor.kt
index 591a2bc10..4f43e4c8c 100644
--- a/theodolite-quarkus/src/main/kotlin/theodolite/execution/BenchmarkExecutor.kt
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/execution/BenchmarkExecutor.kt
@@ -4,7 +4,8 @@ import theodolite.util.Benchmark
 import theodolite.util.LoadDimension
 import theodolite.util.Resource
 import theodolite.util.Results
+import java.time.Duration
 
-abstract class BenchmarkExecutor(val benchmark: Benchmark, val results: Results) {
+abstract class BenchmarkExecutor(val benchmark: Benchmark, val results: Results, val executionDuration: Duration) {
     abstract fun runExperiment(load: LoadDimension, res: Resource): Boolean;
 }
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/execution/KafkaBenchmarkExecutor.kt b/theodolite-quarkus/src/main/kotlin/theodolite/execution/KafkaBenchmarkExecutor.kt
index b2323b83e..730be8765 100644
--- a/theodolite-quarkus/src/main/kotlin/theodolite/execution/KafkaBenchmarkExecutor.kt
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/execution/KafkaBenchmarkExecutor.kt
@@ -4,12 +4,13 @@ import theodolite.util.Benchmark
 import theodolite.util.LoadDimension
 import theodolite.util.Resource
 import theodolite.util.Results
+import java.time.Duration
 
-class KafkaBenchmarkExecutor(benchmark: Benchmark, results: Results) : BenchmarkExecutor(benchmark, results) {
+class KafkaBenchmarkExecutor(benchmark: Benchmark, results: Results, executionDuration: Duration) : BenchmarkExecutor(benchmark, results, executionDuration) {
     override fun runExperiment(load: LoadDimension, res: Resource): Boolean {
         benchmark.start()
         // wait
-        benchmark.stop();
+        benchmark.stop()
         // evaluate
         val result = false // if success else false
         this.results.setResult(Pair(load, res), result)
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt b/theodolite-quarkus/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt
index e2c56c70c..b6554a6a9 100644
--- a/theodolite-quarkus/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt
@@ -4,12 +4,14 @@ import theodolite.strategies.restriction.LowerBoundRestriction
 import theodolite.strategies.searchstrategy.CompositeStrategy
 import theodolite.strategies.searchstrategy.LinearSearch
 import theodolite.util.*
+import java.time.Duration
 
 class TheodoliteExecutor() {
     private fun loadConfig(): Config {
-        val benchmark: Benchmark = KafkaBenchmark()
+        val benchmark: Benchmark = KafkaBenchmark(emptyMap())
         val results: Results = Results()
-        val executor: BenchmarkExecutor = KafkaBenchmarkExecutor(benchmark, results)
+        val executionDuration = Duration.ofSeconds(60*5 )
+        val executor: BenchmarkExecutor = KafkaBenchmarkExecutor(benchmark, results, executionDuration)
 
         val restrictionStrategy = LowerBoundRestriction(results)
         val searchStrategy = LinearSearch(executor, results)
@@ -17,7 +19,8 @@ class TheodoliteExecutor() {
         return Config(
             loads = (0..6).map{ number -> LoadDimension(number) },
             resources = (0..6).map{ number -> Resource(number) },
-            compositeStrategy = CompositeStrategy(executor, searchStrategy, restrictionStrategies = setOf(restrictionStrategy), results = results)
+            compositeStrategy = CompositeStrategy(executor, searchStrategy, restrictionStrategies = setOf(restrictionStrategy), results = results),
+            executionDuration = executionDuration
         )
     }
 
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt
index 1ce43d7bb..a1e1c8f3f 100644
--- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt
@@ -20,7 +20,7 @@ class BinarySearch(benchmarkExecutor: BenchmarkExecutor, results: Results) : Sea
             throw IllegalArgumentException()
         }
         if (lower == upper ) {
-            if (this.benchmarkExecutor.runExperiment(load, resources[upper])) return upper;
+            if (this.benchmarkExecutor.runExperiment(load, resources[lower])) return lower;
             else {
                 if (lower + 1 == resources.size) return - 1
                 return lower + 1;
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/util/Benchmark.kt b/theodolite-quarkus/src/main/kotlin/theodolite/util/Benchmark.kt
index f757128a2..c4cb2be17 100644
--- a/theodolite-quarkus/src/main/kotlin/theodolite/util/Benchmark.kt
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/util/Benchmark.kt
@@ -1,9 +1,8 @@
 package theodolite.util
 
 // todo: needs cluster and resource config
-interface Benchmark {
+abstract class Benchmark(val config: Map<String, Any>) {
+    abstract fun start();
 
-    fun start();
-
-    fun stop();
+    abstract fun stop();
 }
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/util/Config.kt b/theodolite-quarkus/src/main/kotlin/theodolite/util/Config.kt
index 7dff74366..6fb680c0a 100644
--- a/theodolite-quarkus/src/main/kotlin/theodolite/util/Config.kt
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/util/Config.kt
@@ -3,11 +3,13 @@ package theodolite.util
 import theodolite.strategies.restriction.RestrictionStrategy
 import theodolite.strategies.searchstrategy.CompositeStrategy
 import theodolite.strategies.searchstrategy.SearchStrategy
+import java.time.Duration
 
 data class Config(
     val loads: List<LoadDimension>,
     val resources: List<Resource>,
-    val compositeStrategy: CompositeStrategy
+    val compositeStrategy: CompositeStrategy,
+    val executionDuration: Duration
 ) {
 
 }
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/util/KafkaBenchmark.kt b/theodolite-quarkus/src/main/kotlin/theodolite/util/KafkaBenchmark.kt
index fdbb1cc93..3ed499bf6 100644
--- a/theodolite-quarkus/src/main/kotlin/theodolite/util/KafkaBenchmark.kt
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/util/KafkaBenchmark.kt
@@ -1,6 +1,6 @@
 package theodolite.util
 
-class KafkaBenchmark: Benchmark {
+class KafkaBenchmark(config: Map<String, Any>): Benchmark(config) {
 
     override fun start() {
         TODO("Not yet implemented")
diff --git a/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt b/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt
index ce031ddb1..0f9b1b850 100644
--- a/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt
+++ b/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt
@@ -8,6 +8,8 @@ import theodolite.strategies.searchstrategy.BinarySearch
 import theodolite.strategies.restriction.LowerBoundRestriction
 import theodolite.strategies.searchstrategy.CompositeStrategy
 import theodolite.execution.TestBenchmarkExecutor
+import theodolite.strategies.restriction.RestrictionStrategy
+import theodolite.strategies.searchstrategy.SearchStrategy
 import theodolite.util.*
 
 @QuarkusTest
@@ -75,6 +77,34 @@ class CompositeStrategyTest {
         assertEquals(actual, expected)
     }
 
+    @Test
+    fun testEnd2EndBinarySearch2() {
+        val mockResults = arrayOf(
+            arrayOf( true , true , true , true , true , true , true, true),
+            arrayOf( false, false, true , true , true , true , true, true),
+            arrayOf( false, false, true , true , true , true , true, true),
+            arrayOf( false, false, false, true , true , true , true, true),
+            arrayOf( false, false, false, false, true , true , true, true),
+            arrayOf( false, false, false, false, false, false, true, true),
+            arrayOf( false, false, false, false, false, false, false, true)
+        )
+        val mockLoads: List<LoadDimension> =  (0..6).map{number -> LoadDimension(number)}
+        val mockResources: List<Resource> =  (0..7).map{number -> Resource(number)}
+        val results: Results = Results();
+        val benchmark = TestBenchmark()
+        val benchmarkExecutor: TestBenchmarkExecutor = TestBenchmarkExecutor(mockResults, benchmark, results)
+        val binarySearch: BinarySearch = BinarySearch(benchmarkExecutor, results);
+        val lowerBoundRestriction: LowerBoundRestriction = LowerBoundRestriction(results);
+        val strategy: CompositeStrategy = CompositeStrategy(benchmarkExecutor, binarySearch, setOf(lowerBoundRestriction), results) // sets instead of lists
+
+        val actual: ArrayList<Resource?> = ArrayList<Resource?>()
+        val expected: ArrayList<Resource?> = ArrayList(listOf(0,2,2,3,4,6,7).map{ x -> Resource(x)})
 
+        for(load in mockLoads) {
+            actual.add(strategy.findSuitableResources(load, mockResources))
+        }
+
+        assertEquals(actual, expected)
+    }
 
 }
\ No newline at end of file
-- 
GitLab