Migrate FlowBasedServicesNodeStateListener to use new listeners fw
[genius.git] / resourcemanager / resourcemanager-impl / src / test / java / org / opendaylight / genius / resourcemanager / tests / ResourceManagerTest.java
1 /*
2  * Copyright (c) 2017 Ericsson Spain, S.A. and others. All rights reserved.
3  *
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
7  */
8 package org.opendaylight.genius.resourcemanager.tests;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertTrue;
12
13 import java.util.HashMap;
14 import java.util.Map;
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;
44
45 /**
46  * Resource Manager Service Test Suite.
47  *
48  * @author David Suárez
49  */
50 public class ResourceManagerTest extends AbstractConcurrentDataBrokerTest {
51
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();
55
56     public final @Rule MethodRule guice = new GuiceRule(
57             ResourceManagerTestModule.class, JobCoordinatorTestModule.class);
58
59     @Inject DataBroker dataBroker;
60     @Inject ResourceManagerService resourceManager;
61
62     private static final Long NUMBER_OF_RESOURCES = 5L;
63
64     @SuppressWarnings("serial")
65     private static final Map<String, Class<? extends ResourceTypeBase>>
66         RESOURCE_TYPES = new HashMap<String, Class<? extends ResourceTypeBase>>() {
67                 {
68                     put("Tables", ResourceTypeTableIds.class);
69                     put("Meters", ResourceTypeMeterIds.class);
70                     put("Groups", ResourceTypeGroupIds.class);
71                 }
72         };
73
74     @Test
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());
80         }
81     }
82
83     private Future<RpcResult<GetAvailableResourcesOutput>> getAvailableResources(
84             Class<? extends ResourceTypeBase> resourceType)
85             throws Exception {
86         final GetAvailableResourcesInput input = new GetAvailableResourcesInputBuilder().setResourceType(resourceType)
87                 .build();
88         return resourceManager.getAvailableResources(input);
89     }
90
91     @Test
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());
99             }
100             assertTrue(result.getResult().getDelayedResourceEntries().isEmpty());
101         }
102     }
103
104     private Future<RpcResult<GetResourcePoolOutput>> getResourcePool(Class<? extends ResourceTypeBase> resourceType)
105             throws Exception {
106         final GetResourcePoolInput input = new GetResourcePoolInputBuilder().setResourceType(resourceType).build();
107         return resourceManager.getResourcePool(input);
108     }
109
110     @Test
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()));
118
119             // Release resources
120             releaseResource(resourceType.getName(), resourceType);
121         }
122     }
123
124     @Test(expected = NullPointerException.class)
125     public void testAllocateNullResource() throws Exception {
126         allocateResource(null, ResourceTypeTableIds.class, NUMBER_OF_RESOURCES).get();
127     }
128
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);
135     }
136
137     @Test
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);
142
143             // Release resources
144             RpcResult<Void> result = releaseResource(resourceType.getName(), resourceType).get();
145             assertSuccessfulFutureRpcResult(result);
146         }
147     }
148
149     @Test(expected = NullPointerException.class)
150     public void testReleaseNullResource() throws Exception {
151         releaseResource(null, ResourceTypeTableIds.class).get();
152     }
153
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);
159     }
160
161     private void assertSuccessfulFutureRpcResult(RpcResult<?> result)
162             throws InterruptedException, ExecutionException, TimeoutException {
163         assertTrue(result.isSuccessful());
164         assertTrue(result.getErrors().isEmpty());
165     }
166 }