1815ebbf2cfa42efa00ab10536f29628ecbfcc2f
[holmes/rule-management.git] / rulemgt / src / test / java / org / onap / holmes / rulemgt / send / RuleAllocatorTest.java
1 /**
2  * Copyright 2017 ZTE Corporation.
3  * <p>
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  * <p>
8  * http://www.apache.org/licenses/LICENSE-2.0
9  * <p>
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.onap.holmes.rulemgt.send;
18
19
20 import org.easymock.EasyMock;
21 import org.glassfish.hk2.api.ServiceLocator;
22 import org.junit.After;
23 import org.junit.Before;
24 import org.junit.Rule;
25 import org.junit.Test;
26 import org.junit.rules.ExpectedException;
27 import org.junit.runner.RunWith;
28 import org.onap.holmes.common.api.entity.CorrelationRule;
29 import org.onap.holmes.common.dropwizard.ioc.utils.ServiceLocatorHolder;
30 import org.onap.holmes.common.utils.DbDaoUtil;
31 import org.onap.holmes.rulemgt.bolt.enginebolt.EngineWrapper;
32 import org.onap.holmes.rulemgt.db.CorrelationRuleDao;
33 import org.onap.holmes.rulemgt.msb.EngineInsQueryTool;
34 import org.onap.holmes.rulemgt.wrapper.RuleMgtWrapper;
35 import org.onap.holmes.rulemgt.wrapper.RuleQueryWrapper;
36 import org.powermock.api.easymock.PowerMock;
37 import org.powermock.core.classloader.annotations.PrepareForTest;
38 import org.powermock.modules.junit4.PowerMockRunner;
39 import org.powermock.reflect.Whitebox;
40
41 import java.util.ArrayList;
42 import java.util.Calendar;
43 import java.util.Collections;
44 import java.util.List;
45 import java.util.stream.Collectors;
46
47 import static org.hamcrest.core.IsEqual.equalTo;
48 import static org.junit.Assert.assertThat;
49 import static org.onap.holmes.rulemgt.send.RuleAllocator.ENABLE;
50
51 @RunWith(PowerMockRunner.class)
52 @PrepareForTest({ServiceLocator.class, RuleMgtWrapper.class, RuleQueryWrapper.class, EngineWrapper.class,
53         EngineInsQueryTool.class, DbDaoUtil.class, RuleAllocator.class, ServiceLocatorHolder.class})
54 public class RuleAllocatorTest {
55
56     @Rule
57     public ExpectedException thrown = ExpectedException.none();
58
59     private RuleMgtWrapper ruleMgtWrapperMock;
60     private RuleQueryWrapper ruleQueryWrapperMock;
61     private EngineWrapper engineWrapperMock;
62     private EngineInsQueryTool engineInsQueryToolMock;
63     private DbDaoUtil dbDaoUtilMock;
64     private CorrelationRuleDao correlationRuleDaoMock;
65
66     private List<CorrelationRule> rules;
67     private List<String> existingIps;
68
69     @Before
70     public void before() {
71         PowerMock.mockStatic(ServiceLocatorHolder.class);
72         ServiceLocator locator = PowerMock.createMock(ServiceLocator.class);
73         EasyMock.expect(ServiceLocatorHolder.getLocator()).andReturn(locator);
74
75         ruleMgtWrapperMock = PowerMock.createMock(RuleMgtWrapper.class);
76         ruleQueryWrapperMock = PowerMock.createMock(RuleQueryWrapper.class);
77         engineWrapperMock = PowerMock.createMock(EngineWrapper.class);
78         engineInsQueryToolMock = PowerMock.createMock(EngineInsQueryTool.class);
79         dbDaoUtilMock = PowerMock.createMock(DbDaoUtil.class);
80         correlationRuleDaoMock = PowerMock.createMock(CorrelationRuleDao.class);
81
82         EasyMock.expect(locator.getService(RuleMgtWrapper.class)).andReturn(ruleMgtWrapperMock);
83         EasyMock.expect(locator.getService(RuleQueryWrapper.class)).andReturn(ruleQueryWrapperMock);
84         EasyMock.expect(locator.getService(EngineWrapper.class)).andReturn(engineWrapperMock);
85         EasyMock.expect(locator.getService(EngineInsQueryTool.class)).andReturn(engineInsQueryToolMock);
86         EasyMock.expect(locator.getService(DbDaoUtil.class)).andReturn(dbDaoUtilMock);
87         EasyMock.expect(dbDaoUtilMock.getJdbiDaoByOnDemand(CorrelationRuleDao.class)).andReturn(correlationRuleDaoMock);
88
89         rules = new ArrayList<>();
90         for (int i = 0; i < 20; ++i) {
91             CorrelationRule rule = new CorrelationRule();
92             rule.setRid("rid-" + i);
93             rule.setName("rule-" + i);
94             rule.setDescription("desc-" + i);
95             rule.setEnabled(1);
96             rule.setTemplateID((long) i);
97             rule.setEngineID("engine-" + i);
98             rule.setCreateTime(Calendar.getInstance().getTime());
99             rule.setUpdateTime(Calendar.getInstance().getTime());
100             rule.setPackageName("package-" + i);
101             rule.setClosedControlLoopName("CL-" + i);
102             rule.setEngineInstance("10.15.3." + (i % 10));
103             rules.add(rule);
104         }
105
106         existingIps = new ArrayList<>();
107         for (int i = 0; i < 10; ++i) {
108             existingIps.add("10.15.3." + i);
109         }
110     }
111
112     @After
113     public void after() {
114         PowerMock.resetAll();
115     }
116
117     @Test
118     public void allocateRuleTest_engine_scaled_out() throws Exception {
119
120         List<String> ipListFromMsb = new ArrayList<>();
121         ipListFromMsb.add("127.0.0.1");
122         ipListFromMsb.add("10.23.0.72");
123         ipListFromMsb.addAll(existingIps);
124
125         EasyMock.expect(engineInsQueryToolMock.getInstanceList()).andReturn(existingIps);
126         EasyMock.expect(ruleQueryWrapperMock.queryRuleByEnable(ENABLE)).andReturn(rules.stream()
127                 .filter(r -> r.getEnabled() == ENABLE).collect(Collectors.toList()));
128         for (String ip : existingIps) {
129             EasyMock.expect(ruleQueryWrapperMock.queryRuleByEngineInstance(EasyMock.anyObject(String.class)))
130                     .andReturn(rules.stream().filter(r -> r.getEngineInstance().equals(ip)).collect(Collectors.toList()));
131
132         }
133         EasyMock.expect(engineWrapperMock.deleteRuleFromEngine(EasyMock.anyObject(String.class),
134                 EasyMock.anyObject(String.class))).andReturn(true).anyTimes();
135         EasyMock.expect(ruleQueryWrapperMock.queryRuleByEngineInstance(EasyMock.anyObject(String.class)))
136                 .andReturn(new ArrayList<>()).times(2);
137
138         EasyMock.expect(ruleMgtWrapperMock.deployRule2Engine(EasyMock.anyObject(CorrelationRule.class),
139                 EasyMock.anyObject(String.class))).andReturn("").anyTimes();
140         correlationRuleDaoMock.updateRule(EasyMock.anyObject(CorrelationRule.class));
141         EasyMock.expectLastCall().anyTimes();
142
143         PowerMock.replayAll();
144
145         RuleAllocator ruleAllocator = new RuleAllocator();
146         ruleAllocator.allocateRules(ipListFromMsb);
147
148         PowerMock.verifyAll();
149
150     }
151
152     @Test
153     public void allocateRuleTest_engine_scaled_in() throws Exception {
154
155         List<String> ipListFromMsb = new ArrayList<>();
156         ipListFromMsb.addAll(existingIps);
157         ipListFromMsb.remove(0);
158
159         List<CorrelationRule> rules = new ArrayList<>();
160
161
162         EasyMock.expect(engineInsQueryToolMock.getInstanceList()).andReturn(existingIps);
163         for (String ip : existingIps) {
164             EasyMock.expect(ruleQueryWrapperMock.queryRuleByEngineInstance(EasyMock.anyObject(String.class)))
165                     .andReturn(rules.stream().filter(r -> r.getEngineInstance().equals(ip)).collect(Collectors.toList()));
166
167         }
168         EasyMock.expect(engineWrapperMock.deleteRuleFromEngine(EasyMock.anyObject(String.class),
169                 EasyMock.anyObject(String.class))).andReturn(true).anyTimes();
170
171         PowerMock.replayAll();
172
173         RuleAllocator ruleAllocator = new RuleAllocator();
174         ruleAllocator.allocateRules(ipListFromMsb);
175
176         PowerMock.verifyAll();
177
178     }
179
180     @Test
181     public void allocateRuleTest_empty_param() throws Exception {
182
183         EasyMock.expect(engineInsQueryToolMock.getInstanceList()).andReturn(Collections.emptyList());
184
185         thrown.expect(NullPointerException.class);
186
187         PowerMock.replayAll();
188
189         RuleAllocator ruleAllocator = new RuleAllocator();
190         ruleAllocator.allocateRules(null);
191
192         PowerMock.verifyAll();
193
194     }
195
196     @Test
197     public void allocateRuleTest_equal_engine_instance_num() throws Exception {
198
199         List<String> ipListFromMsb = new ArrayList<>();
200         ipListFromMsb.addAll(existingIps);
201
202         EasyMock.expect(engineInsQueryToolMock.getInstanceList()).andReturn(existingIps);
203
204         PowerMock.replayAll();
205
206         RuleAllocator ruleAllocator = new RuleAllocator();
207         ruleAllocator.allocateRules(ipListFromMsb);
208
209         PowerMock.verifyAll();
210
211     }
212
213 }