blob: 22c3c31677d13b226ec1771a6620bec8e5d80510 [file] [log] [blame]
/*
* Copyright (c) 2020 Kentyou.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Kentyou - initial API and implementation
*/
package org.eclipse.sensinact.gateway.core.test;
import static org.junit.Assert.assertEquals;
import org.json.JSONObject;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.Filter;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.service.log.LogService;
import org.skyscreamer.jsonassert.JSONAssert;
import org.eclipse.sensinact.gateway.common.bundle.Mediator;
import org.eclipse.sensinact.gateway.core.method.AccessMethodResponse;
import org.eclipse.sensinact.gateway.core.method.AccessMethodResponse.Status;
import org.eclipse.sensinact.gateway.core.method.AccessMethodResponseBuilder;
import org.eclipse.sensinact.gateway.core.method.trigger.AccessMethodTrigger;
import org.eclipse.sensinact.gateway.core.method.trigger.AccessMethodTriggerFactory;
import org.eclipse.sensinact.gateway.core.method.trigger.TriggerArgumentBuilder;
/**
* test Constraint
*/
public class TriggerTest {
public static final String TRIGGER_0 = "{\"type\":\"CONDITIONAL\",\"passOn\":false,\"argument\": 0,\"builder\":\"PARAMETER\","
+ "\"constants\":[" + "{\"constant\":100,"
+ " \"constraint\":{\"operator\":\"in\",\"operand\":[22,23,18,3], \"type\":\"int\", \"complement\":false}},"
+ "{\"constant\":1000,"
+ " \"constraint\":{\"operator\":\">=\",\"operand\":5, \"type\":\"int\", \"complement\":false}},"
+ "{\"constant\":0,"
+ " \"constraint\":{\"operator\":\">=\",\"operand\":5, \"type\":\"int\", \"complement\":true}}]}";
public static final String TRIGGER_1 = "{\"type\":\"CONSTANT\",\"passOn\":false, \"argument\":\"constant\", \"builder\":\"EMPTY\"}";
public static final String TRIGGER_2 = "{\"type\":\"COPY\",\"passOn\":false,\"argument\": 2, \"builder\":\"PARAMETER\"}";
public static final String TRIGGER_3 = "{\"type\":\"VARIATIONTEST_TRIGGER\",\"passOn\":false,\"argument\":0, \"builder\":\"EMPTY\"}";
private static final String LOG_FILTER = "(" + Constants.OBJECTCLASS + "=" + LogService.class.getCanonicalName()
+ ")";
private static final String MOCK_BUNDLE_NAME = "MockedBundle";
private static final long MOCK_BUNDLE_ID = 1;
private final BundleContext context = Mockito.mock(BundleContext.class);
private final Bundle bundle = Mockito.mock(Bundle.class);
private Mediator mediator;
@Before
public void init() throws InvalidSyntaxException {
Filter filter = Mockito.mock(Filter.class);
Mockito.when(filter.toString()).thenReturn(LOG_FILTER);
Mockito.when(context.createFilter(LOG_FILTER)).thenReturn(filter);
Mockito.when(context.getServiceReferences((String) Mockito.eq(null), Mockito.eq(LOG_FILTER))).thenReturn(null);
Mockito.when(context.getServiceReference(LOG_FILTER)).thenReturn(null);
Mockito.when(context.getServiceReferences(Mockito.anyString(), Mockito.anyString()))
.then(new Answer<ServiceReference[]>() {
@Override
public ServiceReference[] answer(InvocationOnMock invocation) throws Throwable {
Object[] arguments = invocation.getArguments();
if (arguments == null || arguments.length != 2) {
return null;
}
return null;
}
});
Mockito.when(context.getService(Mockito.any(ServiceReference.class))).then(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Object[] arguments = invocation.getArguments();
if (arguments == null || arguments.length != 1) {
return null;
}
return null;
}
});
Mockito.when(context.getBundle()).thenReturn(bundle);
Mockito.when(bundle.getSymbolicName()).thenReturn(MOCK_BUNDLE_NAME);
Mockito.when(bundle.getBundleId()).thenReturn(MOCK_BUNDLE_ID);
mediator = new Mediator(context);
}
@SuppressWarnings("rawtypes")
@Test
public void testFactory() throws Exception {
AccessMethodTriggerFactory.Loader loader = AccessMethodTriggerFactory.LOADER.get();
try {
AccessMethodTriggerFactory factory = loader.load(mediator, AccessMethodTrigger.Type.CONDITIONAL.name());
JSONObject jsonTrigger = new JSONObject(TriggerTest.TRIGGER_0);
AccessMethodTrigger trigger = factory.newInstance(mediator, jsonTrigger);
String triggerJSON = trigger.getJSON();
assertEquals(0, trigger.execute(new TriggerArgumentBuilder.Parameter(
trigger.<Integer>getArgument()).build(
new AccessMethodResponseBuilder(mediator, "/", new Object[]{2}) {
private static final long serialVersionUID = 1L;
@Override
public Class getComponentType() {
return null;
}
@Override
public AccessMethodResponse createAccessMethodResponse(Status status) {
return null;
}
})));
assertEquals(100,trigger.execute(new TriggerArgumentBuilder.Parameter(
trigger.<Integer>getArgument()).build(
new AccessMethodResponseBuilder(mediator, "/", new Object[]{22}) {
private static final long serialVersionUID = 1L;
@Override
public Class getComponentType() {
return null;
}
@Override
public AccessMethodResponse createAccessMethodResponse(Status status) {
return null;
}
})));
assertEquals(100, trigger.execute(new TriggerArgumentBuilder.Parameter(
trigger.<Integer>getArgument()).build(
new AccessMethodResponseBuilder(mediator, "/", new Object[]{18}) {
private static final long serialVersionUID = 1L;
@Override
public Class getComponentType() {
return null;
}
@Override
public AccessMethodResponse createAccessMethodResponse(Status status) {
return null;
}
})));
assertEquals(1000,trigger.execute(new TriggerArgumentBuilder.Parameter(
trigger.<Integer>getArgument()).build(
new AccessMethodResponseBuilder(mediator, "/", new Object[]{55}) {
private static final long serialVersionUID = 1L;
@Override
public Class getComponentType() {
return null;
}
@Override
public AccessMethodResponse createAccessMethodResponse(Status status) {
return null;
}
})));
JSONAssert.assertEquals(TriggerTest.TRIGGER_0, triggerJSON, false);
trigger = factory.<Object>newInstance(mediator, new JSONObject(TriggerTest.TRIGGER_1));
assertEquals("constant", trigger.execute(new TriggerArgumentBuilder.Empty().build(null)));
JSONAssert.assertEquals(TriggerTest.TRIGGER_1, trigger.getJSON(), false);
trigger = factory.<Object>newInstance(mediator, new JSONObject(TriggerTest.TRIGGER_2));
assertEquals("value", trigger.execute(new TriggerArgumentBuilder.Parameter(trigger.<Integer>getArgument()).build(
new AccessMethodResponseBuilder(mediator, "/", new Object[]{ 2, "copy", "value"}) {
private static final long serialVersionUID = 1L;
@Override
public Class getComponentType() {
return null;
}
@Override
public AccessMethodResponse createAccessMethodResponse(Status status) {
return null;
}
})));
assertEquals(2, trigger.execute(new TriggerArgumentBuilder.Parameter(trigger.<Integer>getArgument()).build(
new AccessMethodResponseBuilder(mediator, "/", new Object[]{ "copy", "value", 2}) {
private static final long serialVersionUID = 1L;
@Override
public Class getComponentType() {
return null;
}
@Override
public AccessMethodResponse createAccessMethodResponse(Status status) {
return null;
}
})));
assertEquals("copy", trigger.execute(new TriggerArgumentBuilder.Parameter(trigger.<Integer>getArgument()).build(
new AccessMethodResponseBuilder(mediator, "/", new Object[]{ "value", 2, "copy"}) {
private static final long serialVersionUID = 1L;
@Override
public Class getComponentType() {
return null;
}
@Override
public AccessMethodResponse createAccessMethodResponse(Status status) {
return null;
}
})));
JSONAssert.assertEquals(TriggerTest.TRIGGER_2, trigger.getJSON(), false);
jsonTrigger = new JSONObject(TriggerTest.TRIGGER_3);
factory = loader.load(mediator, jsonTrigger.getString("type"));
trigger = factory.newInstance(mediator, jsonTrigger);
assertEquals(0.2f, (Float) trigger.execute(new TriggerArgumentBuilder.Empty().build(null)), 0.0f);
} finally {
AccessMethodTriggerFactory.LOADER.remove();
}
}
}