// 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. package com.cloud.hypervisor.vmware.util; import com.cloud.utils.concurrency.NamedThreadFactory; import org.joda.time.Duration; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class VmwareContextPoolTest { private class PoolClient implements Runnable { private final VmwareContextPool pool; private volatile Boolean canRun = true; private int counter = 0; public PoolClient(final VmwareContextPool pool) { this.pool = pool; } public int count() { return counter; } public void stop() { canRun = false; } @Override public void run() { final String poolKey = pool.composePoolKey(vmwareAddress, vmwareUsername); while (canRun) { pool.registerContext(createDummyContext(pool, poolKey)); counter++; } } } private VmwareContextPool vmwareContextPool; private VmwareContext vmwareContext; private String vmwareAddress = "address"; private String vmwareUsername = "username"; private int contextLength = 10; private Duration idleCheckInterval = Duration.millis(1000L); public VmwareContext createDummyContext(final VmwareContextPool pool, final String poolKey) { VmwareClient vimClient = new VmwareClient("someAddress"); VmwareContext context = new VmwareContext(vimClient, "someAddress"); context.setPoolInfo(pool, poolKey); return context; } @Before public void setUp() throws Exception { final String poolKey = vmwareContextPool.composePoolKey(vmwareAddress, vmwareUsername); vmwareContextPool = new VmwareContextPool(contextLength, idleCheckInterval); vmwareContext = createDummyContext(vmwareContextPool, poolKey); } @Test public void testRegisterContext() throws Exception { vmwareContextPool.registerContext(vmwareContext); Assert.assertEquals(vmwareContextPool.getContext(vmwareAddress, vmwareUsername), vmwareContext); } @Test public void testUnregisterContext() throws Exception { vmwareContextPool.unregisterContext(vmwareContext); Assert.assertNull(vmwareContextPool.getContext(vmwareAddress, vmwareUsername)); } @Test public void testComposePoolKey() throws Exception { Assert.assertEquals(vmwareContextPool.composePoolKey(vmwareAddress, vmwareUsername), vmwareUsername + "@" + vmwareAddress); } @Test public void testMultithreadedPoolClients() throws Exception { vmwareContextPool = Mockito.spy(vmwareContextPool); final ExecutorService executor = Executors.newFixedThreadPool(10, new NamedThreadFactory("VmwareContextPoolClients")); final List<PoolClient> clients = new ArrayList<>(); for (int i = 0; i < 50; i++) { final PoolClient client = new PoolClient(vmwareContextPool); clients.add(client); executor.submit(client); } Thread.sleep(1000); executor.shutdown(); int totalRegistrations = 0; for (final PoolClient client : clients) { client.stop(); totalRegistrations += client.count(); } Mockito.verify(vmwareContextPool, Mockito.atLeast(totalRegistrations)).registerContext(Mockito.any(VmwareContext.class)); } }