Package org.talend.esb.servicelocator.client.internal.zk

Source Code of org.talend.esb.servicelocator.client.internal.zk.ZKBackendTest

/*
* #%L
* Service Locator Client for CXF
* %%
* Copyright (C) 2011 - 2012 Talend Inc.
* %%
* 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.
* #L%
*/
package org.talend.esb.servicelocator.client.internal.zk;

import java.util.List;
import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooDefs.Perms;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Id;
import org.apache.zookeeper.data.Stat;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.talend.esb.servicelocator.client.ServiceLocatorException;
import org.talend.esb.servicelocator.client.internal.NodePath;
import org.talend.esb.servicelocator.client.internal.RootNode;
import org.talend.esb.servicelocator.client.internal.zk.ZKBackend;

import static java.util.Arrays.asList;
import static org.apache.zookeeper.CreateMode.PERSISTENT;
import static org.easymock.EasyMock.aryEq;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.fail;
import static org.talend.esb.servicelocator.TestValues.*;
import static org.talend.esb.servicelocator.TestContent.*;

public class ZKBackendTest {

    public static final NodePath NODE_PATH = new NodePath("someValue");

    public static final List<ACL> DEFAULT_ACLS;

    static {
        Id readRole = new Id("sl", "SL_READ");
        Id maintainRole = new Id("sl", "SL_MAINTAIN");
        Id adminRole = new Id("sl", "SL_ADMIN");

        ACL readAcl = new ACL(Perms.READ, readRole);   
        ACL maintainAcl = new ACL(Perms.READ | Perms.CREATE | Perms.WRITE | Perms.DELETE, maintainRole);   
        ACL adminAcl = new ACL(Perms.ALL, adminRole);
        DEFAULT_ACLS = asList(readAcl, maintainAcl, adminAcl);
    }

    private ZooKeeper zkMock;

    private boolean  withAuthentication;

    public static void ignore(String txt) {
    }

    @Before
    public void setUp() throws Exception {
        zkMock = createMock(ZooKeeper.class);
    }

    @Test
    public void connect() throws Exception {
        expect(zkMock.getState()).andStubReturn(ZooKeeper.States.CONNECTED);
        replay(zkMock);

        ZKBackend zkb = createZKBackend(true);

        RootNode rootNode = zkb.connect();

        assertNotNull(rootNode);
        assertTrue(zkb.isConnected());
        verify(zkMock);
    }

    @Test
    public void connectFailing() throws Exception {
        ZKBackend zkb = createZKBackend(false);

        replay(zkMock);

        zkb.setConnectionTimeout(5);

        try {
            zkb.connect();
            fail("A ServiceLocatorException should have been thrown.");
        } catch (ServiceLocatorException e) {
            ignore("Expected exception");
        }

        verify(zkMock);
    }

    @Ignore
    @Test
    public void connectWithCredentialsProvided () throws Exception {
        ZKBackend zkb = createZKBackend();

        zkMock.addAuthInfo(eq("sl"), aryEq(USER_NAME_PASSWORD_BYTES));
        replay(zkMock);

        zkb.setUserName(USER_NAME);
        zkb.setPassword(PASSWORD);
        zkb.connect();

        verify(zkMock);       
    }

    @Test
    public void nodeExistsTrue()  throws Exception {
        expect(zkMock.exists(NODE_PATH.toString(), false)).andReturn(new Stat());
        replay(zkMock);
        ZKBackend zkb = createZKBackend();

        zkb.connect();
        boolean exists = zkb.nodeExists(NODE_PATH);
       
        assertTrue(exists);
        verify(zkMock);
    }

    @Test
    public void nodeExistsFalse()  throws Exception {
        expect(zkMock.exists(NODE_PATH.toString(), false)).andReturn(null);
       
        ZKBackend zkb = createZKBackend();
        replay(zkMock);

        zkb.connect();
        boolean exists = zkb.nodeExists(NODE_PATH);
       
        assertFalse(exists);
        verify(zkMock);
    }

    @Test
    public void createNode()  throws Exception {
        expect(zkMock.create(NODE_PATH.toString(), CONTENT_ANY_1, getACLs(), PERSISTENT)).
            andReturn(NODE_PATH.toString());
       
        ZKBackend zkb = createZKBackend();
        replay(zkMock);

        zkb.connect();
        zkb.createNode(NODE_PATH, PERSISTENT, CONTENT_ANY_1);
        verify(zkMock);
    }
   
    private ZKBackend createZKBackend()
            throws ServiceLocatorException {
        return createZKBackend(true);
    }

        private ZKBackend createZKBackend(final boolean connectSuccessful)
            throws ServiceLocatorException {
        return new ZKBackend() {
            @Override
            protected ZooKeeper createZooKeeper(CountDownLatch connectionLatch)
                    throws ServiceLocatorException {
                if (connectSuccessful) {
                    connectionLatch.countDown();
                }
                return zkMock;
            }
        };
    }
       
    List<ACL> getACLs() {
        return withAuthentication ? DEFAULT_ACLS  : Ids.OPEN_ACL_UNSAFE;
    }
}
TOP

Related Classes of org.talend.esb.servicelocator.client.internal.zk.ZKBackendTest

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.