/***************************************************************************
* Copyright (c) 2012-2014 VMware, Inc. 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.
* See the License for the specific language governing permissions and
* limitations under the License.
***************************************************************************/
package com.vmware.bdd.service.event;
import com.vmware.bdd.service.event.VmEventManager;
import com.vmware.bdd.service.sp.MockConcurrentClusterEntityManager;
import com.vmware.bdd.service.sp.MockVcContext;
import com.vmware.bdd.service.sp.MockVcEventListener;
import junit.framework.Assert;
import mockit.Mockit;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.vmware.aurora.vc.vcevent.VcEventHandlers.VcEventType;
import com.vmware.bdd.manager.ConcurrentWriteLockedClusterEntityManager;
import com.vmware.bdd.service.MockVcCache;
import com.vmware.vim.binding.vim.event.Event;
import com.vmware.vim.binding.vim.event.VmClonedEvent;
import com.vmware.vim.binding.vim.event.VmEvent;
import com.vmware.vim.binding.vim.event.VmEventArgument;
import com.vmware.vim.binding.vim.event.VmPoweredOffEvent;
import com.vmware.vim.binding.vim.event.VmPoweredOnEvent;
import com.vmware.vim.binding.vim.event.VmRemovedEvent;
import com.vmware.vim.binding.vim.event.VmSuspendedEvent;
import com.vmware.vim.binding.vmodl.ManagedObjectReference;
public class TestVmEventManager {
private static VmEventManager eventManager;
private static ConcurrentWriteLockedClusterEntityManager entityMgr;
@AfterClass(groups = { "TestVmEventManager" })
public static void tearDown() throws Exception {
Mockit.tearDownMocks();
}
@BeforeClass(groups = { "TestVmEventManager" }, dependsOnGroups = { "TestClusterConfigManager" })
public static void setUp() throws Exception {
Mockit.setUpMock(MockVcCache.class);
MockVcCache.setGetFlag(true);
Mockit.setUpMock(MockVcContext.class);
Mockit.setUpMock(MockVcEventListener.class);
entityMgr = new MockConcurrentClusterEntityManager();
eventManager = new VmEventManager(entityMgr);
eventManager.start();
}
private <T extends VmEvent> T getVmEvent(final String id, Class<T> eventClass) {
T e = Mockito.mock(eventClass);
VmEventArgument ea = Mockito.mock(VmEventArgument.class);
Mockito.when(e.getVm()).thenReturn(ea);
Mockito.when(ea.getVm()).thenAnswer(new Answer<ManagedObjectReference>() {
public ManagedObjectReference answer(InvocationOnMock invocation) throws Throwable {
ManagedObjectReference moRef = Mockito.mock(ManagedObjectReference.class);
Mockito.when(moRef.getServerGuid()).thenReturn(null);
Mockito.when(moRef.getType()).thenReturn("VirtualMachine");
Mockito.when(moRef.getValue()).thenReturn(id);
System.out.println("processed event " + id);
return (ManagedObjectReference) moRef;
}
});
return e;
}
@Test
public void testConcurrency() throws Exception {
sendEvents(100, 20);
}
private void sendEvents(int number, int sleepMS) throws Exception {
for (int i = 0; i < number; i ++) {
Event e = getVmEvent(Integer.toString(i), VmRemovedEvent.class);
MockVcEventListener.getExtHandler().eventHandler(VcEventType.VmRemoved, e);
e = getVmEvent(Integer.toString(i), VmPoweredOnEvent.class);
MockVcEventListener.getIntHandler().eventHandler(VcEventType.VmPoweredOn, e);
e = getVmEvent(Integer.toString(i), VmClonedEvent.class);
MockVcEventListener.getIntHandler().eventHandler(VcEventType.VmCloned, e);
e = getVmEvent(Integer.toString(i), VmSuspendedEvent.class);
MockVcEventListener.getExtHandler().eventHandler(VcEventType.VmSuspended, e);
e = getVmEvent(Integer.toString(i), VmPoweredOffEvent.class);
MockVcEventListener.getIntHandler().eventHandler(VcEventType.VmPoweredOff, e);
if (sleepMS != 0) {
Thread.sleep(sleepMS);
}
}
System.out.println("Finished " + number + " events sent.");
}
}