package org.corfudb.infrastructure; import org.corfudb.protocols.wireprotocol.*; import org.junit.Test; import java.util.Collections; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; /** * Created by mwei on 12/13/15. */ public class SequencerServerTest extends AbstractServerTest { public SequencerServerTest() { super(); } @Override public AbstractServer getDefaultServer() { return new SequencerServer(ServerContextBuilder.emptyContext()); } @Test public void responseForEachRequest() { for (int i = 0; i < PARAMETERS.NUM_ITERATIONS_LOW; i++) { sendMessage(new CorfuPayloadMsg<>(CorfuMsgType.TOKEN_REQ, new TokenRequest(1L, Collections.<UUID>emptySet()))); assertThat(getResponseMessages().size()) .isEqualTo(i + 1); } } @Test public void tokensAreIncreasing() { long lastTokenValue = -1; for (int i = 0; i < PARAMETERS.NUM_ITERATIONS_LOW; i++) { sendMessage(new CorfuPayloadMsg<>(CorfuMsgType.TOKEN_REQ, new TokenRequest(1L, Collections.<UUID>emptySet()))); Token thisToken = getLastPayloadMessageAs(TokenResponse.class).getToken(); assertThat(thisToken.getTokenValue()) .isGreaterThan(lastTokenValue); lastTokenValue = thisToken.getTokenValue(); } } @Test public void checkTokenPositionWorks() { for (int i = 0; i < PARAMETERS.NUM_ITERATIONS_LOW; i++) { sendMessage(new CorfuPayloadMsg<>(CorfuMsgType.TOKEN_REQ, new TokenRequest(1L, Collections.<UUID>emptySet()))); Token thisToken = getLastPayloadMessageAs(TokenResponse.class).getToken(); sendMessage(new CorfuPayloadMsg<>(CorfuMsgType.TOKEN_REQ, new TokenRequest(0L, Collections.<UUID>emptySet()))); Token checkToken = getLastPayloadMessageAs(TokenResponse.class).getToken(); assertThat(thisToken) .isEqualTo(checkToken); } } @Test public void perStreamCheckTokenPositionWorks() { UUID streamA = UUID.nameUUIDFromBytes("streamA".getBytes()); UUID streamB = UUID.nameUUIDFromBytes("streamB".getBytes()); for (int i = 0; i < PARAMETERS.NUM_ITERATIONS_LOW; i++) { sendMessage(new CorfuPayloadMsg<>(CorfuMsgType.TOKEN_REQ, new TokenRequest(1L, Collections.singleton(streamA)))); Token thisTokenA = getLastPayloadMessageAs(TokenResponse.class).getToken(); sendMessage(new CorfuPayloadMsg<>(CorfuMsgType.TOKEN_REQ, new TokenRequest(0L, Collections.singleton(streamA)))); Token checkTokenA = getLastPayloadMessageAs(TokenResponse.class).getToken(); assertThat(thisTokenA) .isEqualTo(checkTokenA); sendMessage(new CorfuPayloadMsg<>(CorfuMsgType.TOKEN_REQ, new TokenRequest(1L, Collections.singleton(streamB)))); Token thisTokenB = getLastPayloadMessageAs(TokenResponse.class).getToken(); sendMessage(new CorfuPayloadMsg<>(CorfuMsgType.TOKEN_REQ, new TokenRequest(0L, Collections.singleton(streamB)))); Token checkTokenB = getLastPayloadMessageAs(TokenResponse.class).getToken(); assertThat(thisTokenB) .isEqualTo(checkTokenB); sendMessage(new CorfuPayloadMsg<>(CorfuMsgType.TOKEN_REQ, new TokenRequest(0L, Collections.singleton(streamA)))); Token checkTokenA2 = getLastPayloadMessageAs(TokenResponse.class).getToken(); assertThat(checkTokenA2) .isEqualTo(checkTokenA); assertThat(thisTokenB.getTokenValue()) .isGreaterThan(checkTokenA2.getTokenValue()); } } @Test public void checkBackpointersWork() { UUID streamA = UUID.nameUUIDFromBytes("streamA".getBytes()); UUID streamB = UUID.nameUUIDFromBytes("streamB".getBytes()); for (int i = 0; i < PARAMETERS.NUM_ITERATIONS_LOW; i++) { sendMessage(new CorfuPayloadMsg<>(CorfuMsgType.TOKEN_REQ, new TokenRequest(1L, Collections.singleton(streamA)))); Token thisTokenA = getLastPayloadMessageAs(TokenResponse.class).getToken(); sendMessage(new CorfuPayloadMsg<>(CorfuMsgType.TOKEN_REQ, new TokenRequest(1L, Collections.singleton(streamA)))); long checkTokenAValue = getLastPayloadMessageAs(TokenResponse.class).getBackpointerMap().get(streamA); assertThat(thisTokenA.getTokenValue()) .isEqualTo(checkTokenAValue); sendMessage(new CorfuPayloadMsg<>(CorfuMsgType.TOKEN_REQ, new TokenRequest(1L, Collections.singleton(streamB)))); Token thisTokenB = getLastPayloadMessageAs(TokenResponse.class).getToken(); sendMessage(new CorfuPayloadMsg<>(CorfuMsgType.TOKEN_REQ, new TokenRequest(1L, Collections.singleton(streamB)))); long checkTokenBValue = getLastPayloadMessageAs(TokenResponse.class).getBackpointerMap().get(streamB); assertThat(thisTokenB.getTokenValue()) .isEqualTo(checkTokenBValue); final long MULTI_TOKEN = 5L; sendMessage(new CorfuPayloadMsg<>(CorfuMsgType.TOKEN_REQ, new TokenRequest(MULTI_TOKEN, Collections.singleton(streamA)))); thisTokenA = getLastPayloadMessageAs(TokenResponse.class).getToken(); sendMessage(new CorfuPayloadMsg<>(CorfuMsgType.TOKEN_REQ, new TokenRequest(1L, Collections.singleton(streamA)))); checkTokenAValue = getLastPayloadMessageAs(TokenResponse.class).getBackpointerMap().get(streamA); assertThat(thisTokenA.getTokenValue() + MULTI_TOKEN - 1) .isEqualTo(checkTokenAValue); // check the requesting multiple tokens does not break the back-pointer for the multi-entry sendMessage(new CorfuPayloadMsg<>(CorfuMsgType.TOKEN_REQ, new TokenRequest(1L, Collections.singleton(streamA)))); thisTokenA = getLastPayloadMessageAs(TokenResponse.class).getToken(); sendMessage(new CorfuPayloadMsg<>(CorfuMsgType.TOKEN_REQ, new TokenRequest(MULTI_TOKEN, Collections.singleton(streamA)))); checkTokenAValue = getLastPayloadMessageAs(TokenResponse.class).getBackpointerMap().get(streamA); assertThat(thisTokenA.getTokenValue()) .isEqualTo(checkTokenAValue); } } }