0874d98273971b1b3e878e3fd0fecc5ce177d027
[policy/apex-pdp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
4  * ================================================================================
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  * 
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  * 
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  * 
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.apex.apps.uservice.test.adapt.kafka;
22
23 import static org.junit.Assert.assertTrue;
24
25 import java.io.IOException;
26 import java.nio.file.Files;
27 import java.util.Properties;
28
29 import org.I0Itec.zkclient.ZkClient;
30 import org.apache.kafka.common.utils.MockTime;
31 import org.apache.kafka.common.utils.Time;
32 import org.junit.AfterClass;
33 import org.junit.BeforeClass;
34 import org.junit.Test;
35 import org.onap.policy.apex.core.infrastructure.messaging.MessagingException;
36 import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
37 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
38 import org.onap.policy.apex.service.engine.main.ApexMain;
39
40 import kafka.admin.AdminUtils;
41 import kafka.admin.RackAwareMode;
42 import kafka.server.KafkaConfig;
43 import kafka.server.KafkaServer;
44 import kafka.utils.TestUtils;
45 import kafka.utils.ZKStringSerializer$;
46 import kafka.utils.ZkUtils;
47 import kafka.zk.EmbeddedZookeeper;
48
49
50 public class TestKafka2Kafka {
51     // The method of starting an embedded Kafka server used in this example is based on the method
52     // on slashdot at
53     // https://github.com/asmaier/mini-kafka
54
55     private static final long MAX_TEST_LENGTH = 10000;
56
57     private static final int EVENT_COUNT = 100;
58     private static final int EVENT_INTERVAL = 20;
59
60     private static final String ZKHOST = "127.0.0.1";
61     private static final String BROKERHOST = "127.0.0.1";
62     private static final String BROKERPORT = "39902";
63
64     private static EmbeddedZookeeper zkServer;
65     private static ZkClient zkClient;
66     private static KafkaServer kafkaServer;
67
68     @BeforeClass
69     public static void setupDummyKafkaServer() throws IOException {
70         // setup Zookeeper
71         zkServer = new EmbeddedZookeeper();
72         final String zkConnect = ZKHOST + ":" + zkServer.port();
73         zkClient = new ZkClient(zkConnect, 30000, 30000, ZKStringSerializer$.MODULE$);
74         final ZkUtils zkUtils = ZkUtils.apply(zkClient, false);
75
76         // setup Broker
77         final Properties brokerProps = new Properties();
78         brokerProps.setProperty("zookeeper.connect", zkConnect);
79         brokerProps.setProperty("broker.id", "0");
80         brokerProps.setProperty("log.dirs", Files.createTempDirectory("kafka-").toAbsolutePath().toString());
81         brokerProps.setProperty("listeners", "PLAINTEXT://" + BROKERHOST + ":" + BROKERPORT);
82         final KafkaConfig config = new KafkaConfig(brokerProps);
83         final Time mock = new MockTime();
84         kafkaServer = TestUtils.createServer(config, mock);
85
86         // create topics
87         AdminUtils.createTopic(zkUtils, "apex-in-0", 1, 1, new Properties(), RackAwareMode.Disabled$.MODULE$);
88         AdminUtils.createTopic(zkUtils, "apex-in-1", 1, 1, new Properties(), RackAwareMode.Disabled$.MODULE$);
89         AdminUtils.createTopic(zkUtils, "apex-out", 1, 1, new Properties(), RackAwareMode.Disabled$.MODULE$);
90     }
91
92     @AfterClass
93     public static void shutdownDummyKafkaServer() throws IOException {
94         kafkaServer.shutdown();
95         zkClient.close();
96         zkServer.shutdown();
97     }
98
99     @Test
100     public void testJsonKafkaEvents() throws MessagingException, ApexException {
101         final String[] args = {"src/test/resources/prodcons/Kafka2KafkaJsonEvent.json"};
102         testKafkaEvents(args, false, "json");
103     }
104
105     @Test
106     public void testXMLKafkaEvents() throws MessagingException, ApexException {
107         final String[] args = {"src/test/resources/prodcons/Kafka2KafkaXmlEvent.json"};
108         testKafkaEvents(args, true, "xml");
109     }
110
111     private void testKafkaEvents(final String[] args, final Boolean xmlEvents, final String topicSuffix)
112             throws MessagingException, ApexException {
113         final KafkaEventSubscriber subscriber =
114                 new KafkaEventSubscriber("apex-out-" + topicSuffix, "localhost:" + BROKERPORT);
115         final KafkaEventProducer producer = new KafkaEventProducer("apex-in-" + topicSuffix, "localhost:" + BROKERPORT,
116                 EVENT_COUNT, xmlEvents, EVENT_INTERVAL);
117
118         final ApexMain apexMain = new ApexMain(args);
119         ThreadUtilities.sleep(3000);
120
121         producer.sendEvents();
122
123         final long testStartTime = System.currentTimeMillis();
124
125         while (System.currentTimeMillis() < testStartTime + MAX_TEST_LENGTH
126                 && subscriber.getEventsReceivedCount() < EVENT_COUNT) {
127             ThreadUtilities.sleep(EVENT_INTERVAL);
128         }
129
130         ThreadUtilities.sleep(1000);
131
132         System.out.println("sent event count: " + producer.getEventsSentCount());
133         System.out.println("received event count: " + subscriber.getEventsReceivedCount());
134         assertTrue(subscriber.getEventsReceivedCount() == producer.getEventsSentCount());
135
136         apexMain.shutdown();
137         subscriber.shutdown();
138         producer.shutdown();
139         ThreadUtilities.sleep(1000);
140     }
141 }