package org.molgenis.data.listeners; import junit.framework.Assert; import org.mockito.Mockito; import org.molgenis.data.Entity; import org.molgenis.data.MolgenisDataException; import org.testng.annotations.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class EntityListenersServiceTest { private EntityListenersService entityListenersService = new EntityListenersService(); @Test(expectedExceptions = NullPointerException.class) public void registerNullPointer() { entityListenersService.register(null); } @Test public void registerTest() { String repoFullName = "EntityRepo"; entityListenersService.register(repoFullName); EntityListener entityListener1 = Mockito.when(Mockito.mock(EntityListener.class).getEntityId()) .thenReturn(Integer.valueOf(1)).getMock(); EntityListener entityListener2 = Mockito.when(Mockito.mock(EntityListener.class).getEntityId()) .thenReturn(Integer.valueOf(2)).getMock(); entityListenersService.addEntityListener(repoFullName, entityListener1); entityListenersService.addEntityListener(repoFullName, entityListener2); Assert.assertFalse(entityListenersService.isEmpty(repoFullName)); entityListenersService.register(repoFullName); Assert.assertFalse(entityListenersService.isEmpty(repoFullName)); entityListenersService.removeEntityListener(repoFullName, entityListener1); entityListenersService.removeEntityListener(repoFullName, entityListener2); Assert.assertTrue(entityListenersService.isEmpty(repoFullName)); } @Test public void updateEntitiesTest() { String repoFullName = "EntityRepo"; Entity entity1 = Mockito.mock(Entity.class); Entity entity2 = Mockito.mock(Entity.class); entityListenersService.register(repoFullName); EntityListener entityListener1 = Mockito.when(Mockito.mock(EntityListener.class).getEntityId()) .thenReturn(Integer.valueOf(1)).getMock(); EntityListener entityListener2 = Mockito.when(Mockito.mock(EntityListener.class).getEntityId()) .thenReturn(Integer.valueOf(2)).getMock(); Mockito.when(entity1.getIdValue()).thenReturn(Integer.valueOf(1)).getMock(); Mockito.when(entity2.getIdValue()).thenReturn(Integer.valueOf(2)).getMock(); entityListenersService.addEntityListener(repoFullName, entityListener1); entityListenersService.addEntityListener(repoFullName, entityListener2); entityListenersService.updateEntities(repoFullName, Arrays.asList(entity1, entity2).stream()) .collect(Collectors.toList()); Mockito.verify(entityListener1).postUpdate(entity1); Mockito.verify(entityListener2).postUpdate(entity2); entityListenersService.removeEntityListener(repoFullName, entityListener1); entityListenersService.removeEntityListener(repoFullName, entityListener2); Assert.assertTrue(entityListenersService.isEmpty(repoFullName)); } @Test public void updateEntityTest() { String repoFullName = "EntityRepo"; Entity entity = Mockito.mock(Entity.class); EntityListener entityListener1 = Mockito.when(Mockito.mock(EntityListener.class).getEntityId()) .thenReturn(Integer.valueOf(1)).getMock(); EntityListener entityListener2 = Mockito.when(Mockito.mock(EntityListener.class).getEntityId()) .thenReturn(Integer.valueOf(1)).getMock(); Mockito.when(entity.getIdValue()).thenReturn(Integer.valueOf(1)).getMock(); entityListenersService.register(repoFullName); entityListenersService.addEntityListener(repoFullName, entityListener1); entityListenersService.addEntityListener(repoFullName, entityListener2); entityListenersService.updateEntity(repoFullName, entity); Mockito.verify(entityListener1).postUpdate(entity); Mockito.verify(entityListener2).postUpdate(entity); entityListenersService.removeEntityListener(repoFullName, entityListener1); entityListenersService.removeEntityListener(repoFullName, entityListener2); Assert.assertTrue(entityListenersService.isEmpty(repoFullName)); } @Test public void addEntityListenerTest() { String repoFullName = "EntityRepo"; EntityListener entityListener = Mockito.when(Mockito.mock(EntityListener.class).getEntityId()) .thenReturn(Integer.valueOf(1)).getMock(); entityListenersService.register(repoFullName); entityListenersService.addEntityListener(repoFullName, entityListener); Mockito.verify(entityListener).getEntityId(); entityListenersService.removeEntityListener(repoFullName, entityListener); Assert.assertTrue(entityListenersService.isEmpty(repoFullName)); } @Test public void removeEntityListenerTest() { String repoFullName = "EntityRepo"; EntityListener entityListener = Mockito.when(Mockito.mock(EntityListener.class).getEntityId()) .thenReturn(Integer.valueOf(1)).getMock(); entityListenersService.register(repoFullName); entityListenersService.addEntityListener(repoFullName, entityListener); Assert.assertFalse(entityListenersService.isEmpty(repoFullName)); entityListenersService.removeEntityListener(repoFullName, entityListener); Assert.assertTrue(entityListenersService.isEmpty(repoFullName)); } @Test public void isEmptyTest() { String repoFullName = "EntityRepo"; entityListenersService.register(repoFullName); Assert.assertTrue(entityListenersService.isEmpty(repoFullName)); } @Test public void verifyRepoRegistered() { this.entityListenersService = new EntityListenersService(); String repoFullName = "EntityRepo"; EntityListener entityListener = Mockito.when(Mockito.mock(EntityListener.class).getEntityId()) .thenReturn(Integer.valueOf(1)).getMock(); try { entityListenersService.addEntityListener(repoFullName, entityListener); } catch (MolgenisDataException mde) { entityListenersService.register(repoFullName); Assert.assertTrue(entityListenersService.isEmpty(repoFullName)); Assert.assertEquals(mde.getMessage(), "Repository [EntityRepo] is not registered, please contact your administrator"); return; } Assert.fail(); } @Test public void noExceptionsStressTest() { List<Thread> ts = new ArrayList<>(); ts.add(new NewThread("EntityRepo1", 0, 10).getThread()); ts.add(new NewThread("EntityRepo1", 0, 10).getThread()); ts.add(new NewThread("EntityRepo2", 0, 10).getThread()); ts.add(new NewThread("EntityRepo2", 0, 10).getThread()); ts.stream().forEach(t -> { try { t.join(); } catch (InterruptedException e) { e.printStackTrace(); } }); ts.stream().forEach(t -> Assert.assertFalse(t.isAlive())); Assert.assertTrue(entityListenersService.isEmpty("EntityRepo1")); Assert.assertTrue(entityListenersService.isEmpty("EntityRepo2")); } private class NewThread implements Runnable { String repoFullName; int minIdRange; int maxIdRange; Thread t; NewThread(String repoFullName, int minIdRange, int maxIdRange) { this.repoFullName = repoFullName; if (maxIdRange <= minIdRange) throw new RuntimeException("max must be larger than min"); this.minIdRange = minIdRange; this.maxIdRange = maxIdRange; t = new Thread(this); t.start(); } public Thread getThread() { return t; } public void run() { for (int i = minIdRange; i < maxIdRange; i++) { entityListenersService.register(repoFullName); EntityListener entityListener = Mockito.when(Mockito.mock(EntityListener.class).getEntityId()) .thenReturn(Integer.valueOf(i)).getMock(); entityListenersService.addEntityListener(repoFullName, entityListener); entityListenersService.removeEntityListener(repoFullName, entityListener); } } } }