/******************************************************************************* * Copyright (c) 2013-2015 Sierra Wireless and others. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v1.0 which accompany this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.html. * * Contributors: * Sierra Wireless - initial API and implementation *******************************************************************************/ package org.eclipse.leshan.server.californium.impl; import static org.junit.Assert.*; import java.net.Inet4Address; import java.net.InetSocketAddress; import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; import org.eclipse.californium.core.coap.CoAP; import org.eclipse.californium.core.coap.MediaTypeRegistry; import org.eclipse.californium.core.coap.Request; import org.eclipse.leshan.Link; import org.eclipse.leshan.ObserveSpec; import org.eclipse.leshan.core.model.LwM2mModel; import org.eclipse.leshan.core.model.ObjectLoader; import org.eclipse.leshan.core.node.LwM2mObjectInstance; import org.eclipse.leshan.core.node.LwM2mSingleResource; import org.eclipse.leshan.core.node.codec.DefaultLwM2mNodeEncoder; import org.eclipse.leshan.core.node.codec.LwM2mNodeEncoder; import org.eclipse.leshan.core.request.ContentFormat; import org.eclipse.leshan.core.request.CreateRequest; import org.eclipse.leshan.core.request.DeleteRequest; import org.eclipse.leshan.core.request.DiscoverRequest; import org.eclipse.leshan.core.request.ExecuteRequest; import org.eclipse.leshan.core.request.ObserveRequest; import org.eclipse.leshan.core.request.ReadRequest; import org.eclipse.leshan.core.request.WriteAttributesRequest; import org.eclipse.leshan.core.request.WriteRequest; import org.eclipse.leshan.core.request.WriteRequest.Mode; import org.eclipse.leshan.server.registration.Registration; import org.eclipse.leshan.server.registration.Registration.Builder; import org.eclipse.leshan.tlv.Tlv; import org.eclipse.leshan.tlv.Tlv.TlvType; import org.eclipse.leshan.tlv.TlvDecoder; import org.junit.BeforeClass; import org.junit.Test; /** * Unit tests for {@link CoapRequestBuilder} */ public class CoapRequestBuilderTest { private static LwM2mModel model; private static LwM2mNodeEncoder encoder; @BeforeClass public static void loadModel() { model = new LwM2mModel(ObjectLoader.loadDefault()); encoder = new DefaultLwM2mNodeEncoder(); } private Registration newRegistration() throws UnknownHostException { return newRegistration(null); } private Registration newRegistration(String rootpath) throws UnknownHostException { Builder b = new Registration.Builder("regid", "endpoint", Inet4Address.getByName("127.0.0.1"), 12354, new InetSocketAddress(0)); if (rootpath != null) { Map<String, String> attr = new HashMap<>(); attr.put("rt", "oma.lwm2m"); b.objectLinks(new Link[] { new Link(rootpath, attr) }); } return b.build(); } @Test public void build_read_request() throws Exception { Registration reg = newRegistration(); // test CoapRequestBuilder builder = new CoapRequestBuilder( new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(), reg.getId(), reg.getEndpoint(), model, encoder); ReadRequest request = new ReadRequest(3, 0); builder.visit(request); // verify Request coapRequest = builder.getRequest(); assertEquals(CoAP.Code.GET, coapRequest.getCode()); assertEquals("127.0.0.1", coapRequest.getDestination().getHostAddress()); assertEquals(12354, coapRequest.getDestinationPort()); assertEquals("coap://localhost/3/0", coapRequest.getURI()); } @Test public void build_read_request_with_non_default_object_path() throws Exception { Registration reg = newRegistration("/lwm2m"); // test CoapRequestBuilder builder = new CoapRequestBuilder( new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(), reg.getId(), reg.getEndpoint(), model, encoder); ReadRequest request = new ReadRequest(3, 0, 1); builder.visit(request); // verify Request coapRequest = builder.getRequest(); assertEquals("coap://localhost/lwm2m/3/0/1", coapRequest.getURI()); } @Test public void build_read_request_with_root_path() throws Exception { Registration reg = newRegistration("/"); // test CoapRequestBuilder builder = new CoapRequestBuilder( new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(), reg.getId(), reg.getEndpoint(), model, encoder); ReadRequest request = new ReadRequest(3); builder.visit(request); // verify Request coapRequest = builder.getRequest(); assertEquals("coap://localhost/3", coapRequest.getURI()); } @Test public void build_discover_request() throws Exception { Registration reg = newRegistration(); // test CoapRequestBuilder builder = new CoapRequestBuilder( new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(), reg.getId(), reg.getEndpoint(), model, encoder); DiscoverRequest request = new DiscoverRequest(3, 0); builder.visit(request); // verify Request coapRequest = builder.getRequest(); assertEquals(CoAP.Code.GET, coapRequest.getCode()); assertEquals("127.0.0.1", coapRequest.getDestination().getHostAddress()); assertEquals(12354, coapRequest.getDestinationPort()); assertEquals(MediaTypeRegistry.APPLICATION_LINK_FORMAT, coapRequest.getOptions().getAccept()); assertEquals("coap://localhost/3/0", coapRequest.getURI()); } @Test public void build_write_request() throws Exception { Registration reg = newRegistration(); // test CoapRequestBuilder builder = new CoapRequestBuilder( new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(), reg.getId(), reg.getEndpoint(), model, encoder); WriteRequest request = new WriteRequest(Mode.UPDATE, 3, 0, LwM2mSingleResource.newStringResource(4, "value")); builder.visit(request); // verify Request coapRequest = builder.getRequest(); assertEquals(CoAP.Code.POST, coapRequest.getCode()); assertEquals("127.0.0.1", coapRequest.getDestination().getHostAddress()); assertEquals(12354, coapRequest.getDestinationPort()); assertEquals(ContentFormat.TLV.getCode(), coapRequest.getOptions().getContentFormat()); assertNotNull(coapRequest.getPayload()); // assert it is encoded as array of resources TLV Tlv[] tlvs = TlvDecoder.decode(ByteBuffer.wrap(coapRequest.getPayload())); assertEquals(TlvType.RESOURCE_VALUE, tlvs[0].getType()); assertEquals("value", TlvDecoder.decodeString(tlvs[0].getValue())); assertEquals("coap://localhost/3/0", coapRequest.getURI()); } @Test public void build_write_request_replace() throws Exception { Registration reg = newRegistration(); // test CoapRequestBuilder builder = new CoapRequestBuilder( new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(), reg.getId(), reg.getEndpoint(), model, encoder); WriteRequest request = new WriteRequest(3, 0, 14, "value"); builder.visit(request); // verify Request coapRequest = builder.getRequest(); assertEquals(CoAP.Code.PUT, coapRequest.getCode()); } @Test public void build_write_attribute_request() throws Exception { Registration reg = newRegistration(); // test CoapRequestBuilder builder = new CoapRequestBuilder( new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(), reg.getId(), reg.getEndpoint(), model, encoder); WriteAttributesRequest request = new WriteAttributesRequest(3, 0, 14, new ObserveSpec.Builder().minPeriod(10).maxPeriod(100).build()); builder.visit(request); // verify Request coapRequest = builder.getRequest(); assertEquals(CoAP.Code.PUT, coapRequest.getCode()); assertEquals("127.0.0.1", coapRequest.getDestination().getHostAddress()); assertEquals(12354, coapRequest.getDestinationPort()); assertEquals("coap://localhost/3/0/14?pmin=10&pmax=100", coapRequest.getURI()); } @Test public void build_execute_request() throws Exception { Registration reg = newRegistration(); // test CoapRequestBuilder builder = new CoapRequestBuilder( new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(), reg.getId(), reg.getEndpoint(), model, encoder); ExecuteRequest request = new ExecuteRequest(3, 0, 12, "params"); builder.visit(request); // verify Request coapRequest = builder.getRequest(); assertEquals(CoAP.Code.POST, coapRequest.getCode()); assertEquals("127.0.0.1", coapRequest.getDestination().getHostAddress()); assertEquals(12354, coapRequest.getDestinationPort()); assertEquals("coap://localhost/3/0/12", coapRequest.getURI()); assertEquals("params", coapRequest.getPayloadString()); } @Test public void build_create_request__without_instance_id() throws Exception { Registration reg = newRegistration(); // test CoapRequestBuilder builder = new CoapRequestBuilder( new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(), reg.getId(), reg.getEndpoint(), model, encoder); CreateRequest request = new CreateRequest(12, LwM2mSingleResource.newStringResource(0, "value")); builder.visit(request); // verify Request coapRequest = builder.getRequest(); assertEquals(CoAP.Code.POST, coapRequest.getCode()); assertEquals("127.0.0.1", coapRequest.getDestination().getHostAddress()); assertEquals(12354, coapRequest.getDestinationPort()); assertEquals("coap://localhost/12", coapRequest.getURI()); assertEquals(ContentFormat.TLV.getCode(), coapRequest.getOptions().getContentFormat()); assertNotNull(coapRequest.getPayload()); // assert it is encoded as array of resources TLV Tlv[] tlvs = TlvDecoder.decode(ByteBuffer.wrap(coapRequest.getPayload())); assertEquals(TlvType.RESOURCE_VALUE, tlvs[0].getType()); } @Test public void build_create_request__with_instance_id() throws Exception { Registration reg = newRegistration(); // test CoapRequestBuilder builder = new CoapRequestBuilder( new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(), reg.getId(), reg.getEndpoint(), model, encoder); CreateRequest request = new CreateRequest(12, new LwM2mObjectInstance(26, LwM2mSingleResource.newStringResource(0, "value"))); builder.visit(request); // verify Request coapRequest = builder.getRequest(); assertEquals(CoAP.Code.POST, coapRequest.getCode()); assertEquals("127.0.0.1", coapRequest.getDestination().getHostAddress()); assertEquals(12354, coapRequest.getDestinationPort()); assertEquals("coap://localhost/12", coapRequest.getURI()); assertEquals(ContentFormat.TLV.getCode(), coapRequest.getOptions().getContentFormat()); assertNotNull(coapRequest.getPayload()); // assert it is encoded as array of instance TLV Tlv[] tlvs = TlvDecoder.decode(ByteBuffer.wrap(coapRequest.getPayload())); assertEquals(TlvType.OBJECT_INSTANCE, tlvs[0].getType()); assertEquals(26, tlvs[0].getIdentifier()); } @Test public void build_delete_request() throws Exception { Registration reg = newRegistration(); // test CoapRequestBuilder builder = new CoapRequestBuilder( new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(), reg.getId(), reg.getEndpoint(), model, encoder); DeleteRequest request = new DeleteRequest(12, 0); builder.visit(request); // verify Request coapRequest = builder.getRequest(); assertEquals(CoAP.Code.DELETE, coapRequest.getCode()); assertEquals("127.0.0.1", coapRequest.getDestination().getHostAddress()); assertEquals(12354, coapRequest.getDestinationPort()); assertEquals("coap://localhost/12/0", coapRequest.getURI()); } @Test public void build_observe_request() throws Exception { Registration reg = newRegistration(); // test CoapRequestBuilder builder = new CoapRequestBuilder( new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(), reg.getId(), reg.getEndpoint(), model, encoder); ObserveRequest request = new ObserveRequest(12, 0); builder.visit(request); // verify Request coapRequest = builder.getRequest(); assertEquals(CoAP.Code.GET, coapRequest.getCode()); assertEquals(0, coapRequest.getOptions().getObserve().intValue()); assertEquals("127.0.0.1", coapRequest.getDestination().getHostAddress()); assertEquals(12354, coapRequest.getDestinationPort()); assertEquals("coap://localhost/12/0", coapRequest.getURI()); } }