package org.infinispan.client.hotrod.event; import static org.infinispan.server.hotrod.test.HotRodTestingUtil.hotRodCacheConfiguration; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertNull; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import org.infinispan.client.hotrod.RemoteCache; import org.infinispan.client.hotrod.annotation.ClientCacheEntryCreated; import org.infinispan.client.hotrod.annotation.ClientListener; import org.infinispan.client.hotrod.marshall.ProtoStreamMarshaller; import org.infinispan.client.hotrod.query.testdomain.protobuf.UserPB; import org.infinispan.client.hotrod.query.testdomain.protobuf.marshallers.MarshallerRegistration; import org.infinispan.client.hotrod.test.MultiHotRodServersTest; import org.infinispan.commons.util.Util; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.cache.Index; import org.infinispan.query.dsl.embedded.testdomain.User; import org.infinispan.query.remote.client.ProtobufMetadataManagerConstants; import org.testng.annotations.Test; /** * @author anistor@redhat.com * @since 7.2 */ @Test(groups = "functional", testName = "client.hotrod.event.ClientListenerWithIndexingAndProtobufTest") public class ClientListenerWithIndexingAndProtobufTest extends MultiHotRodServersTest { private final int NUM_NODES = 2; private RemoteCache<Object, Object> remoteCache; @Override protected void createCacheManagers() throws Throwable { ConfigurationBuilder cfgBuilder = hotRodCacheConfiguration(getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, false)); cfgBuilder.indexing().index(Index.ALL) .addProperty("default.directory_provider", "ram") .addProperty("lucene_version", "LUCENE_CURRENT"); createHotRodServers(NUM_NODES, cfgBuilder); waitForClusterToForm(); remoteCache = client(0).getCache(); //initialize server-side serialization context RemoteCache<String, String> metadataCache = client(0).getCache(ProtobufMetadataManagerConstants.PROTOBUF_METADATA_CACHE_NAME); metadataCache.put("sample_bank_account/bank.proto", Util.read(Util.getResourceAsStream("/sample_bank_account/bank.proto", getClass().getClassLoader()))); assertFalse(metadataCache.containsKey(ProtobufMetadataManagerConstants.ERRORS_KEY_SUFFIX)); //initialize client-side serialization context MarshallerRegistration.registerMarshallers(ProtoStreamMarshaller.getSerializationContext(client(0))); } @Override protected org.infinispan.client.hotrod.configuration.ConfigurationBuilder createHotRodClientConfigurationBuilder(int serverPort) { return super.createHotRodClientConfigurationBuilder(serverPort) .marshaller(new ProtoStreamMarshaller()); } public void testEventFilter() throws Exception { User user1 = new UserPB(); user1.setId(1); user1.setName("John"); user1.setSurname("Doe"); user1.setGender(User.Gender.MALE); user1.setAge(22); NoopEventListener listener = new NoopEventListener(); remoteCache.addClientListener(listener); expectElementsInQueue(listener.createEvents, 0); remoteCache.put("user_" + user1.getId(), user1); assertEquals(1, remoteCache.size()); expectElementsInQueue(listener.createEvents, 1); remoteCache.removeClientListener(listener); } private void expectElementsInQueue(BlockingQueue<?> queue, int numElements) { for (int i = 0; i < numElements; i++) { try { Object e = queue.poll(5, TimeUnit.SECONDS); assertNotNull("Queue was empty!", e); } catch (InterruptedException e) { throw new AssertionError("Interrupted while waiting for condition", e); } } try { // no more elements expected here Object e = queue.poll(5, TimeUnit.SECONDS); assertNull("No more elements expected in queue!", e); } catch (InterruptedException e) { throw new AssertionError("Interrupted while waiting for condition", e); } } @ClientListener private static class NoopEventListener { public final BlockingQueue<ClientCacheEntryCreatedEvent> createEvents = new LinkedBlockingQueue<>(); @ClientCacheEntryCreated public void handleCreatedEvent(ClientCacheEntryCreatedEvent<?> e) { createEvents.add(e); } } }