/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.api.system.server;
import com.google.common.collect.ImmutableSet;
import org.eclipse.che.api.core.model.workspace.WorkspaceStatus;
import org.eclipse.che.api.core.notification.EventService;
import org.eclipse.che.api.core.notification.EventSubscriber;
import org.eclipse.che.api.system.shared.event.service.SystemServiceItemStoppedEvent;
import org.eclipse.che.api.workspace.server.WorkspaceManager;
import org.eclipse.che.api.workspace.shared.dto.event.WorkspaceStatusEvent;
import org.eclipse.che.dto.server.DtoFactory;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.testng.MockitoTestNGListener;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Tests {@link WorkspaceServiceTermination}.
*
* @author Yevhenii Voevodin
*/
@Listeners(MockitoTestNGListener.class)
public class WorkspaceServiceTerminationTest {
@Mock
private EventService eventService;
@Mock
private WorkspaceManager workspaceManager;
@InjectMocks
private WorkspaceServiceTermination termination;
@Test
public void shutsDownWorkspaceService() throws Exception {
termination.terminate();
verify(workspaceManager).shutdown();
}
@Test
public void publishesStoppedWorkspaceStoppedEventsAsServiceItemStoppedEvents() throws Exception {
when(workspaceManager.getRunningWorkspacesIds()).thenReturn(ImmutableSet.of("id1", "id2", "id3"));
doAnswer(inv -> {
@SuppressWarnings("unchecked")
EventSubscriber<WorkspaceStatusEvent> subscriber = (EventSubscriber<WorkspaceStatusEvent>)inv.getArguments()[0];
// id1
subscriber.onEvent(newWorkspaceStatusEvent(WorkspaceStatus.STARTING, "id1"));
subscriber.onEvent(newWorkspaceStatusEvent(WorkspaceStatus.RUNNING, "id1"));
subscriber.onEvent(newWorkspaceStatusEvent(WorkspaceStatus.STOPPING, "id1"));
subscriber.onEvent(newWorkspaceStatusEvent(WorkspaceStatus.STOPPED, "id1"));
// id2
subscriber.onEvent(newWorkspaceStatusEvent(WorkspaceStatus.RUNNING, "id2"));
subscriber.onEvent(newWorkspaceStatusEvent(WorkspaceStatus.STOPPING, "id2"));
subscriber.onEvent(newWorkspaceStatusEvent(WorkspaceStatus.STOPPED, "id2"));
// id3
subscriber.onEvent(newWorkspaceStatusEvent(WorkspaceStatus.STOPPED, "id3"));
return null;
}).when(eventService).subscribe(any());
termination.terminate();
verify(eventService).publish(new SystemServiceItemStoppedEvent("workspace", "id1", 1, 3));
verify(eventService).publish(new SystemServiceItemStoppedEvent("workspace", "id2", 2, 3));
verify(eventService).publish(new SystemServiceItemStoppedEvent("workspace", "id3", 3, 3));
}
private static WorkspaceStatusEvent newWorkspaceStatusEvent(WorkspaceStatus status, String workspaceId) {
return DtoFactory.newDto(WorkspaceStatusEvent.class)
.withStatus(status)
.withWorkspaceId(workspaceId);
}
}