+ @Test
+ public void testOpen() throws Throwable {
+ when(prov1.beforeOpen(mgr)).thenThrow(new RuntimeException(EXPECTED));
+ when(prov1.afterOpen(mgr)).thenThrow(new RuntimeException(EXPECTED));
+
+ assertTrue(mgr.lock());
+ assertThatIllegalStateException().isThrownBy(() -> mgr.open());
+ unsuccessfulOpen();
+
+ assertTrue(mgr.unlock());
+ unsuccessfulOpen();
+
+ setUp();
+ mgr.configure(properties);
+ assertTrue(mgr.start());
+
+ verify(source1, never()).start();
+ verify(source2, never()).start();
+
+ assertTrue(mgr.open());
+
+ verify(prov1).beforeOpen(mgr);
+ verify(prov2).beforeOpen(mgr);
+
+ verify(source1).start();
+ verify(source2).start();
+
+ verify(prov1).afterOpen(mgr);
+ verify(prov2).afterOpen(mgr);
+
+ when(source1.start()).thenReturn(false);
+ assertFalse(mgr.open());
+ when(source1.start()).thenReturn(true);
+
+ when(sink1.start()).thenReturn(false);
+ assertFalse(mgr.open());
+ when(sink1.start()).thenReturn(true);
+
+ assertTrue(mgr.open());
+ }
+
+ private void unsuccessfulOpen() {
+ verify(prov1).beforeOpen(mgr);
+ verify(prov2).beforeOpen(mgr);
+
+ verify(prov1, never()).afterOpen(mgr);
+ verify(prov2, never()).afterOpen(mgr);
+
+ verify(source1, never()).start();
+ verify(source2, never()).start();
+
+ verify(sink1, never()).start();
+ verify(sink2, never()).start();
+ }
+