/* * * * Copyright 2013 Produban * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * * You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, software * * distributed under the License is distributed on an "AS IS" BASIS, * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * * See the License for the specific language governing permissions and * * limitations under the License. * */ package com.produban.openbus.broker; import com.produban.openbus.serialization.AvroDeserializer; import com.produban.openbus.util.KafkaLocal; import kafka.message.MessageAndMetadata; import org.apache.avro.generic.GenericRecord; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.util.List; import java.util.Properties; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; /** * Class Description */ public class KafkaAvroMessagesTest { private static KafkaLocal kafka; private AvroProducer userProducer; private AvroProducer logProducer; private String[] userFields; private String[] logFields; private String userTopic = "test_users"; private String logTopic = "test_logs"; private BasicConsumer userConsumer; private BasicConsumer logConsumer; private AvroDeserializer deserializer; @Before public void setUp() { //Start local kafka instance Properties kafkaProperties = new Properties(); try { //start kafka kafkaProperties.load(Class.class.getResourceAsStream("/kafkalocal.properties")); kafka = new KafkaLocal(kafkaProperties); Thread.sleep(5000); } catch (Exception e){ e.printStackTrace(System.out); fail("Error running local Kafka broker"); e.printStackTrace(System.out); } //producers this.userFields = new String[] {"name", "favorite_number", "favorite_color"}; this.userProducer = new AvroProducer("localhost:9092", userTopic, "/user.avsc", this.userFields); this.logFields = new String[] {"host", "log", "user", "datetime", "request", "status", "size", "referer", "userAgent", "session", "responseTime"}; this.logProducer = new AvroProducer("localhost:9092", logTopic, "/apacheLog.avsc", this.logFields ); //consumers this.userConsumer = new BasicConsumer(userTopic, "localhost:2181", "groupTestUsers"); this.logConsumer = new BasicConsumer(logTopic, "localhost:2181", "groupTestLogs"); //common this.deserializer = new AvroDeserializer(); } @Test public void testUsers() throws IOException { //Data we will send Object[][] sentData = { new Object[] {"fernando", 77, "rojo"}, new Object[] {"María", 150, "verde"}, new Object[] {"Ramón Ramirez", 123, "azul"}}; //produce user messages for (Object[] dataItem : sentData) { userProducer.send(dataItem); } //consume user messages for (Object[] sentItem : sentData) { MessageAndMetadata<byte[], byte[]> data = userConsumer.consumeOne(); byte[] avroMessage = data.message(); List<GenericRecord> records = deserializer.deserialize(avroMessage); GenericRecord record = records.get(0); //always the first record assertEquals(record.get("name").toString(), sentItem[0]); assertEquals(record.get("favorite_number"), sentItem[1]); assertEquals(record.get("favorite_color").toString(), sentItem[2]); } } //@Test public void testLogs() throws IOException { //Data we will send String HOSTREMOTO="85.155.188.198"; String NOMBRELOGREMOTO="-"; String USUARIOREMOTO="user"; String TIEMPOEJECPETICION="[17/Sep/2012:19:01:24+0200]"; String LINEAPETICION="index"; String ESTADOPETICION="200"; String TAMANORESPUESTA="3117"; String REFERER="-"; String USERAGENT="Chrome/21.0.1180.89"; String IDSESION="0000z2ur1hruUUG-MhpsITK9JY_:16vnisqka"; String TIEMPORESPUESTA=""; Object[][] sentData = { new Object[] {HOSTREMOTO, NOMBRELOGREMOTO, USUARIOREMOTO, TIEMPOEJECPETICION, LINEAPETICION, ESTADOPETICION, TAMANORESPUESTA, REFERER, USERAGENT, IDSESION, TIEMPORESPUESTA} }; //produce log messages for (Object[] dataItem : sentData) { logProducer.send(dataItem); } //consume log messages for (Object[] sentItem : sentData) { MessageAndMetadata<byte[], byte[]> data = logConsumer.consumeOne(); byte[] avroMessage = data.message(); List<GenericRecord> records = deserializer.deserialize(avroMessage); GenericRecord record = records.get(0); //always the first record assertEquals(record.get("host").toString(), sentItem[0]); assertEquals(record.get("log").toString(), sentItem[1]); assertEquals(record.get("user").toString(), sentItem[2]); assertEquals(record.get("datetime").toString(), sentItem[3]); assertEquals(record.get("request").toString(), sentItem[4]); assertEquals(record.get("status").toString(), sentItem[5]); assertEquals(record.get("size").toString(), sentItem[6]); assertEquals(record.get("referer").toString(), sentItem[7]); assertEquals(record.get("userAgent").toString(), sentItem[8]); assertEquals(record.get("session").toString(), sentItem[9]); assertEquals(record.get("responseTime").toString(), sentItem[10]); } } @After public void tearDown() { try { kafka.stop(); } catch (IOException e) { System.out.println("Error stopping local kafka server"); e.printStackTrace(System.out); } } }