/*
*
* * Licensed to the Apache Software Foundation (ASF) under one
* * or more contributor license agreements. See the NOTICE file
* * distributed with this work for additional information
* * regarding copyright ownership. The ASF licenses this file
* * to you 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 org.apache.ambari.server.cleanup;
import java.util.Properties;
import org.apache.ambari.server.configuration.Configuration;
import org.apache.ambari.server.controller.ControllerModule;
import org.eclipse.persistence.config.PersistenceUnitProperties;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.google.inject.persist.jpa.AmbariJpaPersistModule;
import com.google.inject.persist.jpa.AmbariJpaPersistService;
import junit.framework.Assert;
/**
* Functional test for the Cleanup process.
*/
@Ignore("Ignored in order not to run with the unit tests as it's time consuming. Should be part of a functional test suit.")
public class CleanupServiceFunctionalTest {
private static Injector injector;
@BeforeClass
public static void beforeClass() throws Exception {
injector = Guice.createInjector(
new CleanupModule(),
new ControllerModule(getTestProperties())
);
// start the persistService
injector.getInstance(AmbariJpaPersistService.class).start();
}
private static Module getTestPersistModule() {
AmbariJpaPersistModule persistModule = new AmbariJpaPersistModule("ambari-server");
Configuration testConfiguration = new Configuration(getTestProperties());
Properties persistenceProperties = ControllerModule.getPersistenceProperties(testConfiguration);
// overriding JPA properties with test specific values
persistenceProperties.setProperty(PersistenceUnitProperties.SCHEMA_GENERATION_DATABASE_ACTION, PersistenceUnitProperties.NONE);
// this doesn't work for something similar to what's described here: http://stackoverflow.com/questions/3606825/problems-with-generating-sql-via-eclipselink-missing-separator
// line breaks are not supported; SQL statements need to be in one line! - appears to be fixed in eclipselink 2.6
//persistenceProperties.setProperty(PersistenceUnitProperties.SCHEMA_GENERATION_CREATE_SCRIPT_SOURCE, "Ambari-DDL-Postgres-CREATE.sql");
// Let the initialization be performed by the jPA provider!
//persistenceProperties.setProperty(PersistenceUnitProperties.SCHEMA_GENERATION_SQL_LOAD_SCRIPT_SOURCE, getTestDataDDL());
//persistenceProperties.setProperty(PersistenceUnitProperties.SCHEMA_GENERATION_DROP_SOURCE, PersistenceUnitProperties.SCHEMA_GENERATION_METADATA_SOURCE);
persistenceProperties.setProperty(PersistenceUnitProperties.THROW_EXCEPTIONS, "true");
// todo remove these when switching to derby!
persistenceProperties.setProperty(PersistenceUnitProperties.JDBC_USER, "ambari");
persistenceProperties.setProperty(PersistenceUnitProperties.JDBC_PASSWORD, "bigdata");
return persistModule.properties(persistenceProperties);
}
private static String getTestDataDDL() {
return "ddl-func-test/ddl-cleanup-test-data.sql";
}
@AfterClass
public static void afterClass() {
injector.getInstance(AmbariJpaPersistService.class).stop();
}
/**
* Override JPA config values read from the ambari.properties
*
* @return
*/
private static Properties getTestProperties() {
Properties properties = new Properties();
properties.put("server.jdbc.connection-pool", "internal");
properties.put("server.persistence.type", "remote");
properties.put("server.jdbc.driver", "org.postgresql.Driver");
properties.put("server.jdbc.user.name", "ambari");
//properties.put("server.jdbc.user.passwd", "bigdata");
properties.put("server.jdbc.url", "jdbc:postgresql://192.168.59.103:5432/ambari");
properties.put(Configuration.SHARED_RESOURCES_DIR.getKey(), "/Users/lpuskas/prj/ambari/ambari-server/src/test/resources");
return properties;
}
@Before
public void setUp() throws Exception {
}
@Test
public void testIOCContext() throws Exception {
// WHEN
CleanupServiceImpl cleanupService = injector.getInstance(CleanupServiceImpl.class);
// THEN
Assert.assertNotNull("The cleanupService instance should be present in the IoC context", cleanupService);
//Assert.assertFalse("The cleanup registry shouldn't be empty", cleanupService.showCleanupRegistry().isEmpty());
}
@Test
public void testRunCleanup() throws Exception {
// GIVEN
CleanupService<TimeBasedCleanupPolicy> cleanupService = injector.getInstance(CleanupServiceImpl.class);
TimeBasedCleanupPolicy cleanupPolicy = new TimeBasedCleanupPolicy("cluster-1", 1455891250758L);
// WHEN
cleanupService.cleanup(cleanupPolicy);
// THEN
// todo assert eg.:on the amount of deleted rows
}
@Test
public void testServicesShouldBeInSingletonScope() throws Exception {
// GIVEN
// the cleanup guice context is build
// WHEN
CleanupService cleanupService1 = injector.getInstance(CleanupServiceImpl.class);
CleanupService cleanupService2 = injector.getInstance(CleanupServiceImpl.class);
// THEN
Assert.assertEquals("The ChainedCleanupService is not in Singleton scope!", cleanupService1, cleanupService2);
//Assert.assertEquals("Registered services are not is not in Singleton scope!", cleanupService1.showCleanupRegistry(), cleanupService2.showCleanupRegistry());
}
}