Package org.rioproject.test.monitor

Source Code of org.rioproject.test.monitor.UndeployTest

/*
* Copyright to the original author or authors.
*
* 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.rioproject.test.monitor;

import net.jini.lookup.ServiceDiscoveryManager;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.rioproject.cybernode.Cybernode;
import org.rioproject.monitor.ProvisionMonitor;
import org.rioproject.impl.opstring.OpString;
import org.rioproject.impl.opstring.OpStringLoader;
import org.rioproject.opstring.OperationalString;
import org.rioproject.opstring.ServiceElement;
import org.rioproject.test.RioTestRunner;
import org.rioproject.test.ServiceMonitor;
import org.rioproject.test.SetTestManager;
import org.rioproject.test.TestManager;
import org.rioproject.test.simple.Simple;
import org.rioproject.test.utils.ArrayUtils;
import org.rioproject.test.utils.CybernodeUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.rmi.RemoteException;
import java.text.MessageFormat;
import java.util.Arrays;

/**
* The class tests OpString undeployment. The test is incomplete;
* it just tests one specific sequence of OpStrings that brings
* the system into a state in which undeployment doesn't work.
*/
@RunWith (RioTestRunner.class)
public class UndeployTest  {
    @SetTestManager
    static TestManager testManager;
    static ServiceMonitor<Cybernode> cyberMon;
    static ServiceMonitor<ProvisionMonitor> pmMon;
    private static Logger logger = LoggerFactory.getLogger("org.rioproject.test.monitor");

    @Before
    public  void setup() throws java.util.concurrent.TimeoutException {
        if(cyberMon==null) {
            testManager.startReggie();
            testManager.startProvisionMonitor();
            final int N = Math.max(testManager.getHostList().size(), 2);
            for (int i = 0; i < N; i++) {
                testManager.startCybernode(i);
            }
            ServiceDiscoveryManager sdm = testManager.getServiceDiscoveryManager();
            cyberMon = new ServiceMonitor<Cybernode>(sdm, Cybernode.class);
            cyberMon.waitFor(N);

            pmMon = new ServiceMonitor<ProvisionMonitor>(sdm, ProvisionMonitor.class);
            pmMon.waitFor(1);
        }
    }

    @Test
    public void testUndeploy() throws Exception {
        ProvisionMonitor monitor = pmMon.getServices().get(0);

        deployOpString(ServiceElement.ProvisionType.FIXED, 10, monitor);
        checkState("fixed", 10, true);

        deployOpString(ServiceElement.ProvisionType.DYNAMIC, 10, monitor);
        checkState("dynamic", 10, false);

        testManager.undeployAll(monitor);
        checkState("dynamic", 0, true);
    }

    /*
     * Deploys the test OpString with the specified parameters.
     */
    private void deployOpString(ServiceElement.ProvisionType provisionType,
                                int maintain,
                                ProvisionMonitor monitor) throws Exception {
        logger.info("Deployment parameters:\n"
                    + "provisionType: {}\n"
                    + "maintain:      {}",
                    provisionType,maintain);

        OpStringLoader loader = new OpStringLoader();
        OperationalString[] opstrings =
            loader.parseOperationalString(
                new File("src/test/resources/opstring/simple_opstring.groovy"));
        Assert.assertEquals(1, opstrings.length);
        OpString opstring = (OpString)opstrings[0];
        Assert.assertEquals(1, opstring.getServices().length);
        ServiceElement service = opstring.getServices()[0];
        service.setPlanned(maintain);
        service.setProvisionType(provisionType);               

        int[] counts = CybernodeUtils.calcServices(cyberMon.getServices(),
                                                   Simple.class);
        logger.info("Services found before deploying the OpString: {}",
                   Arrays.asList(ArrayUtils.asObjects(counts)).toString());

        testManager.deploy(opstring, monitor);
    }

    /*
     * Checks that the current state of the system is as expected.
     */
    private void checkState(String provisionType,
                            final int maintain,
                            final boolean exactMatch) throws Exception {

        final boolean dynamic = !provisionType.equals("fixed");
       
        // Setup the condition to wait for
        Condition condition = new Condition() {
            public boolean test() {
                int[] counts;
                try {
                    counts = CybernodeUtils.calcServices(cyberMon.getServices(),
                                                         Simple.class);
                } catch (RemoteException e) {
                    logger.error("Error calculating services", e);
                    return false;
                }
                logger.info("Services found: {}",Arrays.asList(ArrayUtils.asObjects(counts)).toString());

                if (dynamic) {
                    int sum = ArrayUtils.sum(counts);
                    return exactMatch ? sum == maintain : sum >= maintain;
                } else {
                    for (int count : counts) {
                        if (exactMatch) {
                            if (count != maintain) {
                                return false;
                            }
                        } else {
                            if (count < maintain) {
                                return false;
                            }
                        }
                    }
                    return true;
                }
            }

            public String toString() {
                String pattern = dynamic
                        ? "# of services {0} {1}"
                        : "# of services on each Cybernode {0} {1}";
                Object[] params = new Object[]
                        {exactMatch ? "==" : ">=", maintain};
                return MessageFormat.format(pattern, params);
            }
        };

        Waiter waiter = new Waiter();
        waiter.waitFor(condition);
    }
}
TOP

Related Classes of org.rioproject.test.monitor.UndeployTest

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.