/*
* Copyright Terracotta, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.ehcache.clustered.common.internal.messages;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import java.nio.ByteBuffer;
import java.util.UUID;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.only;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.MockitoAnnotations.initMocks;
public class EhcacheCodecTest {
private static final UUID CLIENT_ID = UUID.randomUUID();
@Mock
private ServerStoreOpCodec serverStoreOpCodec;
@Mock
private LifeCycleMessageCodec lifeCycleMessageCodec;
@Mock
private StateRepositoryOpCodec stateRepositoryOpCodec;
private EhcacheCodec codec;
@Before
public void setUp() {
initMocks(this);
codec = new EhcacheCodec(serverStoreOpCodec, lifeCycleMessageCodec, stateRepositoryOpCodec, null);
}
@Test
public void encodeMessage() throws Exception {
LifecycleMessage.ValidateServerStore lifecycleMessage = new LifecycleMessage.ValidateServerStore("foo", null, CLIENT_ID);
codec.encodeMessage(lifecycleMessage);
verify(lifeCycleMessageCodec, only()).encode(any(LifecycleMessage.class));
verify(serverStoreOpCodec, never()).encode(any(ServerStoreOpMessage.class));
verify(stateRepositoryOpCodec, never()).encode(any(StateRepositoryOpMessage.class));
ServerStoreOpMessage.ClearMessage serverStoreOpMessage = new ServerStoreOpMessage.ClearMessage(CLIENT_ID);
codec.encodeMessage(serverStoreOpMessage);
verify(lifeCycleMessageCodec, only()).encode(any(LifecycleMessage.class));
verify(serverStoreOpCodec, only()).encode(any(ServerStoreOpMessage.class));
verify(stateRepositoryOpCodec, never()).encode(any(StateRepositoryOpMessage.class));
StateRepositoryOpMessage.EntrySetMessage stateRepositoryOpMessage = new StateRepositoryOpMessage.EntrySetMessage("foo", "bar", CLIENT_ID);
codec.encodeMessage(stateRepositoryOpMessage);
verify(lifeCycleMessageCodec, only()).encode(any(LifecycleMessage.class));
verify(serverStoreOpCodec, only()).encode(any(ServerStoreOpMessage.class));
verify(stateRepositoryOpCodec, only()).encode(any(StateRepositoryOpMessage.class));
}
@Test
public void decodeLifeCycleMessages() throws Exception {
for (EhcacheMessageType messageType : EhcacheMessageType.LIFECYCLE_MESSAGES) {
ByteBuffer encodedBuffer = EhcacheCodec.OP_CODE_DECODER.encoder().enm("opCode", messageType).encode();
codec.decodeMessage(encodedBuffer.array());
}
verify(lifeCycleMessageCodec, times(EhcacheMessageType.LIFECYCLE_MESSAGES.size())).decode(any(EhcacheMessageType.class), any(ByteBuffer.class));
verifyZeroInteractions(serverStoreOpCodec, stateRepositoryOpCodec);
}
@Test
public void decodeServerStoreMessages() throws Exception {
for (EhcacheMessageType messageType : EhcacheMessageType.STORE_OPERATION_MESSAGES) {
ByteBuffer encodedBuffer = EhcacheCodec.OP_CODE_DECODER.encoder().enm("opCode", messageType).encode();
codec.decodeMessage(encodedBuffer.array());
}
verify(serverStoreOpCodec, times(EhcacheMessageType.STORE_OPERATION_MESSAGES.size())).decode(any(EhcacheMessageType.class), any(ByteBuffer.class));
verifyZeroInteractions(lifeCycleMessageCodec, stateRepositoryOpCodec);
}
@Test
public void decodeStateRepoMessages() throws Exception {
for (EhcacheMessageType messageType : EhcacheMessageType.STATE_REPO_OPERATION_MESSAGES) {
ByteBuffer encodedBuffer = EhcacheCodec.OP_CODE_DECODER.encoder().enm("opCode", messageType).encode();
codec.decodeMessage(encodedBuffer.array());
}
verify(stateRepositoryOpCodec, times(EhcacheMessageType.STATE_REPO_OPERATION_MESSAGES.size())).decode(any(EhcacheMessageType.class), any(ByteBuffer.class));
verifyZeroInteractions(lifeCycleMessageCodec, serverStoreOpCodec);
}
}