blob: 76a1da016d988924d52a6e7351e370efa562bce4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.aries.jax.rs.rest.management.test;
import static org.apache.aries.jax.rs.rest.management.RestManagementConstants.APPLICATION_SERVICES_JSON_TYPE;
import static org.apache.aries.jax.rs.rest.management.RestManagementConstants.APPLICATION_SERVICES_REPRESENTATIONS_JSON_TYPE;
import static org.apache.aries.jax.rs.rest.management.RestManagementConstants.APPLICATION_SERVICES_REPRESENTATIONS_XML_TYPE;
import static org.apache.aries.jax.rs.rest.management.RestManagementConstants.APPLICATION_SERVICES_XML_TYPE;
import static org.apache.aries.jax.rs.rest.management.RestManagementConstants.APPLICATION_SERVICE_JSON_TYPE;
import static org.apache.aries.jax.rs.rest.management.RestManagementConstants.APPLICATION_SERVICE_XML_TYPE;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.data.MapEntry.entry;
import java.util.Map;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;
import org.apache.aries.jax.rs.rest.management.handler.RestManagementMessageBodyHandler;
import org.apache.aries.jax.rs.rest.management.model.ServiceReferenceDTOs;
import org.apache.aries.jax.rs.rest.management.model.ServicesDTO;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.osgi.framework.BundleContext;
import org.osgi.framework.dto.ServiceReferenceDTO;
import org.osgi.test.common.annotation.InjectBundleContext;
import org.osgi.test.junit4.context.BundleContextRule;
import org.xmlunit.assertj3.XmlAssert;
import net.javacrumbs.jsonunit.assertj.JsonAssertions;
public class ServicesTest extends TestUtil {
@Rule
public BundleContextRule bundleContextRule = new BundleContextRule();
@InjectBundleContext
BundleContext bundleContext;
@Test
public void getServicesJSON() {
WebTarget target = createDefaultTarget().path(
"framework"
).path("services");
Response response = target.request(
APPLICATION_SERVICES_JSON_TYPE
).get();
String result = response.readEntity(String.class);
JsonAssertions.assertThatJson(
result
).and(
j -> j.isObject(),
j -> j.node("services").isArray(),
j -> j.node("services[0]").isString().contains("http://", "/rms/framework/service/")
);
}
@Test
public void getServicesXML() {
WebTarget target = createDefaultTarget().path(
"framework"
).path("services");
Response response = target.request(
APPLICATION_SERVICES_XML_TYPE
).get();
String result = response.readEntity(String.class);
XmlAssert.assertThat(
result
).isInvalid().valueByXPath(
"//services/uri"
).contains("/framework/service/");
}
@Test
public void getServicesDTOJSON() {
WebTarget target = createDefaultTarget().path(
"framework"
).path("services");
target.register(RestManagementMessageBodyHandler.class);
Response response = target.request(
APPLICATION_SERVICES_JSON_TYPE
).get();
ServicesDTO servicesDTO = response.readEntity(ServicesDTO.class);
assertThat(
servicesDTO.services
).hasSizeGreaterThan(60).element(0).asString().contains(
"framework/service/"
);
}
@Test
public void getServicesDTOXML() {
WebTarget target = createDefaultTarget().path(
"framework"
).path("services");
target.register(RestManagementMessageBodyHandler.class);
Response response = target.request(
APPLICATION_SERVICES_XML_TYPE
).get();
ServicesDTO servicesDTO = response.readEntity(ServicesDTO.class);
assertThat(
servicesDTO.services
).hasSizeGreaterThan(60).element(0).asString().contains(
"framework/service/"
);
}
//////////
@Test
public void getServiceRepresentationsJSON() {
WebTarget target = createDefaultTarget().path(
"framework"
).path("services").path("representations");
Response response = target.request(
APPLICATION_SERVICES_REPRESENTATIONS_JSON_TYPE
).get();
String result = response.readEntity(String.class);
JsonAssertions.assertThatJson(
result
).and(
j -> j.isObject(),
j -> j.node("services").isArray(),
j -> j.node("services[0]").and(
j1 -> j1.isObject(),
j1 -> j1.node("id").isNumber(),
j1 -> j1.node("properties").and(
j2 -> j2.isObject(),
j2 -> j2.node("objectClass").isArray()
),
j1 -> j1.node("bundle").isString().contains("http://", "/rms/framework/bundle/"),
j1 -> j1.node("usingBundles").isArray()
)
);
}
@Test
public void getServiceRepresentationsXML() {
WebTarget target = createDefaultTarget().path(
"framework"
).path("services").path("representations");
Response response = target.request(
APPLICATION_SERVICES_REPRESENTATIONS_XML_TYPE
).get();
String result = response.readEntity(String.class);
XmlAssert.assertThat(
result
).isInvalid().hasXPath(
"//services/service/id"
);
XmlAssert.assertThat(
result
).hasXPath(
"//services/service/properties"
);
XmlAssert.assertThat(
result
).hasXPath(
"//services/service/bundle"
);
XmlAssert.assertThat(
result
).hasXPath(
"//services/service/usingBundles"
);
}
@Test
public void getServiceRepresentationsDTOJSON() {
WebTarget target = createDefaultTarget().path(
"framework"
).path("services").path("representations");
target.register(RestManagementMessageBodyHandler.class);
Response response = target.request(
APPLICATION_SERVICES_REPRESENTATIONS_JSON_TYPE
).get();
ServiceReferenceDTOs serviceReferenceDTOs = response.readEntity(ServiceReferenceDTOs.class);
assertThat(
serviceReferenceDTOs.services
).isNotEmpty();
}
@Test
public void getServiceRepresentationsDTOXML() {
WebTarget target = createDefaultTarget().path(
"framework"
).path("services").path("representations");
target.register(RestManagementMessageBodyHandler.class);
Response response = target.request(
APPLICATION_SERVICES_REPRESENTATIONS_XML_TYPE
).get();
ServiceReferenceDTOs serviceReferenceDTOs = response.readEntity(ServiceReferenceDTOs.class);
assertThat(
serviceReferenceDTOs.services
).isNotEmpty();
}
//////////
@Test
public void getServiceJSON() {
WebTarget target = createDefaultTarget().path(
"framework"
).path("service").path("{serviceid}");
Response response = target.resolveTemplate(
"serviceid", 1l
).request(
APPLICATION_SERVICE_JSON_TYPE
).get();
String result = response.readEntity(String.class);
JsonAssertions.assertThatJson(
result
).and(
j -> j.isObject(),
j1 -> j1.node("id").isNumber().isEqualByComparingTo("1"),
j1 -> j1.node("properties").and(
j2 -> j2.isObject(),
j2 -> j2.node("objectClass").isArray().contains("org.osgi.service.log.LogReaderService", "org.eclipse.equinox.log.ExtendedLogReaderService"),
j2 -> j2.node("service\\.scope").isString().contains("bundle"),
j2 -> j2.node("service\\.id").isNumber().isEqualByComparingTo("1"),
j2 -> j2.node("service\\.bundleid").isNumber().isEqualByComparingTo("0")
),
j1 -> j1.node("bundle").isString().contains("http://", "/rms/framework/bundle/"),
j1 -> j1.node("usingBundles").isArray()
);
}
@Test
public void getServiceXML() {
WebTarget target = createDefaultTarget().path(
"framework"
).path("service").path("{serviceid}");
Response response = target.resolveTemplate(
"serviceid", 1l
).request(
APPLICATION_SERVICE_XML_TYPE
).get();
String result = response.readEntity(String.class);
XmlAssert.assertThat(
result
).isInvalid().valueByXPath(
"//service/id"
).isEqualTo("1");
XmlAssert.assertThat(
result
).valueByXPath(
"//service/properties/property[3]/@name"
).isEqualTo("service.id");
XmlAssert.assertThat(
result
).valueByXPath(
"//service/properties/property[3]/@type"
).isEqualTo("Long");
XmlAssert.assertThat(
result
).valueByXPath(
"//service/properties/property[3]/@value"
).isEqualTo("1");
}
@Test
public void getServiceDTOJSON() {
WebTarget target = createDefaultTarget().path(
"framework"
).path("service").path("{serviceid}");
target.register(RestManagementMessageBodyHandler.class);
Response response = target.resolveTemplate(
"serviceid", 1l
).request(
APPLICATION_SERVICE_JSON_TYPE
).get();
ServiceReferenceDTO serviceReferenceDTO = response.readEntity(ServiceReferenceDTO.class);
assertThat(
serviceReferenceDTO.id
).isEqualTo(
1l
);
}
@Test
public void getServiceDTOXML() {
WebTarget target = createDefaultTarget().path(
"framework"
).path("service").path("{serviceid}");
target.register(RestManagementMessageBodyHandler.class);
Response response = target.resolveTemplate(
"serviceid", 1l
).request(
APPLICATION_SERVICE_XML_TYPE
).get();
ServiceReferenceDTO serviceReferenceDTO = response.readEntity(ServiceReferenceDTO.class);
assertThat(
serviceReferenceDTO.id
).isEqualTo(
1l
);
}
@Ignore("These are just tests for property coercion")
@Test
public void getService28XML() {
WebTarget target = createDefaultTarget().path(
"framework"
).path("service").path("{serviceid}");
Response response = target.resolveTemplate(
"serviceid", 28l
).request(
APPLICATION_SERVICE_XML_TYPE
).get();
String result = response.readEntity(String.class);
XmlAssert.assertThat(
result
).isInvalid().valueByXPath(
"//service/id"
).isEqualTo("28");
}
@Ignore("These are just tests for property coercion")
@Test
public void getService28DTOXML() {
WebTarget target = createDefaultTarget().path(
"framework"
).path("service").path("{serviceid}");
target.register(RestManagementMessageBodyHandler.class);
Response response = target.resolveTemplate(
"serviceid", 28l
).request(
APPLICATION_SERVICE_XML_TYPE
).get();
ServiceReferenceDTO serviceReferenceDTO = response.readEntity(ServiceReferenceDTO.class);
assertThat(
serviceReferenceDTO.id
).isEqualTo(
28l
);
}
////////////
@Test
public void getServicesFilterJSON() {
WebTarget target = createDefaultTarget().path(
"framework"
).path("services");
Response response = target.queryParam(
"filter", "(service.id=25)"
).request(
APPLICATION_SERVICES_JSON_TYPE
).get();
String result = response.readEntity(String.class);
JsonAssertions.assertThatJson(
result
).and(
j -> j.isObject(),
j -> j.node("services").and(
j1 -> j1.isArray().hasSize(1).element(0).asString().contains("http://", "/rms/framework/service/25")
)
);
}
@Test
public void getServicesFilterXML() {
WebTarget target = createDefaultTarget().path(
"framework"
).path("services");
Response response = target.queryParam(
"filter", "(service.id=25)"
).request(
APPLICATION_SERVICES_XML_TYPE
).get();
String result = response.readEntity(String.class);
XmlAssert.assertThat(
result
).isInvalid().valueByXPath(
"//services/uri"
).contains("framework/service/25");
}
@Test
public void getServicesFilterDTOJSON() {
WebTarget target = createDefaultTarget().path(
"framework"
).path("services");
target.register(RestManagementMessageBodyHandler.class);
Response response = target.queryParam(
"filter", "(service.id=25)"
).request(
APPLICATION_SERVICES_JSON_TYPE
).get();
ServicesDTO servicesDTO = response.readEntity(ServicesDTO.class);
assertThat(
servicesDTO.services.get(0)
).contains(
"framework/service/25"
);
}
@Test
public void getServicesFilterDTOXML() {
WebTarget target = createDefaultTarget().path(
"framework"
).path("services");
target.register(RestManagementMessageBodyHandler.class);
Response response = target.queryParam(
"filter", "(service.id=25)"
).request(
APPLICATION_SERVICES_XML_TYPE
).get();
ServicesDTO servicesDTO = response.readEntity(ServicesDTO.class);
assertThat(
servicesDTO.services.get(0)
).contains(
"framework/service/25"
);
}
@Test
public void getServicesFilterDTOJSON_2() {
WebTarget target = createDefaultTarget().path(
"framework"
).path("services").path("representations");
target.register(RestManagementMessageBodyHandler.class);
Response response = target.queryParam(
"filter", "(objectClass=org.apache.aries.jax.rs.*)"
).request(
APPLICATION_SERVICES_REPRESENTATIONS_JSON_TYPE
).get();
ServiceReferenceDTOs serviceReferenceDTOs = response.readEntity(ServiceReferenceDTOs.class);
assertThat(
serviceReferenceDTOs.services.get(0)
).hasFieldOrProperty(
"bundle"
).hasFieldOrProperty(
"id"
).hasFieldOrProperty(
"properties"
).hasFieldOrProperty(
"usingBundles"
);
Map<String, Object> properties = serviceReferenceDTOs.services.get(0).properties;
assertThat(properties).contains(
entry("objectClass", new String[] {"org.apache.aries.jax.rs.rest.management.internal.FrameworkResource"})
).contains(
entry("osgi.jaxrs.application.select", "(osgi.jaxrs.name=RestManagementApplication)")
);
}
@Test
public void getServicesFilterDTOJSON_caseInsensitiveMatching() {
WebTarget target = createDefaultTarget().path(
"framework"
).path("services").path("representations");
target.register(RestManagementMessageBodyHandler.class);
Response response = target.queryParam(
"filter", "(objectclass=org.apache.aries.jax.rs.*)"
).request(
APPLICATION_SERVICES_REPRESENTATIONS_JSON_TYPE
).get();
ServiceReferenceDTOs serviceReferenceDTOs = response.readEntity(ServiceReferenceDTOs.class);
assertThat(
serviceReferenceDTOs.services.get(0)
).hasFieldOrProperty(
"bundle"
).hasFieldOrProperty(
"id"
).hasFieldOrProperty(
"properties"
).hasFieldOrProperty(
"usingBundles"
);
Map<String, Object> properties = serviceReferenceDTOs.services.get(0).properties;
assertThat(properties).contains(
entry("objectClass", new String[] {"org.apache.aries.jax.rs.rest.management.internal.FrameworkResource"})
).contains(
entry("osgi.jaxrs.application.select", "(osgi.jaxrs.name=RestManagementApplication)")
);
}
}