2 * Copyright 2017-2020 ZTE Corporation.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package org.onap.holmes.rulemgt.send;
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;
40 import java.util.ArrayList;
41 import java.util.Calendar;
42 import java.util.Collections;
43 import java.util.List;
44 import java.util.stream.Collectors;
46 import static org.onap.holmes.rulemgt.send.RuleAllocator.ENABLE;
48 @RunWith(PowerMockRunner.class)
49 @PrepareForTest({ServiceLocator.class, RuleMgtWrapper.class, RuleQueryWrapper.class, EngineWrapper.class,
50 EngineInsQueryTool.class, DbDaoUtil.class, ServiceLocatorHolder.class})
51 public class RuleAllocatorTest {
54 public ExpectedException thrown = ExpectedException.none();
56 private RuleMgtWrapper ruleMgtWrapperMock;
57 private RuleQueryWrapper ruleQueryWrapperMock;
58 private EngineWrapper engineWrapperMock;
59 private EngineInsQueryTool engineInsQueryToolMock;
60 private DbDaoUtil dbDaoUtilMock;
61 private CorrelationRuleDao correlationRuleDaoMock;
63 private List<CorrelationRule> rules;
64 private List<String> existingIps;
67 public void before() {
68 PowerMock.mockStatic(ServiceLocatorHolder.class);
69 ServiceLocator locator = PowerMock.createMock(ServiceLocator.class);
70 EasyMock.expect(ServiceLocatorHolder.getLocator()).andReturn(locator);
72 ruleMgtWrapperMock = PowerMock.createMock(RuleMgtWrapper.class);
73 ruleQueryWrapperMock = PowerMock.createMock(RuleQueryWrapper.class);
74 engineWrapperMock = PowerMock.createMock(EngineWrapper.class);
75 engineInsQueryToolMock = PowerMock.createMock(EngineInsQueryTool.class);
76 dbDaoUtilMock = PowerMock.createMock(DbDaoUtil.class);
77 correlationRuleDaoMock = PowerMock.createMock(CorrelationRuleDao.class);
79 EasyMock.expect(locator.getService(RuleMgtWrapper.class)).andReturn(ruleMgtWrapperMock);
80 EasyMock.expect(locator.getService(RuleQueryWrapper.class)).andReturn(ruleQueryWrapperMock);
81 EasyMock.expect(locator.getService(EngineWrapper.class)).andReturn(engineWrapperMock);
82 EasyMock.expect(locator.getService(EngineInsQueryTool.class)).andReturn(engineInsQueryToolMock);
83 EasyMock.expect(locator.getService(DbDaoUtil.class)).andReturn(dbDaoUtilMock);
84 EasyMock.expect(dbDaoUtilMock.getJdbiDaoByOnDemand(CorrelationRuleDao.class)).andReturn(correlationRuleDaoMock);
86 rules = new ArrayList<>();
87 for (int i = 0; i < 20; ++i) {
88 CorrelationRule rule = new CorrelationRule();
89 rule.setRid("rid-" + i);
90 rule.setName("rule-" + i);
91 rule.setDescription("desc-" + i);
93 rule.setTemplateID((long) i);
94 rule.setEngineID("engine-" + i);
95 rule.setCreateTime(Calendar.getInstance().getTime());
96 rule.setUpdateTime(Calendar.getInstance().getTime());
97 rule.setPackageName("package-" + i);
98 rule.setClosedControlLoopName("CL-" + i);
99 rule.setEngineInstance("10.15.3." + (i % 10));
103 existingIps = new ArrayList<>();
104 for (int i = 0; i < 10; ++i) {
105 existingIps.add("10.15.3." + i);
110 public void after() {
111 PowerMock.resetAll();
115 public void allocateRuleTest_engine_scaled_out() throws Exception {
117 List<String> ipListFromMsb = new ArrayList<>();
118 ipListFromMsb.add("127.0.0.1");
119 ipListFromMsb.add("10.23.0.72");
120 ipListFromMsb.addAll(existingIps);
122 EasyMock.expect(engineInsQueryToolMock.getInstanceList()).andReturn(existingIps);
123 EasyMock.expect(ruleQueryWrapperMock.queryRuleByEnable(ENABLE)).andReturn(rules.stream()
124 .filter(r -> r.getEnabled() == ENABLE).collect(Collectors.toList()));
125 for (String ip : existingIps) {
126 EasyMock.expect(ruleQueryWrapperMock.queryRuleByEngineInstance(EasyMock.anyObject(String.class)))
127 .andReturn(rules.stream().filter(r -> r.getEngineInstance().equals(ip)).collect(Collectors.toList()));
130 EasyMock.expect(engineWrapperMock.deleteRuleFromEngine(EasyMock.anyObject(String.class),
131 EasyMock.anyObject(String.class))).andReturn(true).anyTimes();
132 EasyMock.expect(ruleQueryWrapperMock.queryRuleByEngineInstance(EasyMock.anyObject(String.class)))
133 .andReturn(new ArrayList<>()).times(2);
135 EasyMock.expect(ruleMgtWrapperMock.deployRule2Engine(EasyMock.anyObject(CorrelationRule.class),
136 EasyMock.anyObject(String.class))).andReturn("").anyTimes();
137 correlationRuleDaoMock.updateRule(EasyMock.anyObject(CorrelationRule.class));
138 EasyMock.expectLastCall().anyTimes();
140 PowerMock.replayAll();
142 RuleAllocator ruleAllocator = new RuleAllocator();
143 ruleAllocator.allocateRules(ipListFromMsb);
145 PowerMock.verifyAll();
150 public void allocateRuleTest_engine_scaled_in() throws Exception {
152 List<String> ipListFromMsb = new ArrayList<>();
153 ipListFromMsb.addAll(existingIps);
154 ipListFromMsb.remove(0);
156 List<CorrelationRule> rules = new ArrayList<>();
159 EasyMock.expect(engineInsQueryToolMock.getInstanceList()).andReturn(existingIps);
160 for (String ip : existingIps) {
161 EasyMock.expect(ruleQueryWrapperMock.queryRuleByEngineInstance(EasyMock.anyObject(String.class)))
162 .andReturn(rules.stream().filter(r -> r.getEngineInstance().equals(ip)).collect(Collectors.toList()));
165 EasyMock.expect(engineWrapperMock.deleteRuleFromEngine(EasyMock.anyObject(String.class),
166 EasyMock.anyObject(String.class))).andReturn(true).anyTimes();
168 PowerMock.replayAll();
170 RuleAllocator ruleAllocator = new RuleAllocator();
171 ruleAllocator.allocateRules(ipListFromMsb);
173 PowerMock.verifyAll();
178 public void allocateRuleTest_empty_param() throws Exception {
180 EasyMock.expect(engineInsQueryToolMock.getInstanceList()).andReturn(Collections.emptyList());
182 thrown.expect(NullPointerException.class);
184 PowerMock.replayAll();
186 RuleAllocator ruleAllocator = new RuleAllocator();
187 ruleAllocator.allocateRules(null);
189 PowerMock.verifyAll();
194 public void allocateRuleTest_equal_engine_instance_num() throws Exception {
196 List<String> ipListFromMsb = new ArrayList<>();
197 ipListFromMsb.addAll(existingIps);
199 EasyMock.expect(engineInsQueryToolMock.getInstanceList()).andReturn(existingIps);
201 PowerMock.replayAll();
203 RuleAllocator ruleAllocator = new RuleAllocator();
204 ruleAllocator.allocateRules(ipListFromMsb);
206 PowerMock.verifyAll();