mirror of
https://github.com/apple/pkl.git
synced 2026-04-23 00:38:37 +02:00
Handle null contents gracefully in message passing API (#657)
In messages "Read Resource Response" and "Read Module Response", if `contents` and `error` are both null, default to an empty byte array/string. This resolves one of the issues reported in #656
This commit is contained in:
@@ -414,6 +414,8 @@ The response to <<read-resource-request>>.
|
|||||||
If successful, `contents` is set.
|
If successful, `contents` is set.
|
||||||
Otherwise, `error` is set.
|
Otherwise, `error` is set.
|
||||||
|
|
||||||
|
If neither is set, `contents` defaults to an empty byte array.
|
||||||
|
|
||||||
[source,pkl]
|
[source,pkl]
|
||||||
----
|
----
|
||||||
/// A number identifying this request.
|
/// A number identifying this request.
|
||||||
@@ -463,6 +465,8 @@ The response to <<read-module-request>>.
|
|||||||
If successful, `contents` is set.
|
If successful, `contents` is set.
|
||||||
Otherwise, `error` is set.
|
Otherwise, `error` is set.
|
||||||
|
|
||||||
|
If neither is set, `contents` defaults to an empty string.
|
||||||
|
|
||||||
[source,pkl]
|
[source,pkl]
|
||||||
----
|
----
|
||||||
/// A number identifying this request.
|
/// A number identifying this request.
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ internal class ClientModuleKeyFactory(
|
|||||||
if (response.error != null) {
|
if (response.error != null) {
|
||||||
completeExceptionally(IOException(response.error))
|
completeExceptionally(IOException(response.error))
|
||||||
} else {
|
} else {
|
||||||
complete(response.contents!!)
|
complete(response.contents ?: "")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ internal class ClientResourceReader(
|
|||||||
if (response.error != null) {
|
if (response.error != null) {
|
||||||
completeExceptionally(IOException(response.error))
|
completeExceptionally(IOException(response.error))
|
||||||
} else {
|
} else {
|
||||||
complete(response.contents!!)
|
complete(response.contents ?: ByteArray(0))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
|
|||||||
@@ -180,6 +180,43 @@ abstract class AbstractServerTest {
|
|||||||
assertThat(value.asStringValue().asString()).isEqualTo("my bahumbug")
|
assertThat(value.asStringValue().asString()).isEqualTo("my bahumbug")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `read resource -- null contents and null error`() {
|
||||||
|
val reader =
|
||||||
|
ResourceReaderSpec(scheme = "bahumbug", hasHierarchicalUris = true, isGlobbable = false)
|
||||||
|
val evaluatorId = client.sendCreateEvaluatorRequest(resourceReaders = listOf(reader))
|
||||||
|
|
||||||
|
client.send(
|
||||||
|
EvaluateRequest(
|
||||||
|
requestId = 1,
|
||||||
|
evaluatorId = evaluatorId,
|
||||||
|
moduleUri = URI("repl:text"),
|
||||||
|
moduleText = """res = read("bahumbug:/foo.pkl").text""",
|
||||||
|
expr = "res"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
val readResourceMsg = client.receive<ReadResourceRequest>()
|
||||||
|
assertThat(readResourceMsg.uri.toString()).isEqualTo("bahumbug:/foo.pkl")
|
||||||
|
assertThat(readResourceMsg.evaluatorId).isEqualTo(evaluatorId)
|
||||||
|
|
||||||
|
client.send(
|
||||||
|
ReadResourceResponse(
|
||||||
|
requestId = readResourceMsg.requestId,
|
||||||
|
evaluatorId = evaluatorId,
|
||||||
|
contents = null,
|
||||||
|
error = null
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
val evaluateResponse = client.receive<EvaluateResponse>()
|
||||||
|
assertThat(evaluateResponse.error).isNull()
|
||||||
|
|
||||||
|
val unpacker = MessagePack.newDefaultUnpacker(evaluateResponse.result)
|
||||||
|
val value = unpacker.unpackValue()
|
||||||
|
assertThat(value.asStringValue().asString()).isEqualTo("")
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `read resource error`() {
|
fun `read resource error`() {
|
||||||
val reader =
|
val reader =
|
||||||
@@ -391,6 +428,49 @@ abstract class AbstractServerTest {
|
|||||||
assertThat(value.asIntegerValue().asInt()).isEqualTo(5)
|
assertThat(value.asIntegerValue().asInt()).isEqualTo(5)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `read module -- null contents and null error`() {
|
||||||
|
val reader =
|
||||||
|
ModuleReaderSpec(
|
||||||
|
scheme = "bird",
|
||||||
|
hasHierarchicalUris = true,
|
||||||
|
isLocal = true,
|
||||||
|
isGlobbable = false
|
||||||
|
)
|
||||||
|
val evaluatorId = client.sendCreateEvaluatorRequest(moduleReaders = listOf(reader))
|
||||||
|
|
||||||
|
client.send(
|
||||||
|
EvaluateRequest(
|
||||||
|
requestId = 1,
|
||||||
|
evaluatorId = evaluatorId,
|
||||||
|
moduleUri = URI("repl:text"),
|
||||||
|
moduleText = """res = import("bird:/pigeon.pkl")""",
|
||||||
|
expr = "res"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
val readModuleMsg = client.receive<ReadModuleRequest>()
|
||||||
|
assertThat(readModuleMsg.uri.toString()).isEqualTo("bird:/pigeon.pkl")
|
||||||
|
assertThat(readModuleMsg.evaluatorId).isEqualTo(evaluatorId)
|
||||||
|
|
||||||
|
client.send(
|
||||||
|
ReadModuleResponse(
|
||||||
|
requestId = readModuleMsg.requestId,
|
||||||
|
evaluatorId = evaluatorId,
|
||||||
|
contents = null,
|
||||||
|
error = null
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
val evaluateResponse = client.receive<EvaluateResponse>()
|
||||||
|
assertThat(evaluateResponse.error).isNull()
|
||||||
|
val unpacker = MessagePack.newDefaultUnpacker(evaluateResponse.result)
|
||||||
|
val value = unpacker.unpackValue().asArrayValue().list()
|
||||||
|
assertThat(value[0].asIntegerValue().asLong()).isEqualTo(0x1)
|
||||||
|
assertThat(value[1].asStringValue().asString()).isEqualTo("pigeon")
|
||||||
|
assertThat(value[3].asArrayValue().list()).isEmpty()
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `read module error`() {
|
fun `read module error`() {
|
||||||
val reader =
|
val reader =
|
||||||
|
|||||||
Reference in New Issue
Block a user