blob: 88c65a29d4475f4a539fa9ce0b38af37b6952d5e [file] [log] [blame]
/*
* Copyright 2017-present Open Networking Foundation
*
* 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.onosproject.incubator.protobuf.services.nb;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps;
import io.grpc.BindableService;
import io.grpc.ManagedChannel;
import io.grpc.inprocess.InProcessChannelBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.onosproject.cluster.NodeId;
import org.onosproject.cluster.RoleInfo;
import org.onosproject.grpc.nb.mastership.MastershipServiceGrpc;
import org.onosproject.grpc.nb.mastership.MastershipServiceNb.getLocalRoleReply;
import org.onosproject.grpc.nb.mastership.MastershipServiceNb.getLocalRoleRequest;
import org.onosproject.grpc.nb.mastership.MastershipServiceNb.getMasterForReply;
import org.onosproject.grpc.nb.mastership.MastershipServiceNb.getMasterForRequest;
import org.onosproject.grpc.nb.mastership.MastershipServiceNb.getNodesForReply;
import org.onosproject.grpc.nb.mastership.MastershipServiceNb.getNodesForRequest;
import org.onosproject.grpc.nb.mastership.MastershipServiceNb.requestRoleForSyncReply;
import org.onosproject.grpc.nb.mastership.MastershipServiceNb.requestRoleForSyncRequest;
import org.onosproject.incubator.protobuf.models.cluster.NodeIdProtoTranslator;
import org.onosproject.incubator.protobuf.models.net.MastershipRoleProtoTranslator;
import org.onosproject.mastership.MastershipService;
import org.onosproject.mastership.MastershipServiceAdapter;
import org.onosproject.net.DeviceId;
import org.onosproject.net.MastershipRole;
import java.io.IOException;
import java.util.Map;
import java.util.Optional;
import static org.junit.Assert.assertEquals;
/**
* Unit tests for mastership gRPC NB service.
*/
public class GrpcNbMastershipServiceTest {
private static InProcessServer<BindableService> inprocessServer;
private static MastershipServiceGrpc.MastershipServiceBlockingStub blockingStub;
private static ManagedChannel channel;
private final MastershipService mastershipService = new MockMastershipService();
private Map<DeviceId, MastershipRole> mastershipMap = Maps.newHashMap();
private Map<DeviceId, NodeId> nodeIdMap = Maps.newHashMap();
private Map<DeviceId, RoleInfo> roleInfoMap = Maps.newHashMap();
private static final String DEVICE_ID_1 = "1";
private static final String DEVICE_ID_2 = "2";
private static final String DEVICE_ID_3 = "3";
private DeviceId did1 = DeviceId.deviceId(DEVICE_ID_1);
private DeviceId did2 = DeviceId.deviceId(DEVICE_ID_2);
private DeviceId did3 = DeviceId.deviceId(DEVICE_ID_3);
private NodeId nid1 = NodeId.nodeId("1");
private NodeId nid2 = NodeId.nodeId("2");
private NodeId nid3 = NodeId.nodeId("3");
/**
* Initializes the test environment.
*/
@Before
public void setUp() throws IllegalAccessException, IOException, InstantiationException {
GrpcNbMastershipService grpcMastershipService = new GrpcNbMastershipService();
grpcMastershipService.mastershipService = mastershipService;
inprocessServer = grpcMastershipService.registerInProcessServer();
inprocessServer.start();
channel = InProcessChannelBuilder.forName("test").directExecutor()
.usePlaintext(true).build();
blockingStub = MastershipServiceGrpc.newBlockingStub(channel);
initMastershipMap();
initNodeIdMap();
initRoleInfoMap();
}
/**
* Finalizes the test setup.
*/
@After
public void tearDown() {
channel.shutdownNow();
inprocessServer.stop();
}
private void initMastershipMap() {
mastershipMap.put(did1, MastershipRole.MASTER);
mastershipMap.put(did2, MastershipRole.STANDBY);
mastershipMap.put(did3, MastershipRole.NONE);
}
private void initNodeIdMap() {
nodeIdMap.put(did1, nid1);
nodeIdMap.put(did2, nid2);
nodeIdMap.put(did3, nid3);
}
private void initRoleInfoMap() {
RoleInfo roleInfo1 = new RoleInfo(nid1, ImmutableList.of(nid2, nid3));
RoleInfo roleInfo2 = new RoleInfo(nid2, ImmutableList.of(nid1, nid3));
RoleInfo roleInfo3 = new RoleInfo(nid3, ImmutableList.of(nid2, nid3));
roleInfoMap.put(did1, roleInfo1);
roleInfoMap.put(did2, roleInfo2);
roleInfoMap.put(did3, roleInfo3);
}
/**
* Tests the invocation result of getLocalRole method.
*
* @throws InterruptedException
*/
@Test
public void testGetLocalRole() throws InterruptedException {
getLocalRoleRequest request = getLocalRoleRequest.newBuilder()
.setDeviceId(DEVICE_ID_1)
.build();
getLocalRoleReply reply;
reply = blockingStub.getLocalRole(request);
assertEquals(Optional.of(MastershipRole.MASTER),
MastershipRoleProtoTranslator.translate(reply.getMastershipRole()));
}
/**
* Tests the invocation result of requestRoleForSync method.
*
* @throws InterruptedException
*/
@Test
public void testRequestRoleForSync() throws InterruptedException {
requestRoleForSyncRequest request = requestRoleForSyncRequest.newBuilder()
.setDeviceId(DEVICE_ID_2)
.build();
requestRoleForSyncReply reply;
reply = blockingStub.requestRoleForSync(request);
assertEquals(Optional.of(MastershipRole.STANDBY),
MastershipRoleProtoTranslator.translate(reply.getMastershipRole()));
}
/**
* Tests the invocation result of getMasterFor method.
*
* @throws InterruptedException
*/
@Test
public void testGetMasterFor() {
getMasterForRequest request = getMasterForRequest.newBuilder()
.setDeviceId(DEVICE_ID_1)
.build();
getMasterForReply reply;
reply = blockingStub.getMasterFor(request);
assertEquals(nid1, NodeIdProtoTranslator.translate(reply.getNodeId()));
}
/**
* Tests the invocation result of getNodesFor method.
*
* @throws InterruptedException
*/
@Test
public void testGetNodesFor() {
getNodesForRequest request = getNodesForRequest.newBuilder()
.setDeviceId(DEVICE_ID_3)
.build();
getNodesForReply reply;
reply = blockingStub.getNodesFor(request);
assertEquals(nid3, NodeIdProtoTranslator.translate(reply.getRoleInfo().getMaster()));
}
private class MockMastershipService extends MastershipServiceAdapter {
@Override
public MastershipRole getLocalRole(DeviceId deviceId) {
return mastershipMap.get(deviceId);
}
@Override
public MastershipRole requestRoleForSync(DeviceId deviceId) {
return mastershipMap.get(deviceId);
}
@Override
public NodeId getMasterFor(DeviceId deviceId) {
return nodeIdMap.get(deviceId);
}
@Override
public RoleInfo getNodesFor(DeviceId deviceId) {
return roleInfoMap.get(deviceId);
}
}
}