package org.apache.helix;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

// TODO fix this test
public class TestZkConnectionCount extends ZkUnitTestBase {
  private static Logger LOG = LoggerFactory.getLogger(TestZkConnectionCount.class);

  // @Test ()
  public void testZkConnectionCount() {

    // ZkClient zkClient;
    // int nrOfConn = ZkClient.getNumberOfConnections();
    // System.out.println("Number of zk connections made " + nrOfConn);
    //
    // ZkConnection zkConn = new ZkConnection(ZK_ADDR);
    //
    // zkClient = new ZkClient(zkConn);
    // AssertJUnit.assertEquals(nrOfConn + 1, ZkClient.getNumberOfConnections());
    //
    // zkClient = new ZkClient(ZK_ADDR);
    // AssertJUnit.assertEquals(nrOfConn + 2, ZkClient.getNumberOfConnections());
    //
    // zkClient = ZKClientPool.getZkClient(ZK_ADDR);
    // AssertJUnit.assertEquals(nrOfConn + 2, ZkClient.getNumberOfConnections());

  }

}
