Skip to content
Snippets Groups Projects
Commit 9b7f7a63 authored by René Schöne's avatar René Schöne
Browse files

finished rest-client-server test.

- document constraint for rest-client receiving port to only support tokens right now
parent 20c1d048
No related branches found
No related tags found
1 merge request!38Resolve "New Handler: REST client"
Pipeline #17125 failed
This commit is part of merge request !38. Comments created here will be created in the context of that merge request.
......@@ -14,6 +14,7 @@ Uses Java methods to supply values (receive) and for callbacks (send).
- First leading slash not included in topic.
- Currently, the default mappings are applied, which requires a consumer to expect `byte[]` (instead of a more intuitive token or node value). This might change in future versions.
## MQTT
Use an MQTT broker to receive and send messages.
......@@ -31,6 +32,7 @@ Use an MQTT broker to receive and send messages.
- Mqtt is selected by default, so this dependency therefore is required "by default".
- Might work with other versions of `org.fusesource.mqtt-client.mqtt.client` as well.
## REST Server
Create a new REST server with its own target routes.
......@@ -38,13 +40,14 @@ Create a new REST server with its own target routes.
- Protocol identifier: `rest`
- URI scheme: `rest://localhost[:port]/<path>`
- Default port: 4567
- Type for mapping definitions: `String` --> TODO --> `byte[]`
- Type for mapping definitions: `byte[]`
- Required runtime dependencies:
- `group: 'com.sparkjava', name: 'spark-core', version: '2.9.3'`
- Receive behaviour: Upon connection, create a new PUT connection and pass the value of every call to this PUT route to the receiving port.
- Send behaviour: Upon connection, create a new GET connection and serve the latest value at this GET route.
- Additional remarks:
- Host is always `localhost`.
- Targets to be invoked need to replace `rest` with `http`
- Might work with newer versions of `com.sparkjava.spark-core` as well.
- For debugging, it is beneficial to include an implementation for [SLF4J][slf4j].
......@@ -62,5 +65,6 @@ Invoke REST routes to fetch and send values.
- Send behaviour: When the value to be sent changes, a PUT request sends this data.
- Additional remarks:
- Invoked target replaces `restClient` with `http`
- **Important constraint**: Receiving ports are only supported for tokens, since they interrupt the getter method!
[slf4j]: https://www.slf4j.org/manual.html
package org.jastadd.ragconnect.tests;
import org.jastadd.ragconnect.tests.utils.TestChecker;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import restClientServer.ast.*;
......@@ -16,6 +18,10 @@ import static org.assertj.core.api.Assertions.assertThat;
*/
public class RestClientServerTest extends RagConnectTest {
private Root root;
private TestChecker checker;
private static final String TOPIC_NT_A_VALUE = "nt/a/value";
private static final String TOPIC_NT_A_INNER_VALUE = "nt/a/inner/value";
@Test
public void testSimpleSenderRest() throws IOException {
......@@ -43,20 +49,72 @@ public class RestClientServerTest extends RagConnectTest {
assertThat(root.getReceiverRoot().getReceivedValue()).isEqualTo(2);
}
// @Test
// public void testA() throws IOException {
// A a2 = new A().setName("a2");
// model.addMultiple(a2);
// a2.setId(11);
// assertThat(a2.connectId("restClient://localhost:5000/write-single-a", true)).isTrue();
// a2.setId(23);
// }
@Test
public void testNonterminalSenderRest() throws IOException {
A a = new A().setValue("a1");
a.setInner(new Inner().setInnerValue("1"));
root.getSenderRoot().setSingleA(a);
checker.put(TOPIC_NT_A_VALUE, "a1")
.put(TOPIC_NT_A_INNER_VALUE, "1");
assertThat(root.getReceiverRoot().connectSomeA("rest://localhost:4567/put-nt")).isTrue();
assertThat(root.getSenderRoot().connectSingleA("restClient://localhost:4567/put-nt", true)).isTrue();
communicateNonterminal();
}
@Test
@Disabled("Receiving nonterminals using restClient is not supported yet")
public void testNonterminalSenderRestClient() throws IOException {
A a = new A().setValue("a1");
a.setInner(new Inner().setInnerValue("1"));
root.getSenderRoot().setSingleA(a);
assertThat(root.getReceiverRoot().connectSomeA("restClient://localhost:4567/serve-nt")).isTrue();
assertThat(root.getSenderRoot().connectSingleA("rest://localhost:4567/serve-nt", true)).isTrue();
communicateNonterminal();
}
private void communicateNonterminal() {
A a = root.getSenderRoot().getSingleA();
checker.check();
a.setValue("a23");
checker.put(TOPIC_NT_A_VALUE, "a23").check();
a.getInner().setInnerValue("abc");
checker.put(TOPIC_NT_A_INNER_VALUE, "abc").check();
}
@BeforeEach
public void createModel() {
root = new Root();
root.setReceiverRoot(new ReceiverRoot());
root.setSenderRoot(new SenderRoot());
checker = new TestChecker().setActualNumberOfValues(() -> 0);
checker.setCheckForString(TOPIC_NT_A_VALUE, (name, expected) ->
assertThat(someAValue()).describedAs(name).isEqualTo(expected))
.setCheckForString(TOPIC_NT_A_INNER_VALUE, (name, expected) ->
assertThat(someAInnerValueOrNull()).describedAs(name).isEqualTo(expected))
;
}
private String someAValue() {
if (root.getReceiverRoot().getSomeA() == null) {
return null;
}
return root.getReceiverRoot().getSomeA().getValue();
}
private String someAInnerValueOrNull() {
if (root.getReceiverRoot().getSomeA() == null || root.getReceiverRoot().getSomeA().getInner() == null) {
return null;
}
return root.getReceiverRoot().getSomeA().getInner().getInnerValue();
}
@AfterEach
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment