package org.corfudb.runtime.object; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; /** * Created by dmalkhi on 12/4/16. */ public class CorfuSMRObjectConcurrencyTest extends AbstractObjectTest { @Test public void testCorfuSharedCounterConcurrentReads() throws Exception { getDefaultRuntime(); final int COUNTER_INITIAL = 55; CorfuSharedCounter sharedCounter = (CorfuSharedCounter) instantiateCorfuObject(CorfuSharedCounter.class, "test"); sharedCounter.setValue(COUNTER_INITIAL); int concurrency = PARAMETERS.CONCURRENCY_SOME * 2; int writeconcurrency = PARAMETERS.CONCURRENCY_SOME; int writerwork = PARAMETERS.NUM_ITERATIONS_LOW; sharedCounter.setValue(-1); assertThat(sharedCounter.getValue()) .isEqualTo(-1); scheduleConcurrently(writeconcurrency, t -> { for (int i = 0; i < writerwork; i++) sharedCounter.setValue(t*writerwork + i); } ); scheduleConcurrently(concurrency-writeconcurrency, t -> { int lastread = -1; for (int i = 0; i < PARAMETERS.NUM_ITERATIONS_LOW; i++) { int res = sharedCounter.getValue(); boolean assertflag = ( ( ((lastread < writerwork && res < writerwork) || (lastread >= writerwork && res >= writerwork) ) && lastread <= res ) || ( (lastread < writerwork && res >= writerwork) || (lastread >= writerwork && res < writerwork) ) ); assertThat(assertflag) .isTrue(); } } ); executeScheduled(concurrency, PARAMETERS.TIMEOUT_LONG); } }