/* * Copyright MapR Technologies, $year * * 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.mapr.franz.server; import com.google.common.base.Splitter; import com.google.common.collect.Lists; import com.google.protobuf.ByteString; import com.mapr.ProtoSpout; import com.mapr.franz.catcher.wire.MessageQueue; import org.junit.Test; import java.io.DataInputStream; import java.io.EOFException; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Arrays; import java.util.List; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; public class ProtoLoggerTest { @Test public void testWrite() throws IOException { Path homeDir = Files.createTempDirectory("logger"); ProtoLogger p = new ProtoLogger(homeDir.toString()); p.setMaxLogFile(200); long t0 = System.currentTimeMillis(); for (int i = 0; i < 4000; i++) { p.write("topic-" + (i % 10), ByteString.copyFromUtf8(1e9 + i + "")); } long t1 = System.currentTimeMillis(); assertEquals(10, homeDir.toFile().list().length); int shortFileCount = 0; File[] topicFiles = homeDir.toFile().listFiles(); assertNotNull(topicFiles); for (File topic : topicFiles) { assertTrue(topic.getName().matches("topic-[0-9]+")); File[] files = topic.listFiles(); assertNotNull(files); Arrays.sort(files); long offset = 0; for (File s : files) { assertTrue(s.getName().matches("[0-9a-f]+")); if (s.length() < 200) { shortFileCount++; } assertTrue(s.length() < 250); assertEquals(String.format("%016x", offset), s.getName()); offset += s.length(); DataInputStream in = new DataInputStream(new FileInputStream(s)); MessageQueue.Message x = getMessage(in); while (x != null) { assertTrue(String.format("Time %d should be in [%d,%d]", x.getTime(), t0, t1), x.getTime() >= t0 && x.getTime() <= t1); assertTrue(x.hasPayload()); double z = Double.parseDouble(new String(x.getPayload().toByteArray())); assertTrue(z >= 1e9 && z < 1e9 + 4000); x = getMessage(in); } } } // only one of the directories have a short file assertEquals(1, shortFileCount); } private MessageQueue.Message getMessage(DataInputStream in) throws IOException { try { int n = in.readInt(); byte[] buf = new byte[n]; in.readFully(buf); return MessageQueue.Message.parseFrom(buf); } catch (EOFException e) { return null; } } }