1 package emissary.util; 2 3 import emissary.core.BaseDataObject; 4 import emissary.core.EmissaryRuntimeException; 5 import emissary.core.IBaseDataObject; 6 import emissary.test.core.junit5.UnitTest; 7 8 import ch.qos.logback.classic.Level; 9 import ch.qos.logback.classic.Logger; 10 import ch.qos.logback.classic.spi.ILoggingEvent; 11 import ch.qos.logback.core.read.ListAppender; 12 import org.junit.jupiter.api.AfterEach; 13 import org.junit.jupiter.api.BeforeEach; 14 import org.junit.jupiter.api.Test; 15 import org.slf4j.LoggerFactory; 16 17 import java.util.ArrayList; 18 import java.util.Collections; 19 import java.util.List; 20 import javax.annotation.Nullable; 21 22 import static org.junit.jupiter.api.Assertions.assertEquals; 23 import static org.junit.jupiter.api.Assertions.assertNotNull; 24 import static org.junit.jupiter.api.Assertions.assertThrows; 25 import static org.junit.jupiter.api.Assertions.assertTrue; 26 27 @SuppressWarnings("UnnecessaryLambda") 28 class DisposeHelperTest extends UnitTest { 29 30 private static final Runnable FIRST = () -> LoggerFactory.getLogger("DisposeHelperRunnable").warn("DisposeHelperTestFirstRunnable"); 31 private static final Runnable SECOND = () -> LoggerFactory.getLogger("DisposeHelperRunnable").warn("DisposeHelperTestSecondRunnable"); 32 private static final Runnable THIRD = () -> LoggerFactory.getLogger("DisposeHelperRunnable").warn("DisposeHelperTestThirdRunnable"); 33 34 private static final Runnable THROWS = () -> { 35 throw new EmissaryRuntimeException("DisposeHelperTest"); 36 }; 37 38 @Nullable 39 private ListAppender<ILoggingEvent> appender = null; 40 @SuppressWarnings("HidingField") 41 private final Logger logger = (Logger) LoggerFactory.getLogger(DisposeHelper.class); 42 private final Logger rLogger = (Logger) LoggerFactory.getLogger("DisposeHelperRunnable"); 43 44 private IBaseDataObject bdo; 45 private static final String TEST_BDO_NAME = "DisposeHelperTestBdo"; 46 47 @BeforeEach 48 void setup() { 49 appender = new ListAppender<>(); 50 appender.start(); 51 logger.addAppender(appender); 52 rLogger.addAppender(appender); 53 bdo = new BaseDataObject(new byte[0], TEST_BDO_NAME); 54 } 55 56 @AfterEach 57 void detach() { 58 logger.detachAppender(appender); 59 rLogger.detachAppender(appender); 60 } 61 62 @Test 63 void testInvalidRunnable() { 64 final List<Object> objectList = new ArrayList<>(); 65 objectList.add(FIRST); 66 objectList.add("InvalidRunnable"); 67 bdo.setParameter(DisposeHelper.KEY, objectList); 68 69 DisposeHelper.execute(bdo); 70 assertNotNull(appender); 71 assertTrue(appender.list.stream() 72 .anyMatch(i -> i.getLevel().equals(Level.WARN) && 73 i.getFormattedMessage().contains("Not a valid Runnable on object DisposeHelperTestBdo"))); 74 } 75 76 @Test 77 void testExecuteDisposable() { 78 DisposeHelper.set(bdo, FIRST); 79 DisposeHelper.execute(bdo); 80 assertNotNull(appender); 81 assertTrue(appender.list.stream() 82 .anyMatch(i -> i.getFormattedMessage().contains("DisposeHelperTestFirstRunnable"))); 83 } 84 85 @Test 86 void testThrowsDisposable() { 87 DisposeHelper.set(bdo, THROWS); 88 DisposeHelper.execute(bdo); 89 assertNotNull(appender); 90 assertTrue(appender.list.stream() 91 .anyMatch(i -> i.getLevel().equals(Level.WARN) && 92 i.getFormattedMessage().contains("Exception while executing Runnable for " + TEST_BDO_NAME))); 93 } 94 95 @Test 96 void testSetNullDisposable() { 97 assertThrows(NullPointerException.class, () -> DisposeHelper.set(bdo, null)); 98 } 99 100 @Test 101 void testSetDisposable() { 102 assertEquals(0, DisposeHelper.get(bdo).size()); 103 DisposeHelper.set(bdo, FIRST); 104 assertEquals(1, DisposeHelper.get(bdo).size()); 105 assertEquals(FIRST, DisposeHelper.get(bdo).get(0)); 106 DisposeHelper.set(bdo, SECOND); 107 assertEquals(1, DisposeHelper.get(bdo).size()); 108 assertEquals(SECOND, DisposeHelper.get(bdo).get(0)); 109 } 110 111 @Test 112 void testAddDisposable() { 113 DisposeHelper.add(bdo, FIRST); 114 List<Runnable> lr = DisposeHelper.get(bdo); 115 assertEquals(1, lr.size()); 116 assertEquals(FIRST, lr.get(0)); 117 118 DisposeHelper.add(bdo, SECOND); 119 lr = DisposeHelper.get(bdo); 120 assertEquals(2, lr.size()); 121 assertEquals(SECOND, lr.get(1)); 122 } 123 124 @Test 125 void testAddListOfDisposable() { 126 final List<Runnable> runnableList = new ArrayList<>(); 127 runnableList.add(FIRST); 128 runnableList.add(SECOND); 129 DisposeHelper.add(bdo, runnableList); 130 final List<Runnable> lr = DisposeHelper.get(bdo); 131 assertEquals(2, lr.size()); 132 assertEquals(FIRST, lr.get(0)); 133 assertEquals(SECOND, lr.get(1)); 134 } 135 136 @Test 137 void testAddToListOfDisposable() { 138 final List<Runnable> runnableList = new ArrayList<>(); 139 runnableList.add(FIRST); 140 runnableList.add(SECOND); 141 DisposeHelper.add(bdo, runnableList); 142 List<Runnable> lr = DisposeHelper.get(bdo); 143 assertEquals(2, lr.size()); 144 assertEquals(FIRST, lr.get(0)); 145 assertEquals(SECOND, lr.get(1)); 146 147 DisposeHelper.add(bdo, THIRD); 148 lr = DisposeHelper.get(bdo); 149 assertEquals(3, DisposeHelper.get(bdo).size()); 150 assertEquals(FIRST, lr.get(0)); 151 assertEquals(SECOND, lr.get(1)); 152 assertEquals(THIRD, lr.get(2)); 153 } 154 155 @Test 156 void testAddListToListOfDisposable() { 157 final List<Runnable> runnableList = new ArrayList<>(); 158 runnableList.add(FIRST); 159 runnableList.add(SECOND); 160 DisposeHelper.add(bdo, runnableList); 161 List<Runnable> lr = DisposeHelper.get(bdo); 162 assertEquals(2, lr.size()); 163 assertEquals(FIRST, lr.get(0)); 164 assertEquals(SECOND, lr.get(1)); 165 166 DisposeHelper.add(bdo, Collections.singletonList(THIRD)); 167 lr = DisposeHelper.get(bdo); 168 assertEquals(3, lr.size()); 169 assertEquals(FIRST, lr.get(0)); 170 assertEquals(SECOND, lr.get(1)); 171 assertEquals(THIRD, lr.get(2)); 172 } 173 }