/**
* 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.orm.dao;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.H2DatabaseCleaner;
import org.apache.ambari.server.controller.internal.SortRequestImpl;
import org.apache.ambari.server.controller.internal.StageResourceProvider;
import org.apache.ambari.server.controller.spi.Predicate;
import org.apache.ambari.server.controller.spi.Request;
import org.apache.ambari.server.controller.spi.SortRequest;
import org.apache.ambari.server.controller.spi.SortRequestProperty;
import org.apache.ambari.server.controller.utilities.PredicateBuilder;
import org.apache.ambari.server.controller.utilities.PropertyHelper;
import org.apache.ambari.server.orm.GuiceJpaInitializer;
import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
import org.apache.ambari.server.orm.OrmTestHelper;
import org.apache.ambari.server.orm.entities.RequestEntity;
import org.apache.ambari.server.orm.entities.StageEntity;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.google.inject.Guice;
import com.google.inject.Injector;
/**
* StageDAO tests.
*/
public class StageDAOTest {
private Injector injector;
private StageDAO stageDao;
@Before
public void setup() throws Exception {
injector = Guice.createInjector(new InMemoryDefaultTestModule());
injector.getInstance(GuiceJpaInitializer.class);
stageDao = injector.getInstance(StageDAO.class);
OrmTestHelper helper = injector.getInstance(OrmTestHelper.class);
Long clusterId = helper.createCluster();
RequestDAO requestDao = injector.getInstance(RequestDAO.class);
RequestEntity requestEntity = new RequestEntity();
requestEntity.setClusterId(clusterId);
requestEntity.setStartTime(1000L);
requestEntity.setEndTime(1200L);
requestEntity.setRequestId(99L);
requestDao.create(requestEntity);
for (int i = 0; i < 5; i++) {
StageEntity definition = new StageEntity();
definition.setClusterId(clusterId);
definition.setRequestId(99L);
definition.setStageId((long) (100 + i));
definition.setLogInfo("log info for " + i);
definition.setRequestContext("request context for " + i);
definition.setRequest(requestEntity);
stageDao.create(definition);
}
List<StageEntity> definitions = stageDao.findAll();
assertNotNull(definitions);
assertEquals(5, definitions.size());
}
@After
public void teardown() throws AmbariException, SQLException {
H2DatabaseCleaner.clearDatabaseAndStopPersistenceService(injector);
injector = null;
}
/**
* Tests that the Ambari {@link org.apache.ambari.server.controller.spi.Predicate}
* can be converted and submitted to JPA correctly to return a restricted result set.
*/
@Test
public void testStagePredicate() throws Exception {
Predicate predicate = new PredicateBuilder().property(
StageResourceProvider.STAGE_CLUSTER_NAME).equals("c1").toPredicate();
List<StageEntity> entities = stageDao.findAll(PropertyHelper.getReadRequest(), predicate);
assertEquals(5, entities.size());
predicate = new PredicateBuilder().
property(StageResourceProvider.STAGE_CONTEXT).equals("request context for 3").or().
property(StageResourceProvider.STAGE_CONTEXT).equals("request context for 4").
toPredicate();
entities = stageDao.findAll(PropertyHelper.getReadRequest(), predicate);
assertEquals(2, entities.size());
}
/**
* Tests that JPA does the sorting work for us.
*/
@Test
public void testStageSorting() throws Exception {
List<SortRequestProperty> sortProperties = new ArrayList<>();
SortRequest sortRequest = new SortRequestImpl(sortProperties);
Predicate predicate = new PredicateBuilder().property(
StageResourceProvider.STAGE_CLUSTER_NAME).equals("c1").toPredicate();
sortProperties.add(new SortRequestProperty(
StageResourceProvider.STAGE_LOG_INFO, SortRequest.Order.ASC));
Request request = PropertyHelper.getReadRequest(new HashSet<>(Arrays.<String>asList()),
null, null, null, sortRequest);
// get back all 5
List<StageEntity> entities = stageDao.findAll(request, predicate);
assertEquals(5, entities.size());
// assert sorting ASC
String lastInfo = null;
for (StageEntity entity : entities) {
if (lastInfo == null) {
lastInfo = entity.getLogInfo();
continue;
}
String currentInfo = entity.getLogInfo();
assertTrue(lastInfo.compareTo(currentInfo) <= 0);
lastInfo = currentInfo;
}
// clear and do DESC
sortProperties.clear();
sortProperties.add(new SortRequestProperty(
StageResourceProvider.STAGE_LOG_INFO, SortRequest.Order.DESC));
// get back all 5
entities = stageDao.findAll(request, predicate);
assertEquals(5, entities.size());
// assert sorting DESC
lastInfo = null;
for (StageEntity entity : entities) {
if (null == lastInfo) {
lastInfo = entity.getLogInfo();
continue;
}
String currentInfo = entity.getLogInfo();
assertTrue(lastInfo.compareTo(currentInfo) >= 0);
lastInfo = currentInfo;
}
}
}