Skip to content

Commit 2473a17

Browse files
ValentinTyhonovvasile-baluta
authored andcommitted
Test for measure performance EI is added (TrafficGeneratedTest). (#15)
* Test for measure performance EI is added (TrafficGeneratedTest). Number of packages of events (7 events in package) you can add in variable EVENT_PACKAGES. ALL, DEBUG, ERROR, FATAL, INFO, TRACE, WARN parametres are added to a jar file at the time of execution for start EI with logs. No parameters start EI without logs. /// Ex. with logs: java -jar /path/file.jar INFO Ex. without logs: java -jar /path/file.jar /// File ArtifactRules_new.json is modified - added posibility to send SourceChangeCreatedEvent and SourceChangeSubmittedEvent without error. * problem with rules.path fixed
1 parent 04e6203 commit 2473a17

File tree

8 files changed

+625
-7
lines changed

8 files changed

+625
-7
lines changed

.travis.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ before_install:
1313
- chmod +x pom.xml
1414

1515
script:
16-
- mvn -DsomeModule.test.excludes="**/FlowTest.java, **/FlowTest2.java" test
16+
- mvn -DsomeModule.test.excludes="**/FlowTest.java, **/FlowTest2.java, **/TrafficGeneratedTest.java" test
1717
- mvn -DsomeModule.test.includes="**/FlowTest.java" test
1818
- mvn -DsomeModule.test.includes="**/FlowTest2.java" test
19+
- mvn -DsomeModule.test.includes="**/TrafficGeneratedTest.java" test

src/main/java/com/ericsson/ei/App.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,30 @@
55
import org.springframework.scheduling.annotation.EnableAsync;
66
import org.springframework.scheduling.annotation.EnableScheduling;
77

8+
import java.util.ArrayList;
9+
import java.util.Collections;
10+
import java.util.List;
11+
812
@SpringBootApplication
913
@EnableAsync
1014
@EnableScheduling
1115
public class App {
1216

1317
public static void main(String[] args) {
18+
19+
List<String> logLevels = new ArrayList<>();
20+
Collections.addAll(logLevels, "ALL", "DEBUG", "ERROR", "FATAL", "INFO", "TRACE", "WARN");
21+
22+
if(logLevels.contains(args[0])) {
23+
System.setProperty("logging.level.root", args[0]);
24+
System.setProperty("logging.level.org.springframework.web", args[0]);
25+
System.setProperty("logging.level.com.ericsson.ei", args[0]);
26+
} else {
27+
System.setProperty("logging.level.root", "OFF");
28+
System.setProperty("logging.level.org.springframework.web", "OFF");
29+
System.setProperty("logging.level.com.ericsson.ei", "OFF");
30+
}
31+
1432
SpringApplication.run(App.class, args);
1533
}
1634

src/main/java/com/ericsson/ei/rules/RulesHandler.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import java.io.*;
44
import java.util.Iterator;
5+
6+
import org.apache.commons.io.FileUtils;
57
import org.slf4j.Logger;
68
import org.slf4j.LoggerFactory;
79

@@ -28,7 +30,11 @@ public class RulesHandler {
2830
if (parsedJason == null) {
2931
try {
3032
InputStream in = this.getClass().getResourceAsStream(jsonFilePath);
31-
jsonFileContent = getContent(in);
33+
if(in == null) {
34+
jsonFileContent = FileUtils.readFileToString(new File(jsonFilePath));
35+
} else {
36+
jsonFileContent = getContent(in);
37+
}
3238
ObjectMapper objectmapper = new ObjectMapper();
3339
parsedJason = objectmapper.readTree(jsonFileContent);
3440
} catch (Exception e) {

src/main/java/com/ericsson/ei/waitlist/WaitListWorker.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,6 @@
2222
@Component
2323
public class WaitListWorker {
2424

25-
@Value("${waitlist.initialDelayResend:}") private int initialDelayResend;
26-
@Value("${waitlist.fixedRateResend:}") private int fixedRateResend;
27-
2825
@Autowired
2926
private WaitListStorageHandler waitListStorageHandler;
3027

src/main/resources/application.properties

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ aggregated.collection.name: aggregated_objects
2626
event_object_map.collection.name: event_object_map
2727
waitlist.collection.name: wait_list
2828
waitlist.collection.ttlValue: 600
29-
waitlist.initialDelayResend: 2000
30-
waitlist.fixedRateResend: 15000
3129
database.name: eiffel_intelligence_eiffelxxx
3230
subscription.collection.name: subscription
3331

Lines changed: 262 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,262 @@
1+
package com.ericsson.ei.flowtests;
2+
3+
import com.ericsson.ei.handlers.ObjectHandler;
4+
import com.ericsson.ei.mongodbhandler.MongoDBHandler;
5+
import com.ericsson.ei.rmqhandler.RmqHandler;
6+
import com.ericsson.ei.waitlist.WaitListStorageHandler;
7+
import com.fasterxml.jackson.databind.JsonNode;
8+
import com.fasterxml.jackson.databind.ObjectMapper;
9+
import com.fasterxml.jackson.databind.node.ObjectNode;
10+
import com.mongodb.MongoClient;
11+
import com.mongodb.client.MongoCollection;
12+
import com.rabbitmq.client.Channel;
13+
import com.rabbitmq.client.Connection;
14+
import com.rabbitmq.client.ConnectionFactory;
15+
import de.flapdoodle.embed.mongo.distribution.Version;
16+
import de.flapdoodle.embed.mongo.tests.MongodForTestsFactory;
17+
import org.apache.commons.io.FileUtils;
18+
import org.apache.qpid.server.Broker;
19+
import org.apache.qpid.server.BrokerOptions;
20+
import org.junit.AfterClass;
21+
import org.junit.BeforeClass;
22+
import org.junit.Test;
23+
import org.junit.runner.RunWith;
24+
import org.slf4j.Logger;
25+
import org.slf4j.LoggerFactory;
26+
import org.springframework.amqp.core.BindingBuilder;
27+
import org.springframework.amqp.core.Queue;
28+
import org.springframework.amqp.core.TopicExchange;
29+
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
30+
import org.springframework.amqp.rabbit.core.RabbitAdmin;
31+
import org.springframework.beans.factory.annotation.Autowired;
32+
import org.springframework.beans.factory.annotation.Value;
33+
import org.springframework.boot.test.context.SpringBootTest;
34+
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
35+
36+
import javax.annotation.PostConstruct;
37+
import java.io.File;
38+
import java.io.IOException;
39+
import java.util.ArrayList;
40+
import java.util.List;
41+
import java.util.concurrent.TimeUnit;
42+
43+
import static org.junit.Assert.assertEquals;
44+
45+
@RunWith(SpringJUnit4ClassRunner.class)
46+
@SpringBootTest
47+
public class TrafficGeneratedTest {
48+
49+
private static final int EVENT_PACKAGES = 10;
50+
private static Logger log = LoggerFactory.getLogger(TrafficGeneratedTest.class);
51+
52+
public static File qpidConfig = null;
53+
private static MongodForTestsFactory testsFactory;
54+
static TrafficGeneratedTest.AMQPBrokerManager amqpBrocker;
55+
static Queue queue = null;
56+
static RabbitAdmin admin;
57+
58+
static MongoClient mongoClient = null;
59+
60+
@Autowired
61+
private MongoDBHandler mongoDBHandler;
62+
63+
@Autowired
64+
private WaitListStorageHandler waitlist;
65+
66+
@Autowired
67+
RmqHandler rmqHandler;
68+
69+
@Autowired
70+
ObjectHandler objectHandler;
71+
72+
public static class AMQPBrokerManager {
73+
private String path;
74+
private static final String PORT = "8672";
75+
private final Broker broker = new Broker();
76+
77+
public AMQPBrokerManager(String path) {
78+
super();
79+
this.path = path;
80+
}
81+
82+
public void startBroker() throws Exception {
83+
final BrokerOptions brokerOptions = new BrokerOptions();
84+
brokerOptions.setConfigProperty("qpid.amqp_port", PORT);
85+
brokerOptions.setConfigProperty("qpid.pass_file", "src/test/resources/configs/password.properties");
86+
brokerOptions.setInitialConfigurationLocation(path);
87+
88+
broker.startup(brokerOptions);
89+
}
90+
91+
public void stopBroker() {
92+
broker.shutdown();
93+
}
94+
}
95+
96+
static ConnectionFactory cf;
97+
static Connection conn;
98+
private static String jsonFileContent;
99+
private static JsonNode parsedJason;
100+
private static String jsonFilePath = "src/test/resources/test_events_MP.json";
101+
static private final String inputFilePath = "src/test/resources/aggregated_document_MP.json";
102+
103+
@Value("${database.name}") private String database;
104+
@Value("${event_object_map.collection.name}") private String event_map;
105+
106+
@BeforeClass
107+
public static void setup() throws Exception {
108+
System.setProperty("flow.test", "true");
109+
System.setProperty("eiffel.intelligence.processedEventsCount", "0");
110+
System.setProperty("eiffel.intelligence.waitListEventsCount", "0");
111+
setUpMessageBus();
112+
setUpEmbeddedMongo();
113+
}
114+
115+
@PostConstruct
116+
public void initMocks() {
117+
mongoDBHandler.setMongoClient(mongoClient);
118+
waitlist.setMongoDbHandler(mongoDBHandler);
119+
}
120+
121+
public static void setUpMessageBus() throws Exception {
122+
System.setProperty("rabbitmq.port", "8672");
123+
System.setProperty("rabbitmq.user", "guest");
124+
System.setProperty("rabbitmq.password", "guest");
125+
126+
127+
String config = "src/test/resources/configs/qpidConfig.json";
128+
jsonFileContent = FileUtils.readFileToString(new File(jsonFilePath));
129+
ObjectMapper objectmapper = new ObjectMapper();
130+
parsedJason = objectmapper.readTree(jsonFileContent);
131+
qpidConfig = new File(config);
132+
amqpBrocker = new TrafficGeneratedTest.AMQPBrokerManager(qpidConfig.getAbsolutePath());
133+
amqpBrocker.startBroker();
134+
cf = new ConnectionFactory();
135+
cf.setUsername("guest");
136+
cf.setPassword("guest");
137+
cf.setPort(8672);
138+
conn = cf.newConnection();
139+
}
140+
141+
public static void setUpEmbeddedMongo() throws Exception {
142+
int port = 12349;
143+
System.setProperty("mongodb.port", ""+port);
144+
145+
testsFactory = MongodForTestsFactory.with(Version.V3_4_1);
146+
mongoClient = testsFactory.newMongo();
147+
}
148+
149+
@AfterClass
150+
public static void tearDown() throws Exception {
151+
if (amqpBrocker != null)
152+
amqpBrocker.stopBroker();
153+
154+
try {
155+
conn.close();
156+
} catch (Exception e) {
157+
//We try to close the connection but if
158+
//the connection is closed we just receive the
159+
//exception and go on
160+
}
161+
}
162+
163+
@Test
164+
public void trafficGeneratedTest() {
165+
try {
166+
List<String> eventNames = getEventNamesToSend();
167+
List<String> events = getPreparedEventsToSend(eventNames);
168+
int eventsCount = eventNames.size() * EVENT_PACKAGES;
169+
170+
String queueName = rmqHandler.getQueueName();
171+
String exchange = "ei-poc-4";
172+
createExchange(exchange, queueName);
173+
Channel channel = conn.createChannel();
174+
175+
long timeBefore = System.currentTimeMillis();
176+
177+
for (String event : events) {
178+
try {
179+
channel.basicPublish(exchange, queueName, null, event.getBytes());
180+
TimeUnit.MILLISECONDS.sleep(10);
181+
} catch (InterruptedException e) {}
182+
}
183+
184+
// wait for all events to be processed
185+
long processedEvents = 0;
186+
MongoCollection eventMap = mongoClient.getDatabase(database).getCollection(event_map);
187+
while (processedEvents < eventsCount) {
188+
processedEvents = eventMap.count();
189+
}
190+
191+
TimeUnit.MILLISECONDS.sleep(1000);
192+
193+
long timeAfter = System.currentTimeMillis();
194+
long diffTime = timeAfter - timeBefore;
195+
196+
String expectedDocument = FileUtils.readFileToString(new File(inputFilePath));
197+
ObjectMapper objectmapper = new ObjectMapper();
198+
JsonNode expectedJson = objectmapper.readTree(expectedDocument);
199+
for (int i = 0; i < EVENT_PACKAGES; i++) {
200+
String document = objectHandler.findObjectById("6acc3c87-75e0-4b6d-88f5-b1a5d4".concat(String.format("%06d", i)));
201+
JsonNode actualJson = objectmapper.readTree(document);
202+
assertEquals(expectedJson.toString().length(), actualJson.toString().length());
203+
}
204+
205+
String time = "" + diffTime / 60000 + "m " + (diffTime / 1000) % 60 + "s " + diffTime % 1000;
206+
System.out.println("Time of execution: " + time);
207+
} catch (Exception e) {
208+
log.debug(e.getMessage(),e);
209+
}
210+
}
211+
212+
/**
213+
* This method loops through every package of events and changes their ids and targets to unique value.
214+
* Ids of events that are located in the same package are related.
215+
* Events are sent to RabbitMQ queue. Deterministic traffic is used.
216+
* @param eventNames list of events to be sent.
217+
* @return list of ready to send events.
218+
*/
219+
private List<String> getPreparedEventsToSend(List<String> eventNames) throws IOException {
220+
List<String> events = new ArrayList<>();
221+
String newID;
222+
for (int i = 0; i < EVENT_PACKAGES; i++) {
223+
for(String eventName : eventNames) {
224+
JsonNode eventJson = parsedJason.get(eventName);
225+
newID = eventJson.at("/meta/id").textValue().substring(0, 30).concat(String.format("%06d", i));;
226+
((ObjectNode) eventJson.path("meta")).put("id", newID);
227+
for (JsonNode link : eventJson.path("links")) {
228+
if (link.has("target")) {
229+
newID = link.path("target").textValue().substring(0, 30).concat(String.format("%06d", i));
230+
((ObjectNode) link).put("target", newID);
231+
}
232+
}
233+
events.add(eventJson.toString());
234+
}
235+
}
236+
return events;
237+
}
238+
239+
private List<String> getEventNamesToSend() {
240+
List<String> eventNames = new ArrayList<>();
241+
242+
eventNames.add("event_EiffelArtifactCreatedEvent");
243+
eventNames.add("event_EiffelArtifactPublishedEvent");
244+
eventNames.add("event_EiffelConfidenceLevelModifiedEvent");
245+
eventNames.add("event_EiffelTestCaseStartedEvent");
246+
eventNames.add("event_EiffelTestCaseFinishedEvent");
247+
248+
return eventNames;
249+
}
250+
251+
private void createExchange(final String exchangeName, final String queueName) {
252+
final CachingConnectionFactory ccf = new CachingConnectionFactory(cf);
253+
admin = new RabbitAdmin(ccf);
254+
queue = new Queue(queueName, false);
255+
admin.declareQueue(queue);
256+
final TopicExchange exchange = new TopicExchange(exchangeName);
257+
admin.declareExchange(exchange);
258+
admin.declareBinding(BindingBuilder.bind(queue).to(exchange).with("#"));
259+
ccf.destroy();
260+
}
261+
262+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"_id":"6acc3c87-75e0-4b6d-88f5-b1a5d4000001","aggregatedObject":"{\"fileInformation\":[{\"extension\":\"jar\",\"classifier\":\"\"}],\"buildCommand\":null,\"confidenceLevels\":[{\"eventId\":\"f37d59a3-069e-4f4c-8cc5-a52e73000001\",\"name\":\"readyForSystemIntegration\",\"time\":1481875944272,\"value\":\"SUCCESS\"}],\"testCaseExecutions\":[{\"testCaseFinishEventId\":\"11109351-41e0-474a-bc1c-f6e81e000001\",\"testCaseStartedTime\":1481875925916,\"testCaseStartedEventId\":\"cb9d64b0-a6e9-4419-8b5d-a650c2000001\",\"testCaseFinishedTime\":1481875935919,\"testCaseDuration\":10003,\"testCase\":{\"conclusion\":\"SUCCESSFUL\",\"verdict\":\"PASSED\",\"tracker\":\"My Other Test Management System\",\"id\":\"TC5\",\"uri\":\"https:\\/\\/other-tm.company.com\\/testCase\\/TC5\"}}],\"id\":\"6acc3c87-75e0-4b6d-88f5-b1a5d4000001\",\"time\":1481875891763,\"type\":\"EiffelArtifactCreatedEvent\",\"gav\":{\"groupId\":\"com.mycompany.myproduct\",\"artifactId\":\"sub-system\",\"version\":\"1.1.0\"},\"publications\":[{\"eventId\":\"33d05e6f-9bd9-4138-83b6-e20cc7000001\",\"locations\":[{\"type\":\"PLAIN\",\"uri\":\"https:\\/\\/myrepository.com\\/mySubSystemArtifact\"}],\"time\":1481875921763}]}"}

0 commit comments

Comments
 (0)