/* * Copyright 2020 LINE Corporation * * LINE Corporation 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: * * https://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.linecorp.armeria.common.zookeeper; import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.util.List; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; import com.linecorp.armeria.client.Endpoint; public final class ZooKeeperTestUtil { private static final Random random = new Random(); public static List<Endpoint> sampleEndpoints(int count) { final int[] ports = unusedPorts(count); final Builder<Endpoint> builder = ImmutableList.builder(); for (int i = 0; i < count; i++) { builder.add(Endpoint.of("127.0.0.1", ports[i]).withWeight(random.nextInt(10000) + 1)); } return builder.build(); } private static int[] unusedPorts(int numPorts) { final int[] ports = new int[numPorts]; final Random random = ThreadLocalRandom.current(); for (int i = 0; i < numPorts; i++) { for (;;) { final int candidatePort = random.nextInt(64512) + 1024; try (ServerSocket ss = new ServerSocket()) { ss.bind(new InetSocketAddress("127.0.0.1", candidatePort)); ports[i] = candidatePort; break; } catch (IOException e) { // Port in use or unable to bind. continue; } } } return ports; } private ZooKeeperTestUtil() {} }