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). ...@@ -14,6 +14,7 @@ Uses Java methods to supply values (receive) and for callbacks (send).
- First leading slash not included in topic. - 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. - 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 ## MQTT
Use an MQTT broker to receive and send messages. Use an MQTT broker to receive and send messages.
...@@ -31,6 +32,7 @@ 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". - 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. - Might work with other versions of `org.fusesource.mqtt-client.mqtt.client` as well.
## REST Server ## REST Server
Create a new REST server with its own target routes. Create a new REST server with its own target routes.
...@@ -38,13 +40,14 @@ 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` - Protocol identifier: `rest`
- URI scheme: `rest://localhost[:port]/<path>` - URI scheme: `rest://localhost[:port]/<path>`
- Default port: 4567 - Default port: 4567
- Type for mapping definitions: `String` --> TODO --> `byte[]` - Type for mapping definitions: `byte[]`
- Required runtime dependencies: - Required runtime dependencies:
- `group: 'com.sparkjava', name: 'spark-core', version: '2.9.3'` - `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. - 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. - Send behaviour: Upon connection, create a new GET connection and serve the latest value at this GET route.
- Additional remarks: - Additional remarks:
- Host is always `localhost`. - 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. - Might work with newer versions of `com.sparkjava.spark-core` as well.
- For debugging, it is beneficial to include an implementation for [SLF4J][slf4j]. - For debugging, it is beneficial to include an implementation for [SLF4J][slf4j].
...@@ -62,5 +65,6 @@ Invoke REST routes to fetch and send values. ...@@ -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. - Send behaviour: When the value to be sent changes, a PUT request sends this data.
- Additional remarks: - Additional remarks:
- Invoked target replaces `restClient` with `http` - 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 [slf4j]: https://www.slf4j.org/manual.html
package org.jastadd.ragconnect.tests; package org.jastadd.ragconnect.tests;
import org.jastadd.ragconnect.tests.utils.TestChecker;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import restClientServer.ast.*; import restClientServer.ast.*;
...@@ -16,6 +18,10 @@ import static org.assertj.core.api.Assertions.assertThat; ...@@ -16,6 +18,10 @@ import static org.assertj.core.api.Assertions.assertThat;
*/ */
public class RestClientServerTest extends RagConnectTest { public class RestClientServerTest extends RagConnectTest {
private Root root; 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 @Test
public void testSimpleSenderRest() throws IOException { public void testSimpleSenderRest() throws IOException {
...@@ -43,20 +49,72 @@ public class RestClientServerTest extends RagConnectTest { ...@@ -43,20 +49,72 @@ public class RestClientServerTest extends RagConnectTest {
assertThat(root.getReceiverRoot().getReceivedValue()).isEqualTo(2); assertThat(root.getReceiverRoot().getReceivedValue()).isEqualTo(2);
} }
// @Test @Test
// public void testA() throws IOException { public void testNonterminalSenderRest() throws IOException {
// A a2 = new A().setName("a2"); A a = new A().setValue("a1");
// model.addMultiple(a2); a.setInner(new Inner().setInnerValue("1"));
// a2.setId(11); root.getSenderRoot().setSingleA(a);
// assertThat(a2.connectId("restClient://localhost:5000/write-single-a", true)).isTrue();
// a2.setId(23); 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 @BeforeEach
public void createModel() { public void createModel() {
root = new Root(); root = new Root();
root.setReceiverRoot(new ReceiverRoot()); root.setReceiverRoot(new ReceiverRoot());
root.setSenderRoot(new SenderRoot()); 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 @AfterEach
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment