content: /*
   *
   *  * 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());
  
    }
  
  }