package com.ofpay.dubbo.rpc.protocol.jsonrpc;

import com.alibaba.dubbo.common.URL;
import com.alibaba.dubbo.common.extension.ExtensionLoader;
import com.alibaba.dubbo.rpc.Exporter;
import com.alibaba.dubbo.rpc.Invoker;
import com.alibaba.dubbo.rpc.Protocol;
import com.alibaba.dubbo.rpc.ProxyFactory;
import com.ofpay.dubbo.rpc.protocol.jsonrpc.JsonRpcServiceImpl.MyException;
import org.junit.Assert;
import org.junit.Test;

/**
 * JsonRpcProtocolTest
 * Created by wuwen on 15/4/1.
 */
public class JsonRpcProtocolTest {

    @Test
    public void testJsonrpcProtocol() {
        JsonRpcServiceImpl server = new JsonRpcServiceImpl();
        Assert.assertFalse(server.isCalled());
        ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
        Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
        URL url = URL.valueOf("jsonrpc://127.0.0.1:5342/" + JsonRpcService.class.getName() + "?version=1.0.0");
        Exporter<JsonRpcService> exporter = protocol.export(proxyFactory.getInvoker(server, JsonRpcService.class, url));
        Invoker<JsonRpcService> invoker = protocol.refer(JsonRpcService.class, url);
        JsonRpcService client = proxyFactory.getProxy(invoker);
        String result = client.sayHello("haha");
        Assert.assertTrue(server.isCalled());
        Assert.assertEquals("Hello, haha", result);
        invoker.destroy();
        exporter.unexport();
    }

    /**
     *TODO 暂不支持自定义异常
    @Test
    public void testCustomException() {
        JsonRpcServiceImpl server = new JsonRpcServiceImpl();
        ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
        Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
        URL url = URL.valueOf("jsonrpc://127.0.0.1:5342/" + JsonRpcService.class.getName() + "?version=1.0.0");
        Exporter<JsonRpcService> exporter = protocol.export(proxyFactory.getInvoker(server, JsonRpcService.class, url));
        Invoker<JsonRpcService> invoker = protocol.refer(JsonRpcService.class, url);
        JsonRpcService client = proxyFactory.getProxy(invoker);
        try {
            client.customException();
            Assert.fail();
        } catch (MyException expected) {
        }
        invoker.destroy();
        exporter.unexport();
    }***/

}