com.schibsted.triathlon.operators.GroupByOperatorTest.java Source code

Java tutorial

Introduction

Here is the source code for com.schibsted.triathlon.operators.GroupByOperatorTest.java

Source

/*
 * Copyright (c) 2015 Schibsted Products and Technology
 *
 * 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 com.schibsted.triathlon.operators;

import com.netflix.eureka2.interests.ChangeNotification;
import com.netflix.eureka2.registry.datacenter.BasicDataCenterInfo;
import com.netflix.eureka2.registry.datacenter.DataCenterInfo;
import com.netflix.eureka2.registry.instance.InstanceInfo;
import com.netflix.eureka2.registry.instance.NetworkAddress;
import com.schibsted.triathlon.model.ConstraintModel;
import com.schibsted.triathlon.model.InstanceInfoModel;
import com.schibsted.triathlon.model.generated.Marathon;
import com.schibsted.triathlon.service.TriathlonService;
import com.schibsted.triathlon.service.TriathlonServiceImpl;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import org.apache.commons.io.IOUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import rx.Observable;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Stack;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.*;

/**
 * @author Albert Many
 */
public class GroupByOperatorTest {

    @Before
    public void setUp() throws Exception {
    }

    private void initializeInstanceInfos(int count) {
        for (int n = 0; n < count; n++) {
            List<NetworkAddress> na = Collections
                    .singletonList(new NetworkAddress("public", NetworkAddress.ProtocolType.IPv4,
                            "192.168.0." + Integer.toString(n + 1), "myHost-" + Integer.toString(n)));
            DataCenterInfo dc = new BasicDataCenterInfo("datacenter-" + Integer.toString(n), na);
            InstanceInfo ii = new InstanceInfo.Builder().withId("instance-info-id-" + Integer.toString(n))
                    .withDataCenterInfo(dc).build();

            ChangeNotification<InstanceInfo> cn = new ChangeNotification<>(ChangeNotification.Kind.Add, ii);
            InstanceInfoModel.interestSubscriber(cn);
        }
    }

    @After
    public void tearDown() throws Exception {
        InstanceInfoModel.clear();
    }

    @Test
    public void testDeployOneDataCenter() throws Exception {
        initializeInstanceInfos(1);

        List<String> constraint = new ArrayList<String>() {
            {
                add("datacenter");
                add("GROUP_BY");
            }
        };
        TriathlonService triathlonService = Mockito.mock(TriathlonService.class);
        Marathon appDefinition = Mockito.mock(Marathon.class);
        when(appDefinition.getInstances()).thenReturn(2);
        ConstraintModel constraintModel = ConstraintModel.createConstraintModel(constraint);

        String appDefinitionJson = "";
        when(triathlonService.serializeMarathon(Mockito.anyObject())).thenReturn(appDefinitionJson);

        Operator cluster = new GroupByOperator(triathlonService, constraintModel);

        Operator spyCluster = Mockito.spy(cluster);
        doReturn(Observable.just(Unpooled.wrappedBuffer("TEST".getBytes()))).when(spyCluster)
                .getMarathonCommand(Mockito.any(InstanceInfo.class), Mockito.anyString());

        spyCluster.apply(appDefinition).subscribe();
        verify(spyCluster, times(1)).getMarathonCommand(Mockito.any(InstanceInfo.class), Mockito.anyString());
    }

    @Test
    public void testDeployTwoDataCenters() throws Exception {
        initializeInstanceInfos(2);

        List<String> constraint = new ArrayList<String>() {
            {
                add("datacenter");
                add("GROUP_BY");
            }
        };
        TriathlonService triathlonService = Mockito.mock(TriathlonService.class);
        Marathon appDefinition = Mockito.mock(Marathon.class);
        when(appDefinition.getInstances()).thenReturn(2);
        ConstraintModel constraintModel = ConstraintModel.createConstraintModel(constraint);

        String appDefinitionJson = "";
        when(triathlonService.serializeMarathon(Mockito.anyObject())).thenReturn(appDefinitionJson);

        Operator cluster = new GroupByOperator(triathlonService, constraintModel);

        Operator spyCluster = Mockito.spy(cluster);
        doReturn(Observable.just(Unpooled.wrappedBuffer("TEST".getBytes()))).when(spyCluster)
                .getMarathonCommand(Mockito.any(InstanceInfo.class), Mockito.anyString());

        spyCluster.apply(appDefinition).subscribe();
        verify(spyCluster, times(2)).getMarathonCommand(Mockito.any(InstanceInfo.class), Mockito.anyString());
    }

    @Test
    public void testDeployTwoDataCentersOddNumberOfInstances() throws Exception {
        initializeInstanceInfos(2);

        List<String> constraint = new ArrayList<String>() {
            {
                add("datacenter");
                add("GROUP_BY");
            }
        };
        TriathlonService triathlonService = new TriathlonServiceImpl();

        String content = IOUtils.toString(this.getClass().getResourceAsStream("group_by_operator_1.json"), "UTF-8");

        ByteBuf buffer = Unpooled.copiedBuffer(content.getBytes());

        Marathon appDefinition = triathlonService.parseJson(Observable.just(buffer)).toBlocking().toFuture().get();
        appDefinition.setInstances(5);

        ConstraintModel constraintModel = ConstraintModel.createConstraintModel(constraint);

        Operator cluster = new GroupByOperator(triathlonService, constraintModel);

        Operator spyCluster = Mockito.spy(cluster);
        doReturn(Observable.just(Unpooled.wrappedBuffer("TEST".getBytes()))).when(spyCluster)
                .getMarathonCommand(Mockito.any(InstanceInfo.class), Mockito.anyString());

        Stack<Integer> values = new Stack<>();
        values.push(2);
        values.push(3);

        when(spyCluster.getMarathonCommand(Mockito.any(InstanceInfo.class), Mockito.anyString()))
                .thenAnswer(invocation -> {
                    Object[] args = invocation.getArguments();
                    Observable<ByteBuf> val = Observable
                            .just(Unpooled.wrappedBuffer(((String) args[1]).getBytes()));
                    Marathon appDef = triathlonService.parseJson(val).toBlocking().toFuture().get();
                    Integer v = values.pop();
                    assertEquals(v, appDef.getInstances());
                    return val;
                });

        spyCluster.apply(appDefinition).subscribe();
        verify(spyCluster, times(2)).getMarathonCommand(Mockito.any(InstanceInfo.class), Mockito.anyString());
    }

    @Test
    public void testDeployLessInstancesThanDataCenters() throws Exception {
        initializeInstanceInfos(4);

        List<String> constraint = new ArrayList<String>() {
            {
                add("datacenter");
                add("GROUP_BY");
            }
        };
        TriathlonService triathlonService = Mockito.mock(TriathlonService.class);
        Marathon appDefinition = Mockito.mock(Marathon.class);
        when(appDefinition.getInstances()).thenReturn(3);
        ConstraintModel constraintModel = ConstraintModel.createConstraintModel(constraint);

        String appDefinitionJson = "";
        when(triathlonService.serializeMarathon(Mockito.anyObject())).thenReturn(appDefinitionJson);

        Operator cluster = new GroupByOperator(triathlonService, constraintModel);

        Operator spyCluster = Mockito.spy(cluster);
        doReturn(Observable.just(Unpooled.wrappedBuffer("TEST".getBytes()))).when(spyCluster)
                .getMarathonCommand(Mockito.any(InstanceInfo.class), Mockito.anyString());

        spyCluster.apply(appDefinition).subscribe();
        verify(spyCluster, times(3)).getMarathonCommand(Mockito.any(InstanceInfo.class), Mockito.anyString());
    }

}