/*******************************************************************************
* (c) Copyright 2016 Hewlett-Packard Development Company, L.P.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Apache License v2.0 which accompany this distribution.
*
* The Apache License is available at
* http://www.apache.org/licenses/LICENSE-2.0
*
*******************************************************************************/
package io.cloudslang.fortest;
import configuration.SlangEntitiesSpringConfig;
import io.cloudslang.lang.entities.bindings.values.SensitiveValue;
import io.cloudslang.lang.entities.bindings.values.ValueFactory;
import io.cloudslang.lang.spi.encryption.Encryption;
import java.io.Serializable;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* Created by Genadi Rabinovich, genadi@hpe.com on 10/07/2016.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {SensitiveValueTest.SensitiveValueTestConfig.class, SlangEntitiesSpringConfig.class})
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public class SensitiveValueTest {
private static final String ENCRYPTED = "{Encrypted}";
private static final String OBFUSCATED = "{Obfuscated}";
@Test
public void testSensitiveValueEncryptDecrypt() {
final String originalValue = "OriginalSensitiveValue";
final String expectedEncryptedString = "{Encrypted}rO0ABXQAFk9yaWdpbmFsU2Vuc2l0aXZlVmFsdWU=";
SensitiveValue value = (SensitiveValue) ValueFactory.create(originalValue, true);
verifyEncrypted(value, originalValue, expectedEncryptedString);
value.encrypt();
verifyEncrypted(value, originalValue, expectedEncryptedString);
value.decrypt();
verifyDecrypted(value, originalValue);
value.decrypt();
verifyDecrypted(value, originalValue);
value.encrypt();
verifyEncrypted(value, originalValue, expectedEncryptedString);
value.encrypt();
verifyEncrypted(value, originalValue, expectedEncryptedString);
}
@Test
public void testEncryptedStringSensitiveValue() {
final String originalValue = "foo";
final String encryptedString = "{Encrypted}foo";
SensitiveValue value = ValueFactory.createEncryptedString(originalValue, false);
verifyEncrypted(value, originalValue, encryptedString);
value.encrypt();
verifyEncrypted(value, originalValue, encryptedString);
value.decrypt();
verifyDecrypted(value, originalValue);
value.decrypt();
verifyDecrypted(value, originalValue);
value.encrypt();
verifyEncrypted(value, originalValue, encryptedString);
value.encrypt();
verifyEncrypted(value, originalValue, encryptedString);
}
@Test
public void testEncryptedStringSensitiveValuePreEncrypted() {
final String encryptedString = "{Encrypted}bar";
final String expectedDecryptedValue = "bar";
SensitiveValue value = ValueFactory.createEncryptedString(encryptedString, true);
verifyEncrypted(value, expectedDecryptedValue, encryptedString);
value.encrypt();
verifyEncrypted(value, expectedDecryptedValue, encryptedString);
value.decrypt();
verifyDecrypted(value, expectedDecryptedValue);
value.decrypt();
verifyDecrypted(value, expectedDecryptedValue);
value.encrypt();
verifyEncrypted(value, expectedDecryptedValue, encryptedString);
value.encrypt();
verifyEncrypted(value, expectedDecryptedValue, encryptedString);
}
private void verifyEncrypted(SensitiveValue value, Serializable expectedOriginalValue,
String expectedEncryptedString) {
verifySensitiveValue(value, expectedOriginalValue, expectedEncryptedString);
}
private void verifyDecrypted(SensitiveValue value, Serializable expectedOriginalValue) {
// When the value is decrypted, the inner content should be the toString() result of the original value
String expectedContent = expectedOriginalValue.toString();
verifySensitiveValue(value, expectedOriginalValue, expectedContent);
}
private void verifySensitiveValue(SensitiveValue value, Serializable expectedOriginalValue,
String expectedContent) {
assertEquals(expectedContent, value.getContent());
assertEquals(expectedOriginalValue, value.get());
assertEquals(SensitiveValue.SENSITIVE_VALUE_MASK, value.toString());
assertTrue(value.isSensitive());
}
@Configuration
@ComponentScan("io.cloudslang.lang.entities.utils")
static class SensitiveValueTestConfig {
@Bean
public Encryption getTestEncryption() {
return new Encryption() {
@Override
public String encrypt(char[] clearText) {
return ENCRYPTED + new String(clearText);
}
@Override
public String obfuscate(String clearText) {
return OBFUSCATED + clearText;
}
@Override
public char[] deobfuscate(String cypherText) {
return cypherText.toCharArray();
}
@Override
public char[] decrypt(String cypherText) {
return cypherText.substring(ENCRYPTED.length()).toCharArray();
}
@Override
public boolean isTextEncrypted(String text) {
return text.startsWith(ENCRYPTED);
}
};
}
}
}