Handle null pathElements gracefully in message passing API (#480)

In messages "List Resources Response" and "List Modules Response",
if `pathElements` and `error` are both null, default to an empty list.
This commit is contained in:
Daniel Chao
2024-05-08 07:22:57 -07:00
committed by GitHub
parent 21aa44cfc4
commit 7da643fc8f
4 changed files with 86 additions and 4 deletions

View File

@@ -97,7 +97,7 @@ internal class ClientModuleKeyFactory(
if (response.error != null) {
completeExceptionally(IOException(response.error))
} else {
complete(response.pathElements!!)
complete(response.pathElements ?: emptyList())
}
}
else -> completeExceptionally(ProtocolException("unexpected response"))

View File

@@ -68,10 +68,10 @@ internal class ClientResourceReader(
transport.send(request) { response ->
when (response) {
is ListResourcesResponse ->
if (response.pathElements != null) {
complete(response.pathElements)
} else {
if (response.error != null) {
completeExceptionally(IOException(response.error))
} else {
complete(response.pathElements ?: emptyList())
}
else -> completeExceptionally(ProtocolException("Unexpected response"))
}

View File

@@ -294,6 +294,43 @@ class ServerTest {
)
}
@Test
fun `glob resources -- null pathElements and null error`() {
val reader = ResourceReaderSpec(scheme = "bird", hasHierarchicalUris = true, isGlobbable = true)
val evaluatorId = client.sendCreateEvaluatorRequest(resourceReaders = listOf(reader))
client.send(
EvaluateRequest(
requestId = 1,
evaluatorId = evaluatorId,
moduleUri = URI("repl:text"),
moduleText =
"""
res = read*("bird:/**.txt").keys
"""
.trimIndent(),
expr = "res"
)
)
val listResourcesRequest = client.receive<ListResourcesRequest>()
client.send(
ListResourcesResponse(
requestId = listResourcesRequest.requestId,
evaluatorId = listResourcesRequest.evaluatorId,
pathElements = null,
error = null
)
)
val evaluateResponse = client.receive<EvaluateResponse>()
assertThat(evaluateResponse.result!!.debugYaml)
.isEqualTo(
"""
- 6
- []
"""
.trimIndent()
)
}
@Test
fun `glob resource error`() {
val reader = ResourceReaderSpec(scheme = "bird", hasHierarchicalUris = true, isGlobbable = true)
@@ -505,6 +542,47 @@ class ServerTest {
)
}
@Test
fun `glob module -- null pathElements and null error`() {
val reader =
ModuleReaderSpec(
scheme = "bird",
hasHierarchicalUris = true,
isLocal = true,
isGlobbable = true
)
val evaluatorId = client.sendCreateEvaluatorRequest(moduleReaders = listOf(reader))
client.send(
EvaluateRequest(
requestId = 1,
evaluatorId = evaluatorId,
moduleUri = URI("repl:text"),
moduleText = """res = import*("bird:/**.pkl").keys""",
expr = "res"
)
)
val listModulesMsg = client.receive<ListModulesRequest>()
client.send(
ListModulesResponse(
requestId = listModulesMsg.requestId,
evaluatorId = evaluatorId,
pathElements = null,
error = null
)
)
val evaluateResponse = client.receive<EvaluateResponse>()
assertThat(evaluateResponse.result!!.debugRendering)
.isEqualTo(
"""
- 6
- []
"""
.trimIndent()
)
}
@Test
fun `glob module error`() {
val reader =