// Copyright (c) 2017-Present Pivotal Software, Inc. All rights reserved. // // This software, the RabbitMQ Java client library, is triple-licensed under the // Mozilla Public License 1.1 ("MPL"), the GNU General Public License version 2 // ("GPL") and the Apache License version 2 ("ASL"). For the MPL, please see // LICENSE-MPL-RabbitMQ. For the GPL, please see LICENSE-GPL2. For the ASL, // please see LICENSE-APACHE2. // // This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, // either express or implied. See the LICENSE file for specific language governing // rights and limitations of this software. // // If you have any questions regarding licensing, please contact us at // info@rabbitmq.com. package com.rabbitmq.client.test; import com.rabbitmq.client.*; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.util.HashMap; import java.util.Map; import static org.junit.Assert.assertEquals; public class RpcTest { Connection clientConnection, serverConnection; Channel clientChannel, serverChannel; String queue = "rpc.queue"; RpcServer rpcServer; @Before public void init() throws Exception { clientConnection = TestUtils.connectionFactory().newConnection(); clientChannel = clientConnection.createChannel(); serverConnection = TestUtils.connectionFactory().newConnection(); serverChannel = serverConnection.createChannel(); serverChannel.queueDeclare(queue, false, false, false, null); } @After public void tearDown() throws Exception { if(rpcServer != null) { rpcServer.terminateMainloop(); } if(serverChannel != null) { serverChannel.queueDelete(queue); } TestUtils.close(clientConnection); TestUtils.close(serverConnection); } @Test public void rpc() throws Exception { rpcServer = new TestRpcServer(serverChannel, queue); new Thread(() -> { try { rpcServer.mainloop(); } catch (Exception e) { // safe to ignore when loops ends/server is canceled } }).start(); RpcClient client = new RpcClient(clientChannel, "", queue, 1000); RpcClient.Response response = client.doCall(null, "hello".getBytes()); assertEquals("*** hello ***", new String(response.getBody())); assertEquals("pre-hello", response.getProperties().getHeaders().get("pre").toString()); assertEquals("post-hello", response.getProperties().getHeaders().get("post").toString()); client.close(); } private static class TestRpcServer extends RpcServer { public TestRpcServer(Channel channel, String queueName) throws IOException { super(channel, queueName); } @Override protected AMQP.BasicProperties preprocessReplyProperties(Delivery request, AMQP.BasicProperties.Builder builder) { Map<String, Object> headers = new HashMap<String, Object>(); headers.put("pre", "pre-" + new String(request.getBody())); builder.headers(headers); return builder.build(); } @Override public byte[] handleCall(Delivery request, AMQP.BasicProperties replyProperties) { String input = new String(request.getBody()); return ("*** " + input + " ***").getBytes(); } @Override protected AMQP.BasicProperties postprocessReplyProperties(Delivery request, AMQP.BasicProperties.Builder builder) { Map<String, Object> headers = new HashMap<String, Object>(builder.build().getHeaders()); headers.put("post", "post-" + new String(request.getBody())); builder.headers(headers); return builder.build(); } } }