/*
*
* * Copyright (c) 2016. David Sowerby
* *
* * 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 uk.q3c.krail.core.config;
import com.google.inject.AbstractModule;
import com.google.inject.Inject;
import com.mycila.testing.junit.MycilaJunitRunner;
import com.mycila.testing.plugin.guice.GuiceContext;
import com.mycila.testing.plugin.guice.ModuleProvider;
import com.vaadin.server.VaadinService;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import uk.q3c.krail.core.eventbus.EventBusModule;
import uk.q3c.krail.core.eventbus.GlobalBusProvider;
import uk.q3c.krail.core.guice.uiscope.UIScopeModule;
import uk.q3c.krail.core.guice.vsscope.VaadinSessionScopeModule;
import uk.q3c.krail.core.i18n.*;
import uk.q3c.krail.core.services.DefaultServicesModel;
import uk.q3c.krail.core.services.RelatedServicesExecutor;
import uk.q3c.krail.core.services.Service.Cause;
import uk.q3c.krail.core.services.Service.State;
import uk.q3c.krail.core.services.ServiceStatus;
import uk.q3c.krail.core.services.ServicesModule;
import uk.q3c.krail.testutil.i18n.MockCurrentLocale;
import uk.q3c.krail.util.ResourceUtils;
import uk.q3c.krail.util.UtilsModule;
import uk.q3c.util.testutil.TestResource;
import java.io.File;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(MycilaJunitRunner.class)
@GuiceContext({EventBusModule.class, UIScopeModule.class, VaadinSessionScopeModule.class, UtilsModule.class, ApplicationConfigurationModule.class,
ServicesModule.class})
public class DefaultApplicationConfigurationServiceTest {
static File iniDir;
static VaadinService vaadinService;
Map<Integer, IniFileConfig> iniFiles;
@Mock
Translate translate;
DefaultApplicationConfigurationService service;
@Inject
ApplicationConfiguration configuration;
@Mock
DefaultServicesModel servicesModel;
@Mock
RelatedServicesExecutor servicesExecutor;
@Inject
GlobalBusProvider globalBusProvider;
CurrentLocale currentLocale = new MockCurrentLocale();
@Inject
ResourceUtils resourceUtils;
@Mock
I18NProcessor i18NProcessor;
@BeforeClass
public static void setupClass() {
iniDir = TestResource.testJavaRootDir("krail");
vaadinService = mock(VaadinService.class);
when(vaadinService.getBaseDirectory()).thenReturn(iniDir);
VaadinService.setCurrent(vaadinService);
}
@Before
public void setup() {
Locale.setDefault(Locale.UK);
iniFiles = new HashMap<>();
configuration.clear();
service = new DefaultApplicationConfigurationService(translate, configuration, iniFiles, globalBusProvider, resourceUtils,
servicesExecutor);
currentLocale.setLocale(Locale.UK);
when(servicesExecutor.execute(RelatedServicesExecutor.Action.START, Cause.STARTED)).thenReturn(true);
File ff = new File(resourceUtils.configurationDirectory(), "test.krail.ini");
//noinspection ResultOfMethodCallIgnored
ff.setReadable(true);
}
@Test
public void loadOneFile() throws Exception {
// given
addConfig("krail.ini", 0, false);
// when
service.start();
// then (one configuration is the in memory one added automatically)
assertThat(service.isStarted()).isTrue();
assertThat(configuration.getNumberOfConfigurations()).isEqualTo(2);
assertThat(configuration.getBoolean("test")).isTrue();
assertThat(configuration.getString("dbUser")).isEqualTo("monty");
}
protected void addConfig(String filename, int index, boolean optional) {
checkNotNull(filename);
IniFileConfig ifc = new IniFileConfig(filename, optional);
iniFiles.put(index, ifc);
}
@Test
public void loadTwoFiles() throws Exception {
// given
addConfig("krail.ini", 100, false);
addConfig("test.krail.ini", 99, false);
// when
service.start();
// then (one configuration is the in memory one added automatically)
assertThat(configuration.getNumberOfConfigurations()).isEqualTo(3);
assertThat(configuration.getBoolean("test")).isTrue();
assertThat(configuration.getString("dbUser")).isEqualTo("python");
}
@Test
public void loadFileError() throws Exception {
// give
File ff = new File(resourceUtils.configurationDirectory(), "test.krail.ini");
//noinspection ResultOfMethodCallIgnored
ff.setReadable(false);
addConfig("krail.ini", 100, false);
addConfig("test.krail.ini", 99, false);
// when
service.start();
// then service shows as failed becuase required config missing
assertThat(service.getState()).isEqualTo(State.FAILED);
}
@Test
public void stopStart() throws Exception {
// given
addConfig("krail.ini", 0, false);
addConfig("test.krail.ini", 1, false);
configuration.addProperty("in memory", "memory");
// when
service.start();
// then (one configuration is the in memory one added automatically)
assertThat(configuration.getNumberOfConfigurations()).isEqualTo(3);
assertThat(service.getState()).isEqualTo(State.RUNNING);
assertThat(configuration.getString("in memory")).isEqualTo("memory");
// then
service.stop();
assertThat(configuration.getNumberOfConfigurations()).isEqualTo(1);
assertThat(service.getState()).isEqualTo(State.STOPPED);
assertThat(configuration.getString("in memory")).isNull();
}
public void fileMissing_notOptional() throws Exception {
// given
addConfig("rubbish.ini", 0, false);
// when
ServiceStatus status = service.start();
// then
assertThat(status.getState()).isEqualTo(State.STOPPED);
assertThat(status.getClass()).isEqualTo(Cause.FAILED_TO_START);
assertThat(configuration.getNumberOfConfigurations()).isEqualTo(1);
}
@Test
public void fileMissing_optional() throws Exception {
// given
addConfig("rubbish.ini", 0, true);
// when
service.start();
// then
assertThat(configuration.getNumberOfConfigurations()).isEqualTo(1);
}
@Test
public void i18N() {
// given
when(translate.from(LabelKey.Application_Configuration_Service)).thenReturn("Application Configuration " +
"Service");
when(translate.from(DescriptionKey.Application_Configuration_Service)).thenReturn("This service loads the " +
"application configuration from krail.ini");
// when
// then
assertThat(service.getNameKey()).isEqualTo(LabelKey.Application_Configuration_Service);
assertThat(service.getName()).isEqualTo("Application Configuration Service");
assertThat(service.getDescriptionKey()).isEqualTo(DescriptionKey.Application_Configuration_Service);
assertThat(service.getDescription()).isEqualTo("This service loads the application configuration from krail"
+ ".ini");
}
@ModuleProvider
protected AbstractModule module() {
return new AbstractModule() {
@Override
protected void configure() {
bind(Translate.class).toInstance(translate);
bind(CurrentLocale.class).toInstance(currentLocale);
bind(I18NProcessor.class).toInstance(i18NProcessor);
}
};
}
}