com.github.totyumengr.minicubes.cluster.TimeSeriesMiniCubeTest.java Source code

Java tutorial

Introduction

Here is the source code for com.github.totyumengr.minicubes.cluster.TimeSeriesMiniCubeTest.java

Source

/*
 * Copyright 2014 Ran Meng
 *
 * 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.github.totyumengr.minicubes.cluster;

import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import org.junit.After;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.ILock;
import com.mashape.unirest.http.Unirest;

/**
 * @author mengran
 *
 */
public class TimeSeriesMiniCubeTest {

    @BeforeClass
    public static void beforeClass() {
        Application.main(new String[0]);
    }

    @Test
    public void test() {

        System.out.println("Start test...");

        HazelcastInstance server = DiscardListener.applicationContext.getBean(HazelcastInstance.class);
        ILock lock = server.getLock("TimeSeriesMiniCubeTest");
        boolean runTest = false;
        lock.lock();
        try {
            Object executor = server.getMap("TimeSeriesMiniCubeTest_map").get("executor");
            if (executor == null) {
                server.getMap("TimeSeriesMiniCubeTest_map").put("executor", "1");
                runTest = true;
            }
        } finally {
            lock.unlock();
        }

        server.getCountDownLatch("TimeSeriesMiniCubeTest_cdl").trySetCount(1);

        if (!runTest) {
            System.out.println("Don't get the executor chance...");
            try {
                server.getCountDownLatch("TimeSeriesMiniCubeTest_cdl").await(10, TimeUnit.MINUTES);
            } catch (InterruptedException e) {
                // Ignore
            } finally {
                server.getCountDownLatch("TimeSeriesMiniCubeTest_cdl").countDown();
            }
            return;
        }

        try {
            DiscardListener.cdl.await();
            Thread.sleep(90 * 1000);
        } catch (InterruptedException e1) {
            // Ignore
        }

        int port = DiscardListener.applicationContext.getEmbeddedServletContainer().getPort();
        System.out.println("Run integration tests on " + port);

        int[] timeSerisArray = new int[] { 20140606, 20140607, 20140608 };
        StringBuilder sb = new StringBuilder();
        // Prepare time-series
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            String statusString = Unirest.get("http://localhost:" + port + "/status").asString().getBody();
            Map<String, List<String>> status = objectMapper.readValue(statusString,
                    new TypeReference<Map<String, List<String>>>() {
                    });
            for (int i = 0; i < status.get("awaiting").size(); i++) {
                // Assign role
                String assignResult = Unirest.post("http://localhost:" + port + "/reassign")
                        .header("accept", "application/json").field("cubeId", status.get("awaiting").get(i))
                        .field("timeSeries", timeSerisArray[i]).asString().getBody();
                System.out.println("Prepare time-series cube " + assignResult);
                sb.append("," + timeSerisArray[i]);
            }
        } catch (Exception e) {
            Assert.fail();
        }
        String timeSeriesString = sb.substring(1);
        System.out.println("Prepared time-series " + timeSeriesString);
        int actualTimeSeriesCount = timeSeriesString.split(",").length;
        // Sum
        try {
            String sumResult = Unirest.post("http://localhost:" + port + "/sum")
                    .header("accept", "application/json").field("timeSeries", timeSeriesString)
                    .field("indName", "CSM").asString().getBody();
            Assert.assertEquals(actualTimeSeriesCount == 1 ? "305.14000000"
                    : (actualTimeSeriesCount == 2 ? "413.16000000"
                            : (actualTimeSeriesCount == 3 ? "582.76000000" : "")),
                    sumResult);
        } catch (Exception e) {
            Assert.fail();
        }

        // Count
        try {
            String countResult = Unirest.post("http://localhost:" + port + "/count")
                    .header("accept", "application/json").field("timeSeries", timeSeriesString)
                    .field("indName", "CSM").asString().getBody();
            Assert.assertEquals(
                    actualTimeSeriesCount == 1 ? "9"
                            : (actualTimeSeriesCount == 2 ? "19" : (actualTimeSeriesCount == 3 ? "29" : "")),
                    countResult);
        } catch (Exception e) {
            Assert.fail();
        }

        // Merge
        try {
            String dummyMerge = Unirest.post("http://localhost:" + port + "/dummyMerge")
                    .header("accept", "application/json").field("timeSeries", 20140606)
                    .field("sql",
                            "insert into minicube values(20140606,1023,1,51631,100.18000000,29.47000000,9,8836,1);")
                    .asString().getBody();
            Assert.assertEquals("ok", dummyMerge);

            String mergeResult = Unirest.post("http://localhost:" + port + "/merge")
                    .header("accept", "application/json").field("timeSeries", 20140606).field("version", "1")
                    .asString().getBody();
            Assert.assertEquals("ok", mergeResult);

            String sumResult = Unirest.post("http://localhost:" + port + "/sum")
                    .header("accept", "application/json").field("timeSeries", timeSeriesString)
                    .field("indName", "CSM").asString().getBody();
            Assert.assertEquals(actualTimeSeriesCount == 1 ? "405.32000000"
                    : (actualTimeSeriesCount == 2 ? "513.34000000"
                            : (actualTimeSeriesCount == 3 ? "682.94000000" : "")),
                    sumResult);
        } catch (Exception e) {
            Assert.fail();
        }

    }

    @After
    public void shutDown() {
        HazelcastInstance server = DiscardListener.applicationContext.getBean(HazelcastInstance.class);
        server.getCountDownLatch("TimeSeriesMiniCubeTest_cdl").countDown();
    }

}