package com.google.pubsub.jms.light.integration; import static java.util.concurrent.TimeUnit.SECONDS; import static org.awaitility.Awaitility.await; import static org.hamcrest.Matchers.greaterThanOrEqualTo; import static org.hamcrest.Matchers.hasSize; import com.google.api.gax.grpc.FixedChannelProvider; import com.google.api.gax.grpc.InstantiatingExecutorProvider; import com.google.api.gax.grpc.ProviderManager; import com.google.cloud.pubsub.deprecated.Message; import com.google.cloud.pubsub.deprecated.PubSub; import com.google.common.collect.Lists; import com.google.pubsub.jms.light.PubSubConnectionFactory; import com.google.pubsub.jms.light.destination.PubSubTopicDestination; import io.grpc.ManagedChannelBuilder; import java.io.IOException; import java.util.Collections; import java.util.List; import java.util.concurrent.Callable; import java.util.logging.Logger; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.JMSException; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; import javax.jms.Topic; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class PublisherIntegrationTest extends BaseIntegrationTest { private static final Logger LOGGER = Logger.getLogger(PublisherIntegrationTest.class.getName()); private List<String> toSend = Lists.newArrayList( "\"Mystery creates wonder and wonder is the basis of man's desire to understand.\" " + "-- Neil Armstrong", "\"A-OK full go.\" -- Alan B. Shepard", "\"Houston, Tranquillity Base here. The Eagle has landed.\" -- Neil Armstrong" ); private ConnectionFactory connectionFactory = new PubSubConnectionFactory(); private Topic topic = new PubSubTopicDestination( String.format("projects/%s/topics/%s", PROJECT_ID, TOPIC_NAME)); @Before public void setUp() throws IOException { final PubSubConnectionFactory factory = (PubSubConnectionFactory) connectionFactory; factory.setProviderManager(createProviderManager()); } /** * Simple producer test. Creates JMS connection/session/producer/message and send it to PubSub. */ @Test public void sunnyDayPublish() throws JMSException, IOException { try (final Connection connection = connectionFactory.createConnection()) { final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); final MessageProducer producer = session.createProducer(topic); for (final String text : toSend) { final TextMessage wowMessage = session.createTextMessage(text); producer.send(wowMessage); } } // verify // Configs PubSub's subscriber and message processor. Not the JMS one. final WowMessageProcessor messageProcessor = new WowMessageProcessor(); getServiceSubscription().pullAsync(messageProcessor); // wait till all messages received. await().atMost(1, SECONDS).until( new Callable<List<Message>>() { @Override public List<Message> call() throws Exception { return messageProcessor.getReceivedMessages(); } }, hasSize(greaterThanOrEqualTo(toSend.size()))); } private ProviderManager createProviderManager() { return ProviderManager.newBuilder() .setChannelProvider( FixedChannelProvider.create( ManagedChannelBuilder.forAddress( getServiceHost(), getServicePort()).usePlaintext(true).build())) .setExecutorProvider( InstantiatingExecutorProvider.newBuilder().setExecutorThreadCount(1).build()) .build(); } static class WowMessageProcessor implements PubSub.MessageProcessor { final List<Message> received = Lists.newArrayList(); @Override public void process(final Message message) throws Exception { received.add(message); LOGGER.info( String.format("Received: [id: %s, payload: %s]", message.getId(), message.getPayloadAsString())); } List<Message> getReceivedMessages() { return Collections.unmodifiableList(received); } } }