/**
* Copyright (C) 2015 Orange
* 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.francetelecom.clara.cloud.activation.plugin.cf;
import com.francetelecom.clara.cloud.activation.plugin.cf.domain.AppActivationService;
import com.francetelecom.clara.cloud.commons.MavenReference;
import com.francetelecom.clara.cloud.commons.TechnicalException;
import com.francetelecom.clara.cloud.commons.tasks.Failure;
import com.francetelecom.clara.cloud.commons.tasks.Success;
import com.francetelecom.clara.cloud.commons.tasks.TaskStatus;
import com.francetelecom.clara.cloud.commons.tasks.TaskStatusEnum;
import com.francetelecom.clara.cloud.model.ModelItemRepository;
import com.francetelecom.clara.cloud.model.TechnicalDeployment;
import com.francetelecom.clara.cloud.mvn.consumer.MvnRepoDao;
import com.francetelecom.clara.cloud.paas.activation.ActivationStepEnum;
import com.francetelecom.clara.cloud.techmodel.cf.*;
import com.francetelecom.clara.cloud.techmodel.cf.services.userprovided.SimpleUserProvidedService;
import org.fest.assertions.Assertions;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import java.net.URL;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import static org.fest.assertions.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(org.mockito.runners.MockitoJUnitRunner.class)
public class AppActivationPluginTest {
private AppActivationPlugin plugin;
@Mock
AppActivationService appActivationService;
@Mock
MvnRepoDao mvnRepoDao;
@Mock
ModelItemRepository modelItemRepository;
App joyn;
@Mock
Route route;
@Mock
MavenReference resolvedMavenReference;
@Mock
MavenReference unresolvedMavenReference;
@Mock
AppRepository appRepository;
@Before
public void setUp() {
plugin = new AppActivationPlugin(appActivationService, modelItemRepository, mvnRepoDao, appRepository);
Space space = new Space();
space.activate(SpaceName.randomSpaceNameWithSuffix("env1"));
SimpleUserProvidedService joyndb = new SimpleUserProvidedService("postgres-joyndb", "postgres://user:password@hostname:1234/joyndb", space);
joyn = new App(space, resolvedMavenReference, "joyn");
joyn.bindService(joyndb);
joyn.mapRoute(route);
}
@Test
public void accepts_only_cf_subs() {
assertThat(plugin.accept(App.class, ActivationStepEnum.ACTIVATE)).isTrue();
assertThat(plugin.accept(ModelItemRepository.class, ActivationStepEnum.ACTIVATE)).isFalse();
}
@Test
public void ignores_init_step() {
assertThat(plugin.init(joyn)).isNotNull();
}
@Test
public void fail_to_activate_app_if_app_does_not_exist() throws Exception {
TaskStatus status = plugin.activate(1, App.class, new ActivationTestContext());
Assertions.assertThat(status.hasFailed()).isEqualTo(true);
}
@Test
public void fail_to_delete_app_if_app_does_not_exist() throws Exception {
TaskStatus status = plugin.delete(1, App.class);
Assertions.assertThat(status.hasFailed()).isEqualTo(true);
}
@Test
public void fail_to_stop_app_if_app_does_not_exist() throws Exception {
TaskStatus status = plugin.stop(1, App.class);
Assertions.assertThat(status.hasFailed()).isEqualTo(true);
}
@Test
public void activate_resolves_maven_url_and_delegates_to_consummer() throws Exception {
// given
joyn = Mockito.mock(App.class);
when(mvnRepoDao.resolveUrl(any(MavenReference.class))).thenReturn(resolvedMavenReference);
when(resolvedMavenReference.getAccessUrl()).thenReturn(new URL("http://nexus.com"));
when(resolvedMavenReference.getAccessUrl()).thenReturn(new URL("http://nexus.com"));
when(joyn.getAppBinaries()).thenReturn(unresolvedMavenReference);
Mockito.when(appRepository.findOne(1)).thenReturn(joyn);
Set<Route> routes = new HashSet<>();
routes.add(route);
when(joyn.getRoutes()).thenReturn(routes);
// when
plugin.activate(1, App.class, new ActivationTestContext());
// then
verify(mvnRepoDao).resolveUrl(any(MavenReference.class));
verify(appActivationService).activate(any(App.class));
// expansion
verify(joyn).updateAppBinaries(any(MavenReference.class)); // maven url
// resolutions
}
@Test
public void app_should_be_ACTIVATED_after_activation() throws Exception {
// given
when(mvnRepoDao.resolveUrl(any(MavenReference.class))).thenReturn(resolvedMavenReference);
when(resolvedMavenReference.getAccessUrl()).thenReturn(new URL("http://nexus.com"));
when(resolvedMavenReference.getAccessUrl()).thenReturn(new URL("http://nexus.com"));
Mockito.when(appRepository.findOne(1)).thenReturn(joyn);
Mockito.when(appActivationService.activate(any(App.class))).thenReturn(UUID.randomUUID());
// when
TaskStatus taskStatus = plugin.activate(1, App.class, new ActivationTestContext());
// then
assertThat(taskStatus.getTaskStatus()).isEqualTo(TaskStatusEnum.FINISHED_OK);
assertThat(joyn.isActivated()).isTrue();
verify(appActivationService).activate(any(App.class));
}
@Test
public void should_fail_to_delete_when_app_activation_fails() {
TechnicalDeployment td = new TechnicalDeployment("depl");
Space space = new Space();
space.activate(SpaceName.randomSpaceNameWithSuffix("env1"));
App app = new App(space, resolvedMavenReference, "joyn");
app.activate(UUID.randomUUID());
Mockito.when(appRepository.findOne(1)).thenReturn(app);
Mockito.doThrow(new TechnicalException("failed")).when(appActivationService).delete(any(App.class));
// when
TaskStatus taskStatus = plugin.delete(1, App.class);
// then
assertThat(taskStatus.getTaskStatus()).isEqualTo(TaskStatusEnum.FINISHED_FAILED);
}
@Test
public void should_succeed_to_delete_when_app_activation_succeeds() {
TechnicalDeployment td = new TechnicalDeployment("depl");
Space space = new Space();
space.activate(SpaceName.randomSpaceNameWithSuffix("env1"));
App app = new App(space, resolvedMavenReference, "joyn");
app.activate(UUID.randomUUID());
Mockito.when(appRepository.findOne(1)).thenReturn(app);
// when
TaskStatus taskStatus = plugin.delete(1, App.class);
// then
assertThat(taskStatus.getTaskStatus()).isEqualTo(TaskStatusEnum.FINISHED_OK);
verify(appActivationService).delete(any(App.class));
}
@Test
public void should_delete_when_app_is_activated() {
TechnicalDeployment td = new TechnicalDeployment("depl");
Space space = new Space();
space.activate(SpaceName.randomSpaceNameWithSuffix("env1"));
App app = new App(space, resolvedMavenReference, "joyn");
app.activate(UUID.randomUUID());
Mockito.when(appRepository.findOne(1)).thenReturn(app);
// when
TaskStatus taskStatus = plugin.delete(1, App.class);
// then
verify(appActivationService).delete(any(App.class));
}
@Test
public void should_delete_when_app_is_in_unknown_state() {
TechnicalDeployment td = new TechnicalDeployment("depl");
Space space = new Space();
space.activate(SpaceName.randomSpaceNameWithSuffix("env1"));
App app = new App(space, resolvedMavenReference, "joyn");
app.failed();
Mockito.when(appRepository.findOne(1)).thenReturn(app);
// when
TaskStatus taskStatus = plugin.delete(1, App.class);
// then
verify(appActivationService).delete(any(App.class));
}
@Test
public void should_fail_to_stop_when_app_activation_fails() {
Mockito.when(appRepository.findOne(1)).thenReturn(joyn);
Mockito.doThrow(new TechnicalException("failed")).when(appActivationService).stop(any(App.class));
// when
TaskStatus taskStatus = plugin.stop(1, App.class);
// then
assertThat(taskStatus.getTaskStatus()).isEqualTo(TaskStatusEnum.FINISHED_FAILED);
verify(appActivationService).stop(any(App.class));
}
@Test
public void should_succeed_to_stop_when_app_activation_succeeds() {
Mockito.when(appRepository.findOne(1)).thenReturn(joyn);
// when
TaskStatus taskStatus = plugin.stop(1, App.class);
// then
assertThat(taskStatus.getTaskStatus()).isEqualTo(TaskStatusEnum.FINISHED_OK);
verify(appActivationService).stop(any(App.class));
}
@Test
public void should_fail_to_start_when_app_activation_fails() {
Mockito.when(appRepository.findOne(1)).thenReturn(joyn);
Mockito.when(appActivationService.start(any(App.class))).thenReturn(new Failure("failed"));
// when
TaskStatus taskStatus = plugin.start(1, App.class);
// then
assertThat(taskStatus.getTaskStatus()).isEqualTo(TaskStatusEnum.FINISHED_FAILED);
verify(appActivationService).start(any(App.class));
}
@Test
public void should_succeed_to_start_when_app_activation_succeeds() {
Mockito.when(appRepository.findOne(1)).thenReturn(joyn);
Mockito.when(appActivationService.start(any(App.class))).thenReturn(new Success());
// when
TaskStatus taskStatus = plugin.start(1, App.class);
// then
assertThat(taskStatus.getTaskStatus()).isEqualTo(TaskStatusEnum.FINISHED_OK);
verify(appActivationService).start(any(App.class));
}
@Test
public void should_fail_to_firststart_when_app_activation_fails() {
Mockito.when(appRepository.findOne(1)).thenReturn(joyn);
Mockito.when(appActivationService.start(any(App.class))).thenReturn(new Failure("failed"));
// when
TaskStatus taskStatus = plugin.firststart(1, App.class);
// then
assertThat(taskStatus.getTaskStatus()).isEqualTo(TaskStatusEnum.FINISHED_FAILED);
verify(appActivationService).start(any(App.class));
}
@Test
public void should_succeed_to_firststart_when_app_activation_succeeds() {
Mockito.when(appRepository.findOne(1)).thenReturn(joyn);
Mockito.when(appActivationService.start(any(App.class))).thenReturn(new Success());
// when
TaskStatus taskStatus = plugin.firststart(1, App.class);
// then
assertThat(taskStatus.getTaskStatus()).isEqualTo(TaskStatusEnum.FINISHED_OK);
verify(appActivationService).start(any(App.class));
}
/*
* @Test public void
* get_current_task_status_peeks_app_start_status_to_successful_completion()
* { //given when(cfApp1.getInstanceCount()).thenReturn(5);
* when(cfApp2.getInstanceCount()).thenReturn(5);
*
* //when TaskStatus taskStatus = plugin.firststart(tdi, cfSubscription);
*
* //then
* assertThat(taskStatus.getTaskStatus()).isEqualTo(TaskStatusEnum.STARTED);
* assertThat(taskStatus.listSubtasks()).hasSize(2);
* assertThat(taskStatus.getPercent()).isEqualTo(0);
*
* //given when(cfAdapter.peekAppStartStatus(anyInt(),
* anyString())).thenReturn(1);
*
* //when taskStatus = plugin.giveCurrentTaskStatus(taskStatus);
*
* //then
* assertThat(taskStatus.getTaskStatus()).isEqualTo(TaskStatusEnum.STARTED);
* assertThat(taskStatus.getPercent()).isEqualTo(20); //one instance for
* each app = 2 instances out of 10=20%
*
* //given when(cfAdapter.peekAppStartStatus(anyInt(),
* anyString())).thenReturn(5);
*
* //when taskStatus = plugin.giveCurrentTaskStatus(taskStatus);
*
* //then
* assertThat(taskStatus.getTaskStatus()).isEqualTo(TaskStatusEnum.FINISHED_OK
* ); assertThat(taskStatus.getPercent()).isEqualTo(100);
*
* }
*/
/*
* @Test public void
* get_current_task_status_peeks_app_start_status_to_timeout() { //given
* when(cfApp1.getInstanceCount()).thenReturn(1);
* when(cfApp2.getInstanceCount()).thenReturn(1);
*
* //when TaskStatus taskStatus = plugin.firststart(tdi, cfSubscription);
*
* //then
* assertThat(taskStatus.getTaskStatus()).isEqualTo(TaskStatusEnum.STARTED);
*
* //given when(service.getAppStatus(any(TaskStatus.class)).thenReturn(new
* Failure("failed")));
*
* //when taskStatus = plugin.giveCurrentTaskStatus(taskStatus);
*
* //then assertThat(taskStatus.getTaskStatus()).isEqualTo(TaskStatusEnum.
* FINISHED_FAILED); }
*/
@Test
public void checking_java_int_conversions() {
long elapsedMs = 10000000;
int singleAppStartTimeoutS = 1000;
assertThat(elapsedMs > 1000L * (long) singleAppStartTimeoutS).isTrue();
assertThat(elapsedMs).isEqualTo(10000L * (long) singleAppStartTimeoutS);
}
}