/**
* Copyright (C) 2015 Orange
* 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 com.francetelecom.clara.cloud.logicalmodel.samplecatalog;
import com.francetelecom.clara.cloud.logicalmodel.InvalidConfigServiceException;
import com.francetelecom.clara.cloud.logicalmodel.LogicalConfigService;
import com.francetelecom.clara.cloud.logicalmodel.LogicalConfigServiceUtils;
import com.francetelecom.clara.cloud.logicalmodel.LogicalConfigServiceUtils.StructuredLogicalConfigServiceContent;
import com.google.common.collect.Sets;
import com.google.common.collect.Sets.SetView;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Set;
import static org.junit.Assert.assertTrue;
public class ElPaaSoLogicalModelCatalogTest {
protected static Logger LOG = LoggerFactory.getLogger(ElPaaSoLogicalModelCatalogTest.class);
private static final String CONTEXTPROPERTIES_PATH = "com/francetelecom/clara/cloud/commons/testconfigurations/credentials-reference";
private static final String REFERENCE_PROPERTIES_FILE = "com/francetelecom/clara/cloud/commons/testconfigurations/diff/last_released_credentials.properties";
private static final String ADDED_PROPERTIES_FILE = "com/francetelecom/clara/cloud/commons/testconfigurations/diff/added_since_last_released.properties";
private static final String REMOVED_PROPERTIES_FILE = "com/francetelecom/clara/cloud/commons/testconfigurations/diff/removed_since_last_released.properties";
private static final String DEVELOPMENT_PROPERTIES_FILE = "com/francetelecom/clara/cloud/commons/testconfigurations/diff/credentials-development_specific.properties";
private ElPaaSoLogicalTestModelCatalog elPaaSoLogicalModelCatalog = new ElPaaSoLogicalTestModelCatalog();
private LogicalConfigServiceUtils configServiceUtils = new LogicalConfigServiceUtils();
private SampleAppProperties sampleAppProperties = new SampleAppProperties();
private Set<String> developmentSpecificPropertiesKeys;
@Before
public void setup() throws InvalidConfigServiceException {
elPaaSoLogicalModelCatalog.setContextPropertiesPath(CONTEXTPROPERTIES_PATH);
elPaaSoLogicalModelCatalog.setSampleAppProperties(sampleAppProperties);
developmentSpecificPropertiesKeys = configServiceUtils.loadKeysFromFile(DEVELOPMENT_PROPERTIES_FILE);
}
@Test
public void ensure_every_properties_change_is_documented() throws Exception {
// Compare catalog properties to reference paas.properties (extract from FUT)
PropertyDiff foundDiffs = diff(elPaaSoLogicalModelCatalog, REFERENCE_PROPERTIES_FILE);
// List keys declared as added since last release
Set<String> officiallyAdded = configServiceUtils.loadKeysFromFile(ADDED_PROPERTIES_FILE);
// List keys declared as removed since last release
Set<String> officiallyRemoved = configServiceUtils.loadKeysFromFile(REMOVED_PROPERTIES_FILE);
// Compare declaration to effective properties found in catalog
PropertyDiff unexceptedDiffs = new PropertyDiff(Sets.difference(foundDiffs.getAdded(), officiallyAdded), Sets.difference(foundDiffs.getRemoved(),
officiallyRemoved));
// If there are some difference, just log it and fire an error
assertTrue(
unexceptedDiffs.toString()
+ "\nDon't forget to update (cloud-commons-testconfigurations):"
+ "\t-added_since_last_released.properties\n"
+ "\t-removed_since_last_released.properties files.\n"
+ "#Have a look at http://elpaaso_shp/index.php/Credentials.properties#Updating_properties to update this file",
unexceptedDiffs.isSame());
}
@Test
public void ensure_every_added_properties_is_not_already_in_last_release_properties() throws InvalidConfigServiceException {
// List keys from last release
Set<String> lastReleaseKeys = configServiceUtils.loadKeysFromFile(REFERENCE_PROPERTIES_FILE);
// List keys declared as added since last release
Set<String> officiallyAddedKeys = configServiceUtils.loadKeysFromFile(ADDED_PROPERTIES_FILE);
// List all keys that are in both Set
Set<String> addedKeysAlreadyInLastRelease = Sets.intersection(lastReleaseKeys, officiallyAddedKeys);
// Ensure that the intersection of both Set is empty
assertTrue(ADDED_PROPERTIES_FILE + " contains keys that are already in " + REFERENCE_PROPERTIES_FILE + addedKeysAlreadyInLastRelease,
addedKeysAlreadyInLastRelease.isEmpty());
}
@Test
public void ensure_every_added_properties_is_realy_declared_in_context_properties() throws InvalidConfigServiceException {
// List development properties keys
Set<String> developmentPropertiesKeys = getReferencePropertiesKeys(elPaaSoLogicalModelCatalog);
// List keys declared as added since last release
Set<String> officiallyAddedKeys = configServiceUtils.loadKeysFromFile(ADDED_PROPERTIES_FILE);
Set<String> addedKeysNotFoundInDevelopmentKeys = Sets.difference(officiallyAddedKeys, developmentPropertiesKeys);
// Validate that all added keys are realy in development keys
String initialDevPropertiesFile = elPaaSoLogicalModelCatalog.getContextPropertiesPath();
assertTrue("Some keys into added keys are not declared in development properties [" + initialDevPropertiesFile + "] : "
+ addedKeysNotFoundInDevelopmentKeys,
addedKeysNotFoundInDevelopmentKeys.isEmpty());
}
@Test
public void ensure_every_removed_properties_was_declared_in_last_release_properties() throws InvalidConfigServiceException {
// List keys from last release
Set<String> lastReleaseKeys = configServiceUtils.loadKeysFromFile(REFERENCE_PROPERTIES_FILE);
// List keys declared as removed since last release
Set<String> officiallyRemoved = configServiceUtils.loadKeysFromFile(REMOVED_PROPERTIES_FILE);
Set<String> removedKeysNotFoundInLastRelease = Sets.difference(officiallyRemoved, lastReleaseKeys);
// Validate that all removed keys was realy in last release keys
assertTrue("Some keys into removed keys are not declared in last release properties : " + removedKeysNotFoundInLastRelease,
removedKeysNotFoundInLastRelease.isEmpty());
}
@Test
public void ensure_every_removed_properties_has_been_removed_from_development_properties() throws InvalidConfigServiceException {
// List development properties keys
Set<String> developmentPropertiesKeys = getReferencePropertiesKeys(elPaaSoLogicalModelCatalog);
// List keys declared as removed since last release
Set<String> officiallyRemoved = configServiceUtils.loadKeysFromFile(REMOVED_PROPERTIES_FILE);
// List all keys that are in both Set
Set<String> removedKeysStillDeclaredInReference = Sets.intersection(developmentPropertiesKeys, officiallyRemoved);
// Ensure that the intersection of both Set is empty
assertTrue(REMOVED_PROPERTIES_FILE + " contains keys that are still declared in " + REFERENCE_PROPERTIES_FILE + removedKeysStillDeclaredInReference,
removedKeysStillDeclaredInReference.isEmpty());
}
@Test
public void ensure_every_development_specific_properties_are_declared_in_reference_properties() throws InvalidConfigServiceException {
// List development properties
Set<String> developmentPropertiesKeys = configServiceUtils.loadKeysFromFile(CONTEXTPROPERTIES_PATH + ".properties");
// Validate that all development specific properties keys are in reference properties
Set<String> developmentSpecificKeysNotFoundInDevelopmenticPropertiesKeys = Sets
.difference(developmentSpecificPropertiesKeys, developmentPropertiesKeys);
assertTrue("Some development specific properties are not declared in reference properties"
+ developmentSpecificKeysNotFoundInDevelopmenticPropertiesKeys, developmentSpecificKeysNotFoundInDevelopmenticPropertiesKeys.isEmpty());
}
public PropertyDiff diff(ElPaaSoLogicalTestModelCatalog catalog, String fileName) throws InvalidConfigServiceException {
// Load properties from a reference properties file
Set<String> releasePropertiesKeys = configServiceUtils.loadKeysFromFile(fileName);
Set<String> actualPropertiesKeys = getReferencePropertiesKeys(catalog);
// Evict all development properties from comparison
releasePropertiesKeys.removeAll(developmentSpecificPropertiesKeys);
SetView<String> addedProperties = Sets.difference(actualPropertiesKeys, releasePropertiesKeys);
SetView<String> removedProperties = Sets.difference(releasePropertiesKeys, actualPropertiesKeys);
// Return a diff properties containing new and removed properties
return new PropertyDiff(addedProperties, removedProperties);
}
private Set<String> getReferencePropertiesKeys(ElPaaSoLogicalTestModelCatalog catalog) throws InvalidConfigServiceException {
Set<String> actualPropertiesKeys = Sets.newTreeSet();
// Merge properties keys from ElpaasoLogicalModelCatalog into one single Set
Set<LogicalConfigService> listLogicalServices = catalog.createLogicalModel("elpaaso").listLogicalServices(LogicalConfigService.class);
for (LogicalConfigService logicalConfigService : listLogicalServices) {
String configSetContent = logicalConfigService.getConfigSetContent();
StructuredLogicalConfigServiceContent parseConfigContent = configServiceUtils.parseConfigContent(configSetContent);
actualPropertiesKeys.addAll(parseConfigContent.listKeys());
}
return actualPropertiesKeys;
}
public class PropertyDiff {
private Set<String> added;
private Set<String> removed;
public PropertyDiff(Set<String> added, Set<String> removed) {
this.added = added;
this.removed = removed;
}
public boolean isSame() {
return added.isEmpty() && removed.isEmpty();
}
public Set<String> getAdded() {
return added;
}
public void setAdded(Set<String> added) {
this.added = added;
}
public Set<String> getRemoved() {
return removed;
}
public void setRemoved(Set<String> removed) {
this.removed = removed;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("-- added --\n");
for (String addedProp : added) {
builder.append(addedProp);
builder.append("=\n");
}
builder.append("-- removed --\n");
for (String removedProp : removed) {
builder.append(removedProp);
builder.append("=\n");
}
return builder.toString();
}
}
}