summaryrefslogtreecommitdiff
path: root/opendc-trace/opendc-trace-gwf
diff options
context:
space:
mode:
Diffstat (limited to 'opendc-trace/opendc-trace-gwf')
-rw-r--r--opendc-trace/opendc-trace-gwf/build.gradle.kts2
-rw-r--r--opendc-trace/opendc-trace-gwf/src/main/kotlin/org/opendc/trace/gwf/GwfTaskTableReader.kt25
-rw-r--r--opendc-trace/opendc-trace-gwf/src/test/kotlin/org/opendc/trace/gwf/GwfTraceFormatTest.kt19
3 files changed, 44 insertions, 2 deletions
diff --git a/opendc-trace/opendc-trace-gwf/build.gradle.kts b/opendc-trace/opendc-trace-gwf/build.gradle.kts
index 1105a465..0c041439 100644
--- a/opendc-trace/opendc-trace-gwf/build.gradle.kts
+++ b/opendc-trace/opendc-trace-gwf/build.gradle.kts
@@ -31,4 +31,6 @@ dependencies {
api(projects.opendcTrace.opendcTraceApi)
implementation(libs.jackson.dataformat.csv)
+
+ testImplementation(projects.opendcTrace.opendcTraceTestkit)
}
diff --git a/opendc-trace/opendc-trace-gwf/src/main/kotlin/org/opendc/trace/gwf/GwfTaskTableReader.kt b/opendc-trace/opendc-trace-gwf/src/main/kotlin/org/opendc/trace/gwf/GwfTaskTableReader.kt
index 007ab90a..f9a171e9 100644
--- a/opendc-trace/opendc-trace-gwf/src/main/kotlin/org/opendc/trace/gwf/GwfTaskTableReader.kt
+++ b/opendc-trace/opendc-trace-gwf/src/main/kotlin/org/opendc/trace/gwf/GwfTaskTableReader.kt
@@ -37,15 +37,24 @@ import java.util.regex.Pattern
* A [TableReader] implementation for the GWF format.
*/
internal class GwfTaskTableReader(private val parser: CsvParser) : TableReader {
+ /**
+ * A flag to indicate whether a single row has been read already.
+ */
+ private var isStarted = false
+
init {
parser.schema = schema
}
override fun nextRow(): Boolean {
+ if (!isStarted) {
+ isStarted = true
+ }
+
// Reset the row state
reset()
- if (!nextStart()) {
+ if (parser.isClosed || !nextStart()) {
return false
}
@@ -84,7 +93,7 @@ internal class GwfTaskTableReader(private val parser: CsvParser) : TableReader {
}
override fun isNull(index: Int): Boolean {
- check(index in 0..COL_DEPS) { "Invalid column" }
+ require(index in 0..COL_DEPS) { "Invalid column" }
return false
}
@@ -93,6 +102,7 @@ internal class GwfTaskTableReader(private val parser: CsvParser) : TableReader {
}
override fun getInt(index: Int): Int {
+ checkActive()
return when (index) {
COL_REQ_NPROC -> reqNProcs
COL_NPROC -> nProcs
@@ -113,6 +123,7 @@ internal class GwfTaskTableReader(private val parser: CsvParser) : TableReader {
}
override fun getString(index: Int): String? {
+ checkActive()
return when (index) {
COL_JOB_ID -> jobId
COL_WORKFLOW_ID -> workflowId
@@ -125,6 +136,7 @@ internal class GwfTaskTableReader(private val parser: CsvParser) : TableReader {
}
override fun getInstant(index: Int): Instant? {
+ checkActive()
return when (index) {
COL_SUBMIT_TIME -> submitTime
else -> throw IllegalArgumentException("Invalid column")
@@ -132,6 +144,7 @@ internal class GwfTaskTableReader(private val parser: CsvParser) : TableReader {
}
override fun getDuration(index: Int): Duration? {
+ checkActive()
return when (index) {
COL_RUNTIME -> runtime
else -> throw IllegalArgumentException("Invalid column")
@@ -147,6 +160,7 @@ internal class GwfTaskTableReader(private val parser: CsvParser) : TableReader {
}
override fun <T> getSet(index: Int, elementType: Class<T>): Set<T>? {
+ checkActive()
return when (index) {
COL_DEPS -> TYPE_DEPS.convertTo(dependencies, elementType)
else -> throw IllegalArgumentException("Invalid column")
@@ -158,6 +172,13 @@ internal class GwfTaskTableReader(private val parser: CsvParser) : TableReader {
}
/**
+ * Helper method to check if the reader is active.
+ */
+ private fun checkActive() {
+ check(isStarted && !parser.isClosed) { "No active row. Did you call nextRow()?" }
+ }
+
+ /**
* The pattern used to parse the parents.
*/
private val pattern = Pattern.compile("\\s+")
diff --git a/opendc-trace/opendc-trace-gwf/src/test/kotlin/org/opendc/trace/gwf/GwfTraceFormatTest.kt b/opendc-trace/opendc-trace-gwf/src/test/kotlin/org/opendc/trace/gwf/GwfTraceFormatTest.kt
index dd0e6066..a8c3a715 100644
--- a/opendc-trace/opendc-trace-gwf/src/test/kotlin/org/opendc/trace/gwf/GwfTraceFormatTest.kt
+++ b/opendc-trace/opendc-trace-gwf/src/test/kotlin/org/opendc/trace/gwf/GwfTraceFormatTest.kt
@@ -24,7 +24,10 @@ package org.opendc.trace.gwf
import org.junit.jupiter.api.*
import org.junit.jupiter.api.Assertions.*
+import org.opendc.trace.TableColumn
+import org.opendc.trace.TableReader
import org.opendc.trace.conv.*
+import org.opendc.trace.testkit.TableReaderTestKit
import java.nio.file.Paths
import java.time.Duration
import java.time.Instant
@@ -32,6 +35,7 @@ import java.time.Instant
/**
* Test suite for the [GwfTraceFormat] class.
*/
+@DisplayName("GWF TraceFormat")
internal class GwfTraceFormatTest {
private val format = GwfTraceFormat()
@@ -88,4 +92,19 @@ internal class GwfTraceFormatTest {
{ assertEquals(setOf("4", "5", "6"), reader.getSet(TASK_PARENTS, String::class.java)) },
)
}
+
+ @DisplayName("TableReader for Tasks")
+ @Nested
+ inner class TasksTableReaderTest : TableReaderTestKit() {
+ override lateinit var reader: TableReader
+ override lateinit var columns: List<TableColumn>
+
+ @BeforeEach
+ fun setUp() {
+ val path = Paths.get(checkNotNull(GwfTraceFormatTest::class.java.getResource("/trace.gwf")).toURI())
+
+ columns = format.getDetails(path, TABLE_TASKS).columns
+ reader = format.newReader(path, TABLE_TASKS, null)
+ }
+ }
}