/*******************************************************************************
* 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.ide.ext.machine.server.ssh;
import org.eclipse.che.api.core.model.user.User;
import org.eclipse.che.api.core.model.workspace.Workspace;
import org.eclipse.che.api.core.model.workspace.WorkspaceConfig;
import org.eclipse.che.api.core.notification.EventService;
import org.eclipse.che.api.core.notification.EventSubscriber;
import org.eclipse.che.api.ssh.server.SshManager;
import org.eclipse.che.api.user.server.UserManager;
import org.eclipse.che.api.workspace.server.event.WorkspaceCreatedEvent;
import org.eclipse.che.api.workspace.server.event.WorkspaceRemovedEvent;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.testng.MockitoTestNGListener;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Test for {@link WorkspaceSshKeys}
*
* @author Florent Benoit
*/
@Listeners(MockitoTestNGListener.class)
public class WorkspaceSshKeysTest {
/**
* The workspace ID that will be used in the test.
*/
private static final String WORKSPACE_ID = "workspace123";
/**
* Name of the workspace returned through workspace.getConfig().getName()
*/
private static final String WORKSPACE_NAME = "myworkspace";
/**
* User namespace for the current @{link EnvironmentContext}
*/
private static final String NAMESPACE = "userNS";
/**
* Dummy Owner identifier used
* This will be used for registering ssh keys.
*/
private static final String OWNER_NAME = "userName";
/**
* Dummy UserID of the owner name
* This will be used for registering ssh keys.
*/
private static final String USER_ID = "user123";
/**
* Capturing the events on the event service.
*/
@Captor
private ArgumentCaptor<EventSubscriber<? extends Object>> subscriberCaptor;
/**
* Event service on which {@link WorkspaceSshKeys} will subscribe
*/
@Mock
private EventService eventService;
/**
* Manager used by {@link WorkspaceSshKeys} to generate/remove ssh keys
*/
@Mock
private SshManager sshManager;
/**
* Manager used by {@link WorkspaceSshKeys} to get userId from workspace owner
*/
@Mock
private UserManager userManager;
/**
* User instance used for returning calls to userManager.
*/
@Mock
private User user;
/**
* Mock of workspace used by events (create/remove)
*/
@Mock
private Workspace workspace;
/**
* Custom configuration used to provide custom name through workspace.getConfig().
*/
@Mock
private WorkspaceConfig workspaceConfig;
/**
* Subscriber for calls on eventService with {@link WorkspaceCreatedEvent} events.
*/
private EventSubscriber<WorkspaceCreatedEvent> workspaceCreatedEventEventSubscriber;
/**
* Subscriber for calls on eventService with {@link WorkspaceRemovedEvent} events.
*/
private EventSubscriber<WorkspaceRemovedEvent> workspaceRemovedEventEventSubscriber;
/**
* The instance that is tested
*/
@InjectMocks
private WorkspaceSshKeys workspaceSshKeys;
/**
* Setup initial objects by grabbing the two event subscribers, populating the environment context and initializing workspace data.
*
* @throws Exception
*/
@BeforeMethod
public void setUp() throws Exception {
workspaceSshKeys.start();
verify(eventService, times(2)).subscribe(subscriberCaptor.capture());
workspaceCreatedEventEventSubscriber = (EventSubscriber<WorkspaceCreatedEvent>)subscriberCaptor.getAllValues().get(0);
workspaceRemovedEventEventSubscriber = (EventSubscriber<WorkspaceRemovedEvent>)subscriberCaptor.getAllValues().get(1);
when(workspace.getId()).thenReturn(WORKSPACE_ID);
when(workspace.getConfig()).thenReturn(workspaceConfig);
when(workspaceConfig.getName()).thenReturn(WORKSPACE_NAME);
when(workspace.getNamespace()).thenReturn(OWNER_NAME);
when(userManager.getByName(eq(OWNER_NAME))).thenReturn(user);
when(user.getId()).thenReturn(USER_ID);
}
/**
* Ensure that when a new workspace is created, a new default ssh keypair is generated by asking sshManager
*/
@Test
public void shouldGenerateSshKeyPairWhenWorkspaceIsCreated() throws Exception {
// given
workspaceCreatedEventEventSubscriber.onEvent(new WorkspaceCreatedEvent(this.workspace));
// then
verify(sshManager).generatePair(eq(USER_ID), eq("workspace"), eq(WORKSPACE_ID));
}
/**
* Ensure that when a workspace is removed, any associated ssh keypair is removed on sshManager
*/
@Test
public void shouldRemoveSshKeyPairWhenWorkspaceIsRemoved() throws Exception {
// given
workspaceRemovedEventEventSubscriber.onEvent(new WorkspaceRemovedEvent(this.workspace));
// then
verify(sshManager).removePair(eq(USER_ID), eq("workspace"), eq(WORKSPACE_ID));
}
}