// Path: src/main/java/org/msgpack/rpc/builder/StopWatchDispatcherBuilder.java
// public class StopWatchDispatcherBuilder implements DispatcherBuilder {
// 
//     protected DispatcherBuilder baseBuilder;
//     protected boolean verbose = false;
// 
//     public boolean isVerbose() {
//         return verbose;
//     }
// 
//     public void setVerbose(boolean verbose) {
//         this.verbose = verbose;
//     }
// 
//     public StopWatchDispatcherBuilder withVerboseOutput(boolean verbose){
//         this.verbose = verbose;
//         return this;
//     }
// 
//     public StopWatchDispatcherBuilder(DispatcherBuilder baseBuilder){
//         this.baseBuilder = baseBuilder;
//     }
// 
//     public Dispatcher decorate(Dispatcher innerDispatcher) {
//         StopWatchDispatcher disp = new StopWatchDispatcher(innerDispatcher);
//         disp.setVerbose(verbose);
//         return disp;
//     }
// 
//     public Dispatcher build(Object handler, MessagePack messagePack) {
//         return decorate(baseBuilder.build(handler,messagePack));
//     }
// }
// 
// Path: src/main/java/org/msgpack/rpc/error/RemoteError.java
// public class RemoteError extends RPCError implements MessagePackable {
//     private static final long serialVersionUID = 1L;
// 
//     private Value data;
// 
//     public RemoteError() {
//         super();
//         this.data = ValueFactory.createArrayValue(
//                 new Value[] { ValueFactory.createRawValue("unknown error") });
//     }
// 
//     public RemoteError(String message) {
//         super(message);
//         this.data = ValueFactory.createArrayValue(
//                 new Value[] { ValueFactory.createRawValue(message) });
//     }
// 
//     public RemoteError(Value data) {
//         super(loadMessage(data));
//         this.data = data;
//     }
// 
//     public Value getData() {
//         return data;
//     }
// 
//     public void messagePack(Packer pk) throws IOException {
//         pk.write(data);
//     }
// 
//     private static String loadMessage(Value data) {
//         try {
//             if (data.isRawValue()) {
//                 return data.asRawValue().getString();
//             } else {
//                 return data.asArrayValue().getElementArray()[0].asRawValue().getString();
//             }
//         } catch (MessageTypeException e) {
//             return "unknown error: " + data;
//         }
//     }
// 
//     public void writeTo(Packer pk) throws IOException {
//         pk.write(data);
//     }
// 
//     public void readFrom(Unpacker u) throws IOException {
//         data = u.readValue();
//     }
// 
//     public static final String CODE = "RemoteError";
// 
//     @Override
//     public String getCode() {
//         return CODE;
//     }
// }
// 
// Path: src/main/java/org/msgpack/rpc/error/TimeoutError.java
// public class TimeoutError extends RPCError {
//     private static final long serialVersionUID = 1L;
// 
//     public TimeoutError(String message) {
//         super(message);
//     }
// 
//     public static final String CODE = "TimeoutError";
// 
//     @Override
//     public String getCode() {
//         return CODE;
//     }
// }


import junit.framework.TestCase;
import org.apache.log4j.BasicConfigurator;
import org.junit.Test;
import org.msgpack.MessageTypeException;
import org.msgpack.rpc.builder.StopWatchDispatcherBuilder;
import org.msgpack.rpc.error.NoMethodError;
import org.msgpack.rpc.error.RemoteError;
import org.msgpack.rpc.error.TimeoutError;
import org.msgpack.rpc.loop.EventLoop;
import org.msgpack.type.Value;
import java.util.Date;
    void call( CallFunc func)  throws Exception{

        BasicConfigurator.configure();
        EventLoop loop = EventLoop.start();
        Server svr = new Server(loop);
        Client c = new Client("127.0.0.1", 19850, loop);
        c.setRequestTimeout(1);

        try {
            svr.serve(new TestServer());
            svr.listen(19850);

            func.apply(c);

        } finally {
            svr.close();
            c.close();
            loop.shutdown();
        }
    }


    @Test
    public void testNormalException()  throws Exception {
        call( new CallFunc(){
            public void apply(Client client) {
                String message = "Normal exception";
                try{
                    client.callApply("throwException",new Object[]{message});
                    fail("Must throw exception");
// Path: src/main/java/org/msgpack/rpc/builder/StopWatchDispatcherBuilder.java
// public class StopWatchDispatcherBuilder implements DispatcherBuilder {
// 
//     protected DispatcherBuilder baseBuilder;
//     protected boolean verbose = false;
// 
//     public boolean isVerbose() {
//         return verbose;
//     }
// 
//     public void setVerbose(boolean verbose) {
//         this.verbose = verbose;
//     }
// 
//     public StopWatchDispatcherBuilder withVerboseOutput(boolean verbose){
//         this.verbose = verbose;
//         return this;
//     }
// 
//     public StopWatchDispatcherBuilder(DispatcherBuilder baseBuilder){
//         this.baseBuilder = baseBuilder;
//     }
// 
//     public Dispatcher decorate(Dispatcher innerDispatcher) {
//         StopWatchDispatcher disp = new StopWatchDispatcher(innerDispatcher);
//         disp.setVerbose(verbose);
//         return disp;
//     }
// 
//     public Dispatcher build(Object handler, MessagePack messagePack) {
//         return decorate(baseBuilder.build(handler,messagePack));
//     }
// }
// 
// Path: src/main/java/org/msgpack/rpc/error/RemoteError.java
// public class RemoteError extends RPCError implements MessagePackable {
//     private static final long serialVersionUID = 1L;
// 
//     private Value data;
// 
//     public RemoteError() {
//         super();
//         this.data = ValueFactory.createArrayValue(
//                 new Value[] { ValueFactory.createRawValue("unknown error") });
//     }
// 
//     public RemoteError(String message) {
//         super(message);
//         this.data = ValueFactory.createArrayValue(
//                 new Value[] { ValueFactory.createRawValue(message) });
//     }
// 
//     public RemoteError(Value data) {
//         super(loadMessage(data));
//         this.data = data;
//     }
// 
//     public Value getData() {
//         return data;
//     }
// 
//     public void messagePack(Packer pk) throws IOException {
//         pk.write(data);
//     }
// 
//     private static String loadMessage(Value data) {
//         try {
//             if (data.isRawValue()) {
//                 return data.asRawValue().getString();
//             } else {
//                 return data.asArrayValue().getElementArray()[0].asRawValue().getString();
//             }
//         } catch (MessageTypeException e) {
//             return "unknown error: " + data;
//         }
//     }
// 
//     public void writeTo(Packer pk) throws IOException {
//         pk.write(data);
//     }
// 
//     public void readFrom(Unpacker u) throws IOException {
//         data = u.readValue();
//     }
// 
//     public static final String CODE = "RemoteError";
// 
//     @Override
//     public String getCode() {
//         return CODE;
//     }
// }
// 
// Path: src/main/java/org/msgpack/rpc/error/TimeoutError.java
// public class TimeoutError extends RPCError {
//     private static final long serialVersionUID = 1L;
// 
//     public TimeoutError(String message) {
//         super(message);
//     }
// 
//     public static final String CODE = "TimeoutError";
// 
//     @Override
//     public String getCode() {
//         return CODE;
//     }
// }


// Path: src/test/java/org/msgpack/rpc/ServerErrorTest.java
import junit.framework.TestCase;
import org.apache.log4j.BasicConfigurator;
import org.junit.Test;
import org.msgpack.MessageTypeException;
import org.msgpack.rpc.builder.StopWatchDispatcherBuilder;
import org.msgpack.rpc.error.NoMethodError;
import org.msgpack.rpc.error.RemoteError;
import org.msgpack.rpc.error.TimeoutError;
import org.msgpack.rpc.loop.EventLoop;
import org.msgpack.type.Value;
import java.util.Date;

    void call( CallFunc func)  throws Exception{

        BasicConfigurator.configure();
        EventLoop loop = EventLoop.start();
        Server svr = new Server(loop);
        Client c = new Client("127.0.0.1", 19850, loop);
        c.setRequestTimeout(1);

        try {
            svr.serve(new TestServer());
            svr.listen(19850);

            func.apply(c);

        } finally {
            svr.close();
            c.close();
            loop.shutdown();
        }
    }


    @Test
    public void testNormalException()  throws Exception {
        call( new CallFunc(){
            public void apply(Client client) {
                String message = "Normal exception";
                try{
                    client.callApply("throwException",new Object[]{message});
                    fail("Must throw exception");
                }catch(RemoteError e){