package com.netflix.suro.message; import com.netflix.suro.sink.kafka.SuroKeyedMessage; import org.junit.Test; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import static org.junit.Assert.assertEquals; public class TestMessageSerDe { @Test public void testMessage() { MessageSerDe serde = new MessageSerDe(); for (int k = 0; k < 10; ++k) { Message msg = new Message("routingKey", "payload".getBytes()); byte[] bytes = serde.serialize(msg); assertEquals(msg, serde.deserialize(bytes)); } } @Test public void testSuroKeyedMessage() { MessageSerDe serde = new MessageSerDe(); for (int k = 0; k < 10; ++k) { Message msg = new SuroKeyedMessage( k, new Message("routingKey", "payload".getBytes())); byte[] bytes = serde.serialize(msg); SuroKeyedMessage suroKeyedMessage = (SuroKeyedMessage) serde.deserialize(bytes); assertEquals(msg, suroKeyedMessage); assertEquals(suroKeyedMessage.getKey(), k); } } @Test public void testMultiThreaded() throws InterruptedException { final MessageSerDe serde = new MessageSerDe(); int threadCount = 10; ExecutorService executors = Executors.newFixedThreadPool(threadCount); final CountDownLatch latch = new CountDownLatch(threadCount); final CountDownLatch startLatch = new CountDownLatch(1); for (int i = 0; i < threadCount; ++i) { executors.execute(new Runnable() { @Override public void run() { try { startLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } for (int j = 0; j < 10000; ++j) { String str = generateRandomString(); Message msg = new Message("testRoutingKey", str.getBytes()); byte[] bytes = serde.serialize(msg); Message bmsg = serde.deserialize(bytes); assertEquals(bmsg.getRoutingKey(), "testRoutingKey"); assertEquals(new String(bmsg.getPayload()), str); } latch.countDown(); } }); } startLatch.countDown(); latch.await(); } public String generateRandomString() { Random rand = new Random(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 4096; ++i) { sb.append((char) (rand.nextInt(95) + 32)); } return sb.toString(); } }