2 * Copyright (c) 2017 Ericsson Spain, S.A. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.genius.resourcemanager.tests;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertTrue;
13 import java.util.HashMap;
15 import java.util.concurrent.ExecutionException;
16 import java.util.concurrent.Future;
17 import java.util.concurrent.TimeoutException;
18 import javax.inject.Inject;
19 import org.junit.Rule;
20 import org.junit.Test;
21 import org.junit.rules.MethodRule;
22 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
23 import org.opendaylight.controller.md.sal.binding.test.AbstractConcurrentDataBrokerTest;
24 import org.opendaylight.genius.datastoreutils.testutils.JobCoordinatorTestModule;
25 import org.opendaylight.infrautils.inject.guice.testutils.GuiceRule;
26 import org.opendaylight.infrautils.testutils.LogRule;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.resourcemanager.rev160622.AllocateResourceInput;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.resourcemanager.rev160622.AllocateResourceInputBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.resourcemanager.rev160622.AllocateResourceOutput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.resourcemanager.rev160622.GetAvailableResourcesInput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.resourcemanager.rev160622.GetAvailableResourcesInputBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.resourcemanager.rev160622.GetAvailableResourcesOutput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.resourcemanager.rev160622.GetResourcePoolInput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.resourcemanager.rev160622.GetResourcePoolInputBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.resourcemanager.rev160622.GetResourcePoolOutput;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.resourcemanager.rev160622.ReleaseResourceInput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.resourcemanager.rev160622.ReleaseResourceInputBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.resourcemanager.rev160622.ResourceManagerService;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.resourcemanager.rev160622.ResourceTypeBase;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.resourcemanager.rev160622.ResourceTypeGroupIds;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.resourcemanager.rev160622.ResourceTypeMeterIds;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.resourcemanager.rev160622.ResourceTypeTableIds;
43 import org.opendaylight.yangtools.yang.common.RpcResult;
46 * Resource Manager Service Test Suite.
48 * @author David Suárez
50 public class ResourceManagerTest extends AbstractConcurrentDataBrokerTest {
52 public final @Rule LogRule logRule = new LogRule();
53 // TODO un-comment after https://bugs.opendaylight.org/show_bug.cgi?id=9204 (and use of it in ResourceManager)
54 // public final @Rule LogCaptureRule logCaptureRule = new LogCaptureRule();
56 public final @Rule MethodRule guice = new GuiceRule(
57 ResourceManagerTestModule.class, JobCoordinatorTestModule.class);
59 @Inject DataBroker dataBroker;
60 @Inject ResourceManagerService resourceManager;
62 private static final Long NUMBER_OF_RESOURCES = 5L;
64 @SuppressWarnings("serial")
65 private static final Map<String, Class<? extends ResourceTypeBase>>
66 RESOURCE_TYPES = new HashMap<String, Class<? extends ResourceTypeBase>>() {
68 put("Tables", ResourceTypeTableIds.class);
69 put("Meters", ResourceTypeMeterIds.class);
70 put("Groups", ResourceTypeGroupIds.class);
75 public void testGetAvailableResources() throws Exception {
76 for (Class<? extends ResourceTypeBase> resourceType : RESOURCE_TYPES.values()) {
77 RpcResult<GetAvailableResourcesOutput> result = getAvailableResources(resourceType).get();
78 assertSuccessfulFutureRpcResult(result);
79 assertEquals(255L, result.getResult().getTotalAvailableIdCount().longValue());
83 private Future<RpcResult<GetAvailableResourcesOutput>> getAvailableResources(
84 Class<? extends ResourceTypeBase> resourceType)
86 final GetAvailableResourcesInput input = new GetAvailableResourcesInputBuilder().setResourceType(resourceType)
88 return resourceManager.getAvailableResources(input);
92 public void testGetResourcePools() throws Exception {
93 for (Class<? extends ResourceTypeBase> resourceType : RESOURCE_TYPES.values()) {
94 RpcResult<GetResourcePoolOutput> result = getResourcePool(resourceType).get();
95 assertSuccessfulFutureRpcResult(result);
96 for (org.opendaylight.yang.gen.v1.urn.opendaylight.genius.resourcemanager.rev160622.getresourcepool.output
97 .AvailableIds availableIds : result.getResult().getAvailableIds()) {
98 assertTrue(availableIds.getStart().longValue() < availableIds.getEnd().longValue());
100 assertTrue(result.getResult().getDelayedResourceEntries().isEmpty());
104 private Future<RpcResult<GetResourcePoolOutput>> getResourcePool(Class<? extends ResourceTypeBase> resourceType)
106 final GetResourcePoolInput input = new GetResourcePoolInputBuilder().setResourceType(resourceType).build();
107 return resourceManager.getResourcePool(input);
111 public void testAllocateResource() throws Exception {
112 for (Class<? extends ResourceTypeBase> resourceType : RESOURCE_TYPES.values()) {
113 // Allocate resources
114 RpcResult<AllocateResourceOutput> result = allocateResource(resourceType.getName(), resourceType,
115 NUMBER_OF_RESOURCES).get();
116 assertSuccessfulFutureRpcResult(result);
117 assertEquals(NUMBER_OF_RESOURCES, Long.valueOf(result.getResult().getIdValues().size()));
120 releaseResource(resourceType.getName(), resourceType);
124 @Test(expected = NullPointerException.class)
125 public void testAllocateNullResource() throws Exception {
126 allocateResource(null, ResourceTypeTableIds.class, NUMBER_OF_RESOURCES).get();
129 private Future<RpcResult<AllocateResourceOutput>> allocateResource(String resourceKey,
130 Class<? extends ResourceTypeBase> resourceType,
131 Long numberOfResources) throws Exception {
132 final AllocateResourceInput input = new AllocateResourceInputBuilder().setResourceType(resourceType)
133 .setSize(numberOfResources).setIdKey(resourceKey).setSize(numberOfResources).build();
134 return resourceManager.allocateResource(input);
138 public void testReleaseResource() throws Exception {
139 for (Class<? extends ResourceTypeBase> resourceType : RESOURCE_TYPES.values()) {
140 // Allocate resources
141 allocateResource(resourceType.getName(), resourceType, NUMBER_OF_RESOURCES);
144 RpcResult<Void> result = releaseResource(resourceType.getName(), resourceType).get();
145 assertSuccessfulFutureRpcResult(result);
149 @Test(expected = NullPointerException.class)
150 public void testReleaseNullResource() throws Exception {
151 releaseResource(null, ResourceTypeTableIds.class).get();
154 private Future<RpcResult<Void>> releaseResource(String resourceKey,
155 Class<? extends ResourceTypeBase> resourceType) throws Exception {
156 final ReleaseResourceInput input = new ReleaseResourceInputBuilder().setResourceType(resourceType)
157 .setIdKey(resourceKey).build();
158 return resourceManager.releaseResource(input);
161 private void assertSuccessfulFutureRpcResult(RpcResult<?> result)
162 throws InterruptedException, ExecutionException, TimeoutException {
163 assertTrue(result.isSuccessful());
164 assertTrue(result.getErrors().isEmpty());