Fixed an Issue on API Calling via MSB
[holmes/rule-management.git] / rulemgt / src / test / java / org / onap / holmes / rulemgt / RuleAllocatorTest.java
1 /**
2  * Copyright 2017-2020 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;
18
19
20 import org.glassfish.hk2.api.ServiceLocator;
21 import org.junit.After;
22 import org.junit.Before;
23 import org.junit.Ignore;
24 import org.junit.Test;
25 import org.junit.runner.RunWith;
26 import org.onap.holmes.common.api.entity.CorrelationRule;
27 import org.onap.holmes.common.dropwizard.ioc.utils.ServiceLocatorHolder;
28 import org.onap.holmes.common.utils.DbDaoUtil;
29 import org.onap.holmes.rulemgt.bolt.enginebolt.EngineWrapper;
30 import org.onap.holmes.rulemgt.db.CorrelationRuleDao;
31 import org.onap.holmes.rulemgt.tools.EngineTools;
32 import org.onap.holmes.rulemgt.wrapper.RuleMgtWrapper;
33 import org.onap.holmes.rulemgt.wrapper.RuleQueryWrapper;
34 import org.powermock.api.easymock.PowerMock;
35 import org.powermock.core.classloader.annotations.PrepareForTest;
36 import org.powermock.modules.junit4.PowerMockRunner;
37 import org.powermock.reflect.Whitebox;
38
39 import java.util.ArrayList;
40 import java.util.Calendar;
41 import java.util.List;
42 import java.util.stream.Collectors;
43
44 import static org.easymock.EasyMock.*;
45 import static org.onap.holmes.rulemgt.RuleAllocator.ENABLE;
46
47 @RunWith(PowerMockRunner.class)
48 @PrepareForTest({ServiceLocator.class, RuleMgtWrapper.class, RuleQueryWrapper.class, EngineWrapper.class,
49         EngineTools.class, DbDaoUtil.class, ServiceLocatorHolder.class})
50 public class RuleAllocatorTest {
51
52     private RuleMgtWrapper ruleMgtWrapperMock;
53     private RuleQueryWrapper ruleQueryWrapperMock;
54     private EngineWrapper engineWrapperMock;
55     private EngineTools engineToolsMock;
56     private DbDaoUtil dbDaoUtilMock;
57     private CorrelationRuleDao correlationRuleDaoMock;
58
59     private List<CorrelationRule> rules;
60     private List<String> existingIps;
61
62     @Before
63     public void before() {
64         ruleMgtWrapperMock = PowerMock.createMock(RuleMgtWrapper.class);
65         ruleQueryWrapperMock = PowerMock.createMock(RuleQueryWrapper.class);
66         engineWrapperMock = PowerMock.createMock(EngineWrapper.class);
67         engineToolsMock = PowerMock.createMock(EngineTools.class);
68         dbDaoUtilMock = PowerMock.createMock(DbDaoUtil.class);
69         correlationRuleDaoMock = PowerMock.createMock(CorrelationRuleDao.class);
70
71         rules = new ArrayList<>();
72         for (int i = 0; i < 20; ++i) {
73             CorrelationRule rule = new CorrelationRule();
74             rule.setRid("rid-" + i);
75             rule.setName("rule-" + i);
76             rule.setDescription("desc-" + i);
77             rule.setEnabled(1);
78             rule.setTemplateID((long) i);
79             rule.setEngineID("engine-" + i);
80             rule.setCreateTime(Calendar.getInstance().getTime());
81             rule.setUpdateTime(Calendar.getInstance().getTime());
82             rule.setPackageName("package-" + i);
83             rule.setClosedControlLoopName("CL-" + i);
84             rule.setEngineInstance("10.15.3." + (i % 10));
85             rules.add(rule);
86         }
87
88         existingIps = new ArrayList<>();
89         for (int i = 0; i < 10; ++i) {
90             existingIps.add("10.15.3." + i);
91         }
92     }
93
94     @After
95     public void after() {
96         PowerMock.resetAll();
97     }
98
99     @Test
100     public void allocateRuleTest_engine_scaled_out() throws Exception {
101
102         List<String> newEngineInstances = new ArrayList();
103         newEngineInstances.add("127.0.0.1");
104         newEngineInstances.add("10.23.0.72");
105
106         List<String> ipListFromMsb = new ArrayList();
107         ipListFromMsb.addAll(newEngineInstances);
108         ipListFromMsb.addAll(existingIps);
109
110         expect(dbDaoUtilMock.getJdbiDaoByOnDemand(CorrelationRuleDao.class)).andReturn(correlationRuleDaoMock);
111         expect(engineToolsMock.getInstanceList()).andReturn(ipListFromMsb);
112         expect(engineToolsMock.getLegacyEngineInstances()).andReturn(existingIps);
113         expect(ruleQueryWrapperMock.queryRuleByEnable(ENABLE)).andReturn(rules.stream()
114                 .filter(r -> r.getEnabled() == ENABLE).collect(Collectors.toList()));
115         for (String ip : existingIps) {
116             expect(ruleQueryWrapperMock.queryRuleByEngineInstance(ip))
117                     .andReturn(rules.stream().filter(r -> r.getEngineInstance().equals(ip)).collect(Collectors.toList()));
118
119         }
120         expect(engineWrapperMock.deleteRuleFromEngine(anyObject(String.class),
121                 anyObject(String.class))).andReturn(true).anyTimes();
122         expect(ruleQueryWrapperMock.queryRuleByEngineInstance(anyObject(String.class)))
123                 .andReturn(new ArrayList<>()).times(2);
124
125         expect(ruleMgtWrapperMock.deployRule2Engine(anyObject(CorrelationRule.class),
126                 anyObject(String.class))).andReturn("").anyTimes();
127         correlationRuleDaoMock.updateRule(anyObject(CorrelationRule.class));
128         expectLastCall().anyTimes();
129
130         PowerMock.replayAll();
131
132         RuleAllocator ruleAllocator = new RuleAllocator(ruleMgtWrapperMock, ruleQueryWrapperMock,
133                 engineWrapperMock, engineToolsMock, dbDaoUtilMock);
134         ruleAllocator.allocateRules();
135
136         PowerMock.verifyAll();
137
138     }
139
140     @Test
141     public void allocateRuleTest_engine_scaled_in() throws Exception {
142
143         List<String> ipListFromMsb = new ArrayList<>();
144         ipListFromMsb.addAll(existingIps);
145         ipListFromMsb.remove(0);
146
147         expect(dbDaoUtilMock.getJdbiDaoByOnDemand(CorrelationRuleDao.class)).andReturn(correlationRuleDaoMock);
148         expect(engineToolsMock.getInstanceList()).andReturn(ipListFromMsb);
149         expect(engineToolsMock.getLegacyEngineInstances()).andReturn(existingIps);
150         for (String ip : existingIps) {
151             expect(ruleQueryWrapperMock.queryRuleByEngineInstance(anyObject(String.class)))
152                     .andReturn(rules.stream().filter(r -> r.getEngineInstance().equals(ip)).collect(Collectors.toList()));
153
154         }
155         expect(ruleMgtWrapperMock.deployRule2Engine(anyObject(CorrelationRule.class), anyString())).andReturn("anyId").times(2);
156         correlationRuleDaoMock.updateRule(anyObject(CorrelationRule.class));
157         expectLastCall().times(2);
158
159         PowerMock.replayAll();
160
161         RuleAllocator ruleAllocator = new RuleAllocator(ruleMgtWrapperMock, ruleQueryWrapperMock,
162                 engineWrapperMock, engineToolsMock, dbDaoUtilMock);
163
164         ruleAllocator.allocateRules();
165
166         PowerMock.verifyAll();
167
168     }
169 }