blob: 4c8b478afb2a85cf8d9b421424d8ec9f4e391bb6 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.avro;
import org.apache.avro.reflect.ReflectData;
import org.apache.avro.ipc.Server;
import org.apache.avro.ipc.Transceiver;
import org.apache.avro.ipc.SocketServer;
import org.apache.avro.ipc.SocketTransceiver;
import org.apache.avro.ipc.reflect.ReflectRequestor;
import org.apache.avro.ipc.reflect.ReflectResponder;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.net.InetSocketAddress;
import java.util.Random;
import java.io.IOException;
public class TestProtocolReflect {
public static class TestRecord {
private String name;
public int hashCode() { return this.name.hashCode(); }
public boolean equals(Object that) {
return this.name.equals(((TestRecord)that).name);
}
}
public interface Simple {
String hello(String greeting);
TestRecord echo(TestRecord record);
int add(int arg1, int arg2);
byte[] echoBytes(byte[] data);
void error() throws SimpleException;
}
private static boolean throwUndeclaredError;
public static class TestImpl implements Simple {
public String hello(String greeting) { return "goodbye"; }
public int add(int arg1, int arg2) { return arg1 + arg2; }
public TestRecord echo(TestRecord record) { return record; }
public byte[] echoBytes(byte[] data) { return data; }
public void error() throws SimpleException {
if (throwUndeclaredError) throw new RuntimeException("foo");
throw new SimpleException("foo");
}
}
protected static Server server;
protected static Transceiver client;
protected static Simple proxy;
@Before
public void testStartServer() throws Exception {
if (server != null) return;
server = new SocketServer(new ReflectResponder(Simple.class, new TestImpl()),
new InetSocketAddress(0));
server.start();
client = new SocketTransceiver(new InetSocketAddress(server.getPort()));
proxy = ReflectRequestor.getClient(Simple.class, client);
}
@Test public void testClassLoader() throws Exception {
ClassLoader loader = new ClassLoader() {};
ReflectResponder responder
= new ReflectResponder(Simple.class, new TestImpl(),
new ReflectData(loader));
assertEquals(responder.getReflectData().getClassLoader(), loader);
ReflectRequestor requestor
= new ReflectRequestor(Simple.class, client, new ReflectData(loader));
assertEquals(requestor.getReflectData().getClassLoader(), loader);
}
@Test
public void testHello() throws IOException {
String response = proxy.hello("bob");
assertEquals("goodbye", response);
}
@Test
public void testEcho() throws IOException {
TestRecord record = new TestRecord();
record.name = "foo";
TestRecord echoed = proxy.echo(record);
assertEquals(record, echoed);
}
@Test
public void testAdd() throws IOException {
int result = proxy.add(1, 2);
assertEquals(3, result);
}
@Test
public void testEchoBytes() throws IOException {
Random random = new Random();
int length = random.nextInt(1024*16);
byte[] data = new byte[length];
random.nextBytes(data);
byte[] echoed = proxy.echoBytes(data);
assertArrayEquals(data, echoed);
}
@Test
public void testError() throws IOException {
SimpleException error = null;
try {
proxy.error();
} catch (SimpleException e) {
error = e;
}
assertNotNull(error);
assertEquals("foo", error.getMessage());
}
@Test
public void testUndeclaredError() throws Exception {
this.throwUndeclaredError = true;
RuntimeException error = null;
try {
proxy.error();
} catch (RuntimeException e) {
error = e;
} finally {
this.throwUndeclaredError = false;
}
assertNotNull(error);
assertTrue(error.toString().contains("foo"));
}
@AfterClass
public static void testStopServer() throws IOException {
client.close();
server.close();
}
}