use of org.eclipse.californium.core.coap.CoAP.Code in project californium by eclipse.
the class RequestTest method setObserveCancelFailsForNonGetRequest.
/**
* Verifies that only GET requests can be marked for canceling an observe relation.
*/
@Test
public void setObserveCancelFailsForNonGetRequest() {
Code[] illegalCodes = new Code[] { Code.PATCH, Code.DELETE, Code.POST, Code.PUT };
for (Code code : illegalCodes) {
try {
Request req = new Request(code);
req.setObserveCancel();
fail("should not be able to set observe option on " + code + " request");
} catch (IllegalStateException e) {
// as expected
}
}
}
use of org.eclipse.californium.core.coap.CoAP.Code in project hono by eclipse.
the class TracingSupportingHonoResourceTest method testUnsupportedRequestCodesResultInMethodNotAllowed.
/**
* Verifies that the resource returns a 4.05 for request codes other than PUT or POST.
*
* @param requestCode The CoAP request code to verify.
*/
@ParameterizedTest
@MethodSource("unsupportedRequestCodes")
public void testUnsupportedRequestCodesResultInMethodNotAllowed(final Code requestCode) {
final Request request = new Request(requestCode);
final Exchange exchange = newExchange(request);
resource.handleRequest(exchange);
verify(endpoint).sendResponse(eq(exchange), argThat(response -> response.getCode() == CoAP.ResponseCode.METHOD_NOT_ALLOWED));
verify(span).setTag(eq(CoapConstants.TAG_COAP_RESPONSE_CODE.getKey()), eq("4.05"));
}
use of org.eclipse.californium.core.coap.CoAP.Code in project hono by eclipse.
the class TracingSupportingHonoResourceTest method testDefaultHandlersResultInNotImplemented.
/**
* Verifies that the resource returns a 5.01 for request codes PUT and POST.
*
* @param requestCode The CoAP request code to verify.
*/
@ParameterizedTest
@MethodSource("supportedRequestCodes")
public void testDefaultHandlersResultInNotImplemented(final Code requestCode) {
final Request request = new Request(requestCode);
final Exchange exchange = newExchange(request);
resource.handleRequest(exchange);
verify(endpoint).sendResponse(eq(exchange), argThat(response -> response.getCode() == CoAP.ResponseCode.NOT_IMPLEMENTED));
verify(span).setTag(eq(CoapConstants.TAG_COAP_RESPONSE_CODE.getKey()), eq("5.01"));
}
use of org.eclipse.californium.core.coap.CoAP.Code in project hono by eclipse.
the class CoapTestBase method testUploadMessageFailsForUnauthorizedGateway.
/**
* Verifies that the CoAP adapter rejects messages from a gateway for a device that it is not authorized for with a
* 403.
*
* @param ctx The test context
*/
@Test
@Timeout(value = 10, timeUnit = TimeUnit.SECONDS)
public void testUploadMessageFailsForUnauthorizedGateway(final VertxTestContext ctx) {
// GIVEN a device that is connected via gateway "not-the-created-gateway"
final Tenant tenant = new Tenant();
final String gatewayId = helper.getRandomDeviceId(tenantId);
final Device deviceData = new Device();
deviceData.setVia(Collections.singletonList("not-the-created-gateway"));
helper.registry.addPskDeviceForTenant(tenantId, tenant, gatewayId, SECRET).compose(ok -> helper.registry.registerDevice(tenantId, deviceId, deviceData)).compose(ok -> {
// WHEN another gateway tries to upload a message for the device
final Promise<OptionSet> result = Promise.promise();
final CoapClient client = getCoapsClient(gatewayId, tenantId, SECRET);
// THEN a FORBIDDEN response code is returned
client.advanced(getHandler(result, ResponseCode.FORBIDDEN), createCoapsRequest(Code.PUT, getPutResource(tenantId, deviceId), 0));
return result.future();
}).onComplete(ctx.succeedingThenComplete());
}
use of org.eclipse.californium.core.coap.CoAP.Code in project hono by eclipse.
the class CoapTestBase method testUploadMessages.
/**
* Uploads messages to the CoAP endpoint.
*
* @param ctx The test context to run on.
* @param tenantId The tenant that the device belongs to.
* @param warmUp A sender of messages used to warm up the adapter before running the test itself or {@code null} if
* no warm up should be performed.
* @param messageConsumer Consumer that is invoked when a message was received.
* @param requestSender The test device that will publish the data.
* @param numberOfMessages The number of messages that are uploaded.
* @param expectedQos The expected QoS level, may be {@code null} leading to expecting the default for event or telemetry.
* @throws InterruptedException if the test is interrupted before it has finished.
*/
protected void testUploadMessages(final VertxTestContext ctx, final String tenantId, final Supplier<Future<Void>> warmUp, final Consumer<DownstreamMessage<? extends MessageContext>> messageConsumer, final Function<Integer, Future<OptionSet>> requestSender, final int numberOfMessages, final QoS expectedQos) throws InterruptedException {
final CountDownLatch received = new CountDownLatch(numberOfMessages);
final VertxTestContext setup = new VertxTestContext();
createConsumer(tenantId, msg -> {
ctx.verify(() -> {
logger.trace("received {}", msg);
DownstreamMessageAssertions.assertTelemetryMessageProperties(msg, tenantId);
assertThat(msg.getQos()).isEqualTo(getExpectedQoS(expectedQos));
assertAdditionalMessageProperties(msg);
if (messageConsumer != null) {
messageConsumer.accept(msg);
}
});
received.countDown();
if (received.getCount() % 20 == 0) {
logger.info("messages received: {}", numberOfMessages - received.getCount());
}
}).compose(ok -> Optional.ofNullable(warmUp).map(w -> w.get()).orElseGet(() -> Future.succeededFuture())).onComplete(setup.succeedingThenComplete());
ctx.verify(() -> assertThat(setup.awaitCompletion(5, TimeUnit.SECONDS)).isTrue());
final long start = System.currentTimeMillis();
final AtomicInteger messageCount = new AtomicInteger(0);
while (messageCount.get() < numberOfMessages && !ctx.failed()) {
final CountDownLatch sending = new CountDownLatch(1);
requestSender.apply(messageCount.getAndIncrement()).compose(this::assertCoapResponse).onComplete(attempt -> {
if (attempt.succeeded()) {
logger.debug("sent message {}", messageCount.get());
} else {
logger.info("failed to send message {}: {}", messageCount.get(), attempt.cause().getMessage());
ctx.failNow(attempt.cause());
}
sending.countDown();
});
if (messageCount.get() % 20 == 0) {
logger.info("messages sent: {}", messageCount.get());
}
sending.await();
}
if (ctx.failed()) {
return;
}
final long timeToWait = Math.max(TEST_TIMEOUT_MILLIS - 1000, Math.round(numberOfMessages * 20));
if (received.await(timeToWait, TimeUnit.MILLISECONDS)) {
logger.info("sent {} and received {} messages after {} milliseconds", messageCount, numberOfMessages - received.getCount(), System.currentTimeMillis() - start);
ctx.completeNow();
} else {
logger.info("sent {} and received {} messages after {} milliseconds", messageCount, numberOfMessages - received.getCount(), System.currentTimeMillis() - start);
ctx.failNow(new AssertionError("did not receive all messages sent"));
}
}
Aggregations