/** * Copyright 2016 LinkedIn Corp. All rights reserved. * * 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. */ package com.github.ambry.router; import com.codahale.metrics.MetricRegistry; import com.github.ambry.config.NetworkConfig; import com.github.ambry.config.VerifiableProperties; import com.github.ambry.network.NetworkClient; import com.github.ambry.network.NetworkClientFactory; import com.github.ambry.network.NetworkMetrics; import com.github.ambry.utils.Time; import java.io.IOException; import java.util.concurrent.atomic.AtomicReference; /** * A class that mocks {@link NetworkClientFactory} and returns a {@link NetworkClient} created using a {@link * MockSelector} */ class MockNetworkClientFactory extends NetworkClientFactory { private final Time time; private AtomicReference<MockSelectorState> state; private MockServerLayout serverLayout; private int maxPortsPlainText; private int maxPortsSsl; private int checkoutTimeoutMs; /** * Construct a MockNetworkClientFactory using the given parameters * @param vProps the VerifiableProperties * @param state the reference that will be used by the callers to set the state of the MockSelector. * @param maxPortsPlainText max number of ports for plain text connections to a node. * @param maxPortsSsl max number of connections for ssl connections to a node. * @param checkoutTimeoutMs timeout for connection checkouts. * @param serverLayout the {@link MockServerLayout} used to get the {@link MockServer} given a host and port. * @param time the Time instance to use. */ MockNetworkClientFactory(VerifiableProperties vProps, AtomicReference<MockSelectorState> state, int maxPortsPlainText, int maxPortsSsl, int checkoutTimeoutMs, MockServerLayout serverLayout, Time time) { super(new NetworkMetrics(new MetricRegistry()), new NetworkConfig(vProps), null, maxPortsPlainText, maxPortsSsl, checkoutTimeoutMs, time); this.state = state; this.time = time; this.serverLayout = serverLayout; this.maxPortsPlainText = maxPortsPlainText; this.maxPortsSsl = maxPortsSsl; this.checkoutTimeoutMs = checkoutTimeoutMs; } /** * Return a {@link NetworkClient} instantiated with a {@link MockSelector} * @return the constructed {@link NetworkClient} * @throws IOException if the selector could not be constructed. */ @Override public NetworkClient getNetworkClient() throws IOException { MockSelector selector = new MockSelector(serverLayout, state, time); return new NetworkClient(selector, networkConfig, new NetworkMetrics(new MetricRegistry()), maxPortsPlainText, maxPortsSsl, checkoutTimeoutMs, time); } /** * Return a {@link MockNetworkClient} instantiated with a {@link MockSelector} * @return the constructed {@link MockNetworkClient} * @throws IOException if the selector could not be constructed. */ public MockNetworkClient getMockNetworkClient() throws IOException { MockSelector selector = new MockSelector(serverLayout, state, time); return new MockNetworkClient(selector, networkConfig, new NetworkMetrics(new MetricRegistry()), maxPortsPlainText, maxPortsSsl, checkoutTimeoutMs, time); } }