package com.ldbc.driver.runtime.coordination; import com.ldbc.driver.runtime.ConcurrentErrorReporter; import com.ldbc.driver.temporal.SystemTimeSource; import com.ldbc.driver.temporal.TimeSource; import org.junit.Test; import java.util.HashSet; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; public class CompletionTimeServiceAssistantTest { @Test public void shouldWaitUntilGctAdvancesAndReturnCorrectSuccessValue() throws CompletionTimeException { TimeSource timeSource = new SystemTimeSource(); ConcurrentErrorReporter errorReporter = new ConcurrentErrorReporter(); CompletionTimeServiceAssistant assistant = new CompletionTimeServiceAssistant(); CompletionTimeService completionTimeService = assistant.newSynchronizedConcurrentCompletionTimeServiceFromPeerIds(new HashSet<String>()); try { // initial gct should be null assertThat(completionTimeService.globalCompletionTimeAsMilli(), is(-1l)); // there are no writers, gct will never advance boolean gctAdvancedSuccessfully = assistant.waitForGlobalCompletionTime(timeSource, 0, 1000, completionTimeService, errorReporter); assertThat(gctAdvancedSuccessfully, is(false)); assertThat(completionTimeService.globalCompletionTimeAsMilli(), is(-1l)); LocalCompletionTimeWriter writer1 = completionTimeService.newLocalCompletionTimeWriter(); LocalCompletionTimeWriter writer2 = completionTimeService.newLocalCompletionTimeWriter(); // no initiated/completed times have been submitted, gct will never advance gctAdvancedSuccessfully = assistant.waitForGlobalCompletionTime(timeSource, 0, 1000, completionTimeService, errorReporter); assertThat(gctAdvancedSuccessfully, is(false)); assertThat(completionTimeService.globalCompletionTimeAsMilli(), is(-1l)); assistant.writeInitiatedAndCompletedTimesToAllWriters(completionTimeService, 0); // gct can not be known at this stage, because more 0 times/values may arrive later // IT[ ] CT[0] --> GCT = ? gctAdvancedSuccessfully = assistant.waitForGlobalCompletionTime(timeSource, 0, 1000, completionTimeService, errorReporter); assertThat(gctAdvancedSuccessfully, is(false)); assertThat(completionTimeService.globalCompletionTimeAsMilli(), is(-1l)); assistant.writeInitiatedAndCompletedTimesToAllWriters(completionTimeService, 1); // gct should now be 0, because no more 0 values/times can come after 1 values/times have been written to all writers // IT[ , ] CT[0,1] --> GCT = 0 gctAdvancedSuccessfully = assistant.waitForGlobalCompletionTime(timeSource, 0, 1000, completionTimeService, errorReporter); assertThat(gctAdvancedSuccessfully, is(true)); assertThat(completionTimeService.globalCompletionTimeAsMilli(), is(0l)); } finally { completionTimeService.shutdown(); } } }