package me.dinowernli.grpc.polyglot.io;
import java.io.BufferedReader;
import java.io.StringReader;
import java.nio.file.Path;
import java.nio.file.Paths;
import com.google.common.collect.ImmutableList;
import com.google.protobuf.Descriptors.Descriptor;
import com.google.protobuf.DynamicMessage;
import com.google.protobuf.util.JsonFormat;
import me.dinowernli.grpc.polyglot.io.testing.TestData;
import me.dinowernli.grpc.polyglot.testing.TestUtils;
import org.junit.Test;
import polyglot.test.TestProto.TestRequest;
import static com.google.common.truth.Truth.assertThat;
/** Unit tests for {@link MessageReader}. */
public class MessageReaderTest {
private static final String SOURCE = "TEST_SOURCE";
private static final Descriptor DESCRIPTOR = TestRequest.getDescriptor();
private static String TESTDATA_ROOT = Paths.get(TestUtils.getWorkspaceRoot().toString(),
"src", "test", "java", "me", "dinowernli", "grpc", "polyglot", "io", "testdata").toString();
private MessageReader reader;
@Test
public void readsSingle() {
reader = MessageReader.forFile(dataFilePath("request.pb.ascii"), DESCRIPTOR);
ImmutableList<DynamicMessage> result = reader.read();
assertThat(result).containsExactly(TestData.REQUEST);
}
@Test
public void readsMultiple() {
reader = MessageReader.forFile(dataFilePath("requests_multi.pb.ascii"), DESCRIPTOR);
ImmutableList<DynamicMessage> result = reader.read();
assertThat(result).containsExactlyElementsIn(TestData.REQUESTS_MULTI);
}
@Test
public void readsMultipleWithInterruption() {
reader = MessageReader.forFile(dataFilePath("requests_multi_interrupted.pb.ascii"), DESCRIPTOR);
ImmutableList<DynamicMessage> result = reader.read();
assertThat(result).containsExactlyElementsIn(TestData.REQUESTS_MULTI);
}
@Test
public void handlesEmptyStream() {
reader = MessageReader.forFile(dataFilePath("request_empty.pb.ascii"), DESCRIPTOR);
ImmutableList<DynamicMessage> result = reader.read();
assertThat(result).isEmpty();
}
@Test
public void handlesPrimitives() {
reader = MessageReader.forFile(dataFilePath("request_with_primitives.pb.ascii"), DESCRIPTOR);
ImmutableList<DynamicMessage> result = reader.read();
assertThat(result).containsExactly(TestData.REQUEST_WITH_PRIMITIVE);
}
@Test
public void handlesEmptyString() {
reader = createWithInput("");
ImmutableList<DynamicMessage> result = reader.read();
assertThat(result).isEmpty();
}
@Test
public void handlesSingleNewline() {
reader = createWithInput("\n");
ImmutableList<DynamicMessage> result = reader.read();
assertThat(result).isEmpty();
}
@Test
public void handlesTwoNewlines() {
reader = createWithInput("\n\n");
ImmutableList<DynamicMessage> result = reader.read();
assertThat(result).isEmpty();
}
@Test(expected = IllegalArgumentException.class)
public void rejectsMalformed() {
reader = createWithInput("ha! try parsing this as a stream");
ImmutableList<DynamicMessage> result = reader.read();
assertThat(result).isEmpty();
}
@Test(expected = IllegalArgumentException.class)
public void rejectsBadProto() {
reader = createWithInput("{ 'message': 'as \n\n");
ImmutableList<DynamicMessage> result = reader.read();
assertThat(result).isEmpty();
}
private static Path dataFilePath(String filename) {
return Paths.get(TESTDATA_ROOT, filename);
}
private static MessageReader createWithInput(String input) {
return new MessageReader(
JsonFormat.parser(),
TestRequest.getDescriptor(),
new BufferedReader(new StringReader(input)),
SOURCE);
}
}