Package com.ngdata.hbaseindexer.master

Source Code of com.ngdata.hbaseindexer.master.BatchStateUpdaterTest

/*
* Copyright 2013 NGDATA nv
*
* 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.ngdata.hbaseindexer.master;


import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.ngdata.hbaseindexer.model.api.BatchBuildInfo;
import com.ngdata.hbaseindexer.model.api.IndexerDefinition;
import com.ngdata.hbaseindexer.model.api.WriteableIndexerModel;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobID;
import org.apache.hadoop.mapred.JobStatus;
import org.apache.hadoop.mapred.RunningJob;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.internal.verification.VerificationModeFactory;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import static org.mockito.Mockito.*;

public class BatchStateUpdaterTest {
    WriteableIndexerModel model;
    JobClient jobClient;
    List<IndexerDefinition> indexerDefinitionList;
    ScheduledThreadPoolExecutor executorService;


    @Before
    public void setUp() throws Exception {
        executorService = new ScheduledThreadPoolExecutor(5);
        indexerDefinitionList = Lists.newArrayList();
        model = mock(WriteableIndexerModel.class);
        when(model.getIndexers()).thenReturn(indexerDefinitionList);

        jobClient = mock(JobClient.class);
    }

    @After
    public void tearDown() throws Exception {
        executorService.shutdown();
        try {
            if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
                executorService.shutdownNow();
            }
        } catch (InterruptedException e) {
            executorService.shutdownNow();
            Thread.currentThread().interrupt();
        }
    }

    @Test
    public void testRun() throws Exception {
        String jobId = "job_201407251005_0815";
        createDefinition("mytest", jobId);
        createJob(jobId, JobStatus.SUCCEEDED);

        checkAllIndexes();

        verify(model, VerificationModeFactory.atLeastOnce()).updateIndexerInternal(any(IndexerDefinition.class));
    }

    @Test
    public void testRun_Empty() throws Exception {
        createDefinition("mytest", null);
        checkAllIndexes();
        verify(model, VerificationModeFactory.times(0)).updateIndexerInternal(any(IndexerDefinition.class));
    }

    @Test
    public void testRun_Running() throws Exception {
        String jobId = "job_201407251005_0815";
        createDefinition("mytest", jobId);
        RunningJob job = createJob(jobId, JobStatus.RUNNING);

        when(job.getJobState()).thenReturn(JobStatus.RUNNING);

        Assert.assertEquals(0, executorService.getQueue().size());
        checkAllIndexes();

        Assert.assertEquals(1, executorService.getQueue().size());
        verify(model, VerificationModeFactory.times(1)).getIndexer(anyString());
        verify(model, VerificationModeFactory.times(0)).updateIndexerInternal(any(IndexerDefinition.class));
        Thread.sleep(60);
        Assert.assertEquals(1, executorService.getQueue().size());
        verify(model, VerificationModeFactory.times(2)).getIndexer(anyString());
        verify(model, VerificationModeFactory.times(0)).updateIndexerInternal(any(IndexerDefinition.class));


        when(job.getJobState()).thenReturn(JobStatus.SUCCEEDED);
        Thread.sleep(60);
        Assert.assertEquals(0, executorService.getQueue().size());
        verify(model, VerificationModeFactory.times(3)).getIndexer(anyString());
        verify(model, VerificationModeFactory.times(1)).updateIndexerInternal(any(IndexerDefinition.class));
    }

    @Test
    public void testRun_MultiIndex() throws Exception {
        String jobId1 = "job_201407251005_0001";
        String jobId2 = "job_201407251005_0002";
        createDefinition("mytest1", jobId1);
        RunningJob job1 = createJob(jobId1, JobStatus.RUNNING);
        createDefinition("mytest2", jobId2);
        RunningJob job2 = createJob(jobId2, JobStatus.RUNNING);

        Assert.assertEquals(0, executorService.getQueue().size());
        checkAllIndexes();

        Assert.assertEquals(2, executorService.getQueue().size());
        verify(model, VerificationModeFactory.times(0)).updateIndexerInternal(any(IndexerDefinition.class));
        Thread.sleep(60);
        Assert.assertEquals(2, executorService.getQueue().size());
        verify(model, VerificationModeFactory.times(0)).updateIndexerInternal(any(IndexerDefinition.class));

        when(job1.getJobState()).thenReturn(JobStatus.SUCCEEDED);
        Thread.sleep(60);
        Assert.assertEquals(1, executorService.getQueue().size());
        verify(model, VerificationModeFactory.times(1)).updateIndexerInternal(any(IndexerDefinition.class));

        when(job2.getJobState()).thenReturn(JobStatus.SUCCEEDED);
        Thread.sleep(60);
        Assert.assertEquals(0, executorService.getQueue().size());
        verify(model, VerificationModeFactory.times(2)).updateIndexerInternal(any(IndexerDefinition.class));

        Thread.sleep(60);
        Assert.assertEquals(0, executorService.getQueue().size());
        verify(model, VerificationModeFactory.times(2)).updateIndexerInternal(any(IndexerDefinition.class));
    }

    private RunningJob createJob(String jobId, int status) throws IOException {
        RunningJob job = mock(RunningJob.class);
        when(job.getJobState()).thenReturn(status);
        when(jobClient.getJob(JobID.forName(jobId))).thenReturn(job);
        return job;
    }

    private IndexerDefinition createDefinition(String name, String jobId) throws Exception {
        IndexerDefinition def = mock(IndexerDefinition.class);
        when(def.getName()).thenReturn(name);
        when(def.getLifecycleState()).thenReturn(IndexerDefinition.LifecycleState.ACTIVE);
        when(def.getIncrementalIndexingState()).thenReturn(IndexerDefinition.IncrementalIndexingState.DEFAULT);

        when(model.getIndexer(name)).thenReturn(def);
        when(model.getFreshIndexer(name)).thenReturn(def);
        indexerDefinitionList.add(def);

        if (jobId != null) {
            Map<String, String> jobTrackingUrls = Maps.newHashMap();
            jobTrackingUrls.put(jobId, "no-matter");
            BatchBuildInfo bbi = mock(BatchBuildInfo.class);
            when(bbi.getMapReduceJobTrackingUrls()).thenReturn(jobTrackingUrls);

            when(def.getActiveBatchBuildInfo()).thenReturn(bbi);
        }
        return def;
    }

    private void checkAllIndexes() {
        for (IndexerDefinition def : indexerDefinitionList) {
            BatchStateUpdater batchStateUpdater = new BatchStateUpdater(def.getName(), model, jobClient, executorService, 50);
            batchStateUpdater.run();
        }
    }
}
TOP

Related Classes of com.ngdata.hbaseindexer.master.BatchStateUpdaterTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.