blob: 471fc5216a0f0b62ed26dbc1315d2eb14c599971 [file] [log] [blame]
// 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.cloudstack.storage.datastore.db;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDaoImpl.ValueType;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.modules.junit4.PowerMockRunner;
import com.cloud.storage.ScopeType;
import com.cloud.storage.dao.StoragePoolHostDao;
import com.cloud.storage.dao.StoragePoolTagsDao;
import junit.framework.TestCase;
@RunWith(PowerMockRunner.class)
@PowerMockIgnore("javax.management.*")
public class PrimaryDataStoreDaoImplTest extends TestCase {
@Mock
StoragePoolDetailsDao _detailsDao;
@Mock
StoragePoolHostDao _hostDao;
@Mock
StoragePoolTagsDao _tagsDao;
@Spy
@InjectMocks
private static PrimaryDataStoreDaoImpl primaryDataStoreDao = new PrimaryDataStoreDaoImpl();
@Mock
StoragePoolVO storagePoolVO;
private static final String STORAGE_TAG_1 = "NFS-A";
private static final String STORAGE_TAG_2 = "NFS-B";
private static final String[] STORAGE_TAGS_ARRAY = {STORAGE_TAG_1, STORAGE_TAG_2};
private static final String DETAIL_KEY = "storage.overprovisioning.factor";
private static final String DETAIL_VALUE = "2.0";
private static final Map<String, String> STORAGE_POOL_DETAILS = new HashMap<>();
private static final String EXPECTED_RESULT_SQL_STORAGE_TAGS = "(storage_pool_tags.tag='" + STORAGE_TAG_1 + "') OR (storage_pool_tags.tag='" + STORAGE_TAG_2 + "')";
private static final String EXPECTED_RESULT_SQL_DETAILS = "((storage_pool_details.name='" + DETAIL_KEY + "') AND (storage_pool_details.value='" + DETAIL_VALUE +"'))";
private static final String SQL_PREFIX = "XXXXXXXXXXXXXXXX";
private static final String SQL_SUFFIX = "ZZZZZZZZZZZZZZZZ";
private static final String SQL_VALUES = "YYYYYYYYYYYYYYYY";
private static final Long DATACENTER_ID = 1l;
private static final Long POD_ID = 1l;
private static final Long CLUSTER_ID = null;
private static final ScopeType SCOPE = ScopeType.ZONE;
@Before
public void setup() throws IOException, ClassNotFoundException, SQLException {
STORAGE_POOL_DETAILS.put(DETAIL_KEY, DETAIL_VALUE);
doReturn(Arrays.asList(storagePoolVO)).when(primaryDataStoreDao).
searchStoragePoolsPreparedStatement(nullable(String.class), nullable(Long.class), nullable(Long.class), nullable(Long.class),
nullable(ScopeType.class), nullable(Integer.class));
}
@Test
public void testGetSqlValuesFromStorageTagsNotNullStorageTags() {
assertEquals(EXPECTED_RESULT_SQL_STORAGE_TAGS, primaryDataStoreDao.getSqlValuesFromStorageTags(STORAGE_TAGS_ARRAY));
}
@Test(expected=NullPointerException.class)
public void testGetSqlValuesFromStorageTagsNullStorageTags() {
primaryDataStoreDao.getSqlValuesFromStorageTags(null);
}
@Test(expected=IndexOutOfBoundsException.class)
public void testGetSqlValuesFromStorageTagsEmptyStorageTags() {
String[] emptyStorageTags = {};
primaryDataStoreDao.getSqlValuesFromStorageTags(emptyStorageTags);
}
@Test
public void testGetSqlValuesFromDetailsNotNullDetails() {
assertEquals(EXPECTED_RESULT_SQL_DETAILS, primaryDataStoreDao.getSqlValuesFromDetails(STORAGE_POOL_DETAILS));
}
@Test(expected=NullPointerException.class)
public void testGetSqlValuesFromDetailsNullDetails() {
primaryDataStoreDao.getSqlValuesFromDetails(null);
}
@Test(expected=IndexOutOfBoundsException.class)
public void testGetSqlValuesFromDetailsEmptyDetailss() {
Map<String,String> emptyDetails = new HashMap<String, String>();
primaryDataStoreDao.getSqlValuesFromDetails(emptyDetails);
}
@Test
public void testGetSqlPreparedStatementNullClusterId() {
String sqlPreparedStatement = primaryDataStoreDao.getSqlPreparedStatement(SQL_PREFIX, SQL_SUFFIX, SQL_VALUES, null);
assertEquals(SQL_PREFIX + SQL_VALUES + SQL_SUFFIX, sqlPreparedStatement);
}
@Test
public void testGetSqlPreparedStatementNotNullClusterId() {
String clusterSql = "storage_pool.cluster_id = ? OR storage_pool.cluster_id IS NULL) AND (";
String sqlPreparedStatement = primaryDataStoreDao.getSqlPreparedStatement(SQL_PREFIX, SQL_SUFFIX, SQL_VALUES, 1l);
assertEquals(SQL_PREFIX + clusterSql + SQL_VALUES + SQL_SUFFIX, sqlPreparedStatement);
}
@Test
public void testFindPoolsByDetailsOrTagsInternalStorageTagsType() {
List<StoragePoolVO> storagePools = primaryDataStoreDao.findPoolsByDetailsOrTagsInternal(DATACENTER_ID, POD_ID, CLUSTER_ID, SCOPE, SQL_VALUES, ValueType.TAGS, STORAGE_TAGS_ARRAY.length);
assertEquals(Arrays.asList(storagePoolVO), storagePools);
verify(primaryDataStoreDao).getSqlPreparedStatement(
primaryDataStoreDao.TagsSqlPrefix, primaryDataStoreDao.TagsSqlSuffix, SQL_VALUES, CLUSTER_ID);
String expectedSql = primaryDataStoreDao.TagsSqlPrefix + SQL_VALUES + primaryDataStoreDao.TagsSqlSuffix;
verify(primaryDataStoreDao).searchStoragePoolsPreparedStatement(expectedSql, DATACENTER_ID, POD_ID, CLUSTER_ID, SCOPE, STORAGE_TAGS_ARRAY.length);
}
@Test
public void testFindPoolsByDetailsOrTagsInternalDetailsType() {
List<StoragePoolVO> storagePools = primaryDataStoreDao.findPoolsByDetailsOrTagsInternal(DATACENTER_ID, POD_ID, CLUSTER_ID, SCOPE, SQL_VALUES, ValueType.DETAILS, STORAGE_POOL_DETAILS.size());
assertEquals(Arrays.asList(storagePoolVO), storagePools);
verify(primaryDataStoreDao).getSqlPreparedStatement(
primaryDataStoreDao.DetailsSqlPrefix, primaryDataStoreDao.DetailsSqlSuffix, SQL_VALUES, CLUSTER_ID);
String expectedSql = primaryDataStoreDao.DetailsSqlPrefix + SQL_VALUES + primaryDataStoreDao.DetailsSqlSuffix;
verify(primaryDataStoreDao).searchStoragePoolsPreparedStatement(expectedSql, DATACENTER_ID, POD_ID, CLUSTER_ID, SCOPE, STORAGE_POOL_DETAILS.size());
}
}