/* * RHQ Management Platform * Copyright (C) 2012 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.core.util.obfuscation; import static org.mockito.Matchers.eq; import static org.mockito.Matchers.isNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import java.util.prefs.Preferences; import org.testng.Assert; import org.testng.annotations.Test; import org.rhq.core.util.obfuscation.ObfuscatedPreferences.Restricted; /** * @author Stefan Negrea */ @Test public class ObfuscatedPreferencesTest { public interface EmptyObfuscatedConstants { } public interface SingleContants { static final public String TEST_PROPERTY = "com.test.one"; } public interface SingleObfuscatedConstants { @Restricted static final public String TEST_PROPERTY = "com.test.two"; } public void testPatternCaseSensitivity() throws Exception { boolean actualIsRestricted = ObfuscatedPreferences.RestrictedFormat.isRestrictedFormat("restricted::asdfasd"); String actualValue = ObfuscatedPreferences.RestrictedFormat.retrieveValue("restricted::asdfasd"); Assert.assertEquals(actualIsRestricted, true); Assert.assertEquals(actualValue, "asdfasd"); actualIsRestricted = ObfuscatedPreferences.RestrictedFormat.isRestrictedFormat("RESTRICTED::123asdf"); actualValue = ObfuscatedPreferences.RestrictedFormat.retrieveValue("RESTRICTED::123asdf"); Assert.assertEquals(actualIsRestricted, true); Assert.assertEquals(actualValue, "123asdf"); actualIsRestricted = ObfuscatedPreferences.RestrictedFormat.isRestrictedFormat("ReSTRiCTED::456asd"); actualValue = ObfuscatedPreferences.RestrictedFormat.retrieveValue("RESTRICTED::456asd"); Assert.assertEquals(actualIsRestricted, true); Assert.assertEquals(actualValue, "456asd"); } public void testPatternMatching() throws Exception { boolean actualIsRestricted = ObfuscatedPreferences.RestrictedFormat.isRestrictedFormat("restricteds::asdfasd"); Assert.assertEquals(actualIsRestricted, false); actualIsRestricted = ObfuscatedPreferences.RestrictedFormat.isRestrictedFormat("RESTRICTED?::asdfasd"); Assert.assertEquals(actualIsRestricted, false); actualIsRestricted = ObfuscatedPreferences.RestrictedFormat.isRestrictedFormat("aReSTRiCTED::asdfasd"); Assert.assertEquals(actualIsRestricted, false); actualIsRestricted = ObfuscatedPreferences.RestrictedFormat.isRestrictedFormat("RESTRICTED::asdfasd"); Assert.assertEquals(actualIsRestricted, true); } public void testPatternMatchingValue() throws Exception { String actualValue = ObfuscatedPreferences.RestrictedFormat.retrieveValue("restricted::asdfasd"); Assert.assertEquals(actualValue, "asdfasd"); actualValue = ObfuscatedPreferences.RestrictedFormat.retrieveValue("restricted:: ::asdfasd"); Assert.assertEquals(actualValue, " "); actualValue = ObfuscatedPreferences.RestrictedFormat.retrieveValue("restricted:: asdfasd"); Assert.assertEquals(actualValue, " asdfasd"); } public void testSimpleNonObfuscatedPut() throws Exception { //setup mocks Preferences mockPreferences = mock(Preferences.class); //setup values to be used final String testValue = "123Test"; //setup mocked replies when(mockPreferences.keys()).thenReturn(new String[] { SingleObfuscatedConstants.TEST_PROPERTY }); //create object to test and inject required dependencies ObfuscatedPreferences test = new ObfuscatedPreferences(mockPreferences, EmptyObfuscatedConstants.class); //exercise code test.put(SingleObfuscatedConstants.TEST_PROPERTY, testValue); //verify assertions verify(mockPreferences, times(1)).keys(); verify(mockPreferences, times(1)).get(eq(SingleObfuscatedConstants.TEST_PROPERTY), isNull(String.class)); verify(mockPreferences, times(1)).put(eq(SingleObfuscatedConstants.TEST_PROPERTY), eq(testValue)); verifyNoMoreInteractions(mockPreferences); } public void testSimpleNonObfuscatedGet() throws Exception { //setup mocks Preferences mockPreferences = mock(Preferences.class); //setup values to be used final String testValue = "123Test"; //setup mocked replies when(mockPreferences.keys()).thenReturn(new String[] { SingleObfuscatedConstants.TEST_PROPERTY }); when(mockPreferences.get(eq(SingleObfuscatedConstants.TEST_PROPERTY), isNull(String.class))).thenReturn( testValue); //create object to test and inject required dependencies ObfuscatedPreferences test = new ObfuscatedPreferences(mockPreferences, EmptyObfuscatedConstants.class); //exercise code String actualValue = test.get(SingleObfuscatedConstants.TEST_PROPERTY, null); //verify assertions verify(mockPreferences, times(1)).keys(); verify(mockPreferences, times(2)).get(eq(SingleObfuscatedConstants.TEST_PROPERTY), isNull(String.class)); verifyNoMoreInteractions(mockPreferences); Assert.assertEquals(actualValue, testValue); } public void testSimpleObfuscatedNotRestrictedGet() throws Exception { //setup mocks Preferences mockPreferences = mock(Preferences.class); //setup values to be used final String testValue = PicketBoxObfuscator.encode("123Test"); //setup mocked replies when(mockPreferences.keys()).thenReturn(new String[] { SingleObfuscatedConstants.TEST_PROPERTY }); when(mockPreferences.get(eq(SingleObfuscatedConstants.TEST_PROPERTY), isNull(String.class))).thenReturn( null, testValue); //create object to test and inject required dependencies ObfuscatedPreferences test = new ObfuscatedPreferences(mockPreferences, EmptyObfuscatedConstants.class); //exercise code String actualValue = test.get(SingleObfuscatedConstants.TEST_PROPERTY, null); //verify assertions verify(mockPreferences, times(1)).keys(); verify(mockPreferences, times(2)).get(eq(SingleObfuscatedConstants.TEST_PROPERTY), isNull(String.class)); verifyNoMoreInteractions(mockPreferences); Assert.assertEquals(actualValue, testValue); } public void testSimpleAttemptToPutRestricted() throws Exception { //setup mocks Preferences mockPreferences = mock(Preferences.class); //setup values to be used final String testValue = PicketBoxObfuscator.encode("123Test"); //setup mocked replies when(mockPreferences.keys()).thenReturn(new String[] { SingleObfuscatedConstants.TEST_PROPERTY }); when(mockPreferences.get(eq(SingleObfuscatedConstants.TEST_PROPERTY), isNull(String.class))).thenReturn( "RESTRICTED::" + testValue); //create object to test and inject required dependencies ObfuscatedPreferences test = new ObfuscatedPreferences(mockPreferences, EmptyObfuscatedConstants.class); //exercise code test.put(SingleObfuscatedConstants.TEST_PROPERTY, "RESTRICTED::" + testValue); String actualValue = test.get(SingleObfuscatedConstants.TEST_PROPERTY, null); //verify assertions verify(mockPreferences, times(1)).keys(); verify(mockPreferences, times(2)).get(eq(SingleObfuscatedConstants.TEST_PROPERTY), isNull(String.class)); verify(mockPreferences, times(1)).put(eq(SingleObfuscatedConstants.TEST_PROPERTY), eq("RESTRICTED::" + testValue)); verifyNoMoreInteractions(mockPreferences); Assert.assertEquals(actualValue, PicketBoxObfuscator.decode(testValue)); } public void testSimpleAttemptToPutRestrictedTwice() throws Exception { //setup mocks Preferences mockPreferences = mock(Preferences.class); //setup values to be used final String testValue = PicketBoxObfuscator.encode("123Test"); final String testValue2 = PicketBoxObfuscator.encode("Test456"); //setup mocked replies when(mockPreferences.keys()).thenReturn(new String[] { SingleObfuscatedConstants.TEST_PROPERTY }); when(mockPreferences.get(eq(SingleObfuscatedConstants.TEST_PROPERTY), isNull(String.class))).thenReturn( null, "RESTRICTED::" + testValue, "RESTRICTED::" + testValue2); //create object to test and inject required dependencies ObfuscatedPreferences test = new ObfuscatedPreferences(mockPreferences, EmptyObfuscatedConstants.class); //exercise code test.put(SingleObfuscatedConstants.TEST_PROPERTY, "RESTRICTED::" + testValue); String actualValue1 = test.get(SingleObfuscatedConstants.TEST_PROPERTY, null); test.put(SingleObfuscatedConstants.TEST_PROPERTY, testValue2); String actualValue2 = test.get(SingleObfuscatedConstants.TEST_PROPERTY, null); //verify assertions verify(mockPreferences, times(1)).keys(); verify(mockPreferences, times(3)).get(eq(SingleObfuscatedConstants.TEST_PROPERTY), isNull(String.class)); verify(mockPreferences, times(1)).put(eq(SingleObfuscatedConstants.TEST_PROPERTY), eq("RESTRICTED::" + testValue)); verify(mockPreferences, times(1)).put(eq(SingleObfuscatedConstants.TEST_PROPERTY), eq("RESTRICTED::" + testValue2)); verifyNoMoreInteractions(mockPreferences); Assert.assertEquals(actualValue1, PicketBoxObfuscator.decode(testValue)); Assert.assertEquals(actualValue2, PicketBoxObfuscator.decode(testValue2)); } public void testSimpleObfuscatedPut() throws Exception { //setup mocks Preferences mockPreferences = mock(Preferences.class); //setup values to be used final String testValue = "123Test"; //setup mocked replies when(mockPreferences.keys()).thenReturn(new String[]{}); when(mockPreferences.get(eq(SingleObfuscatedConstants.TEST_PROPERTY), isNull(String.class))).thenReturn(null); //create object to test and inject required dependencies ObfuscatedPreferences test = new ObfuscatedPreferences(mockPreferences, SingleObfuscatedConstants.class); //exercise code test.put(SingleObfuscatedConstants.TEST_PROPERTY, testValue); //verify assertions verify(mockPreferences, times(1)).keys(); verify(mockPreferences, times(1)).get(eq(SingleObfuscatedConstants.TEST_PROPERTY), isNull(String.class)); verify(mockPreferences, times(1)).put(eq(SingleObfuscatedConstants.TEST_PROPERTY), eq("RESTRICTED::" + PicketBoxObfuscator.encode(testValue))); verifyNoMoreInteractions(mockPreferences); } public void testSimpleObfuscatedValue() throws Exception { //setup mocks Preferences mockPreferences = mock(Preferences.class); //setup values to be used final String testValue = "123Test"; //setup mocked replies when(mockPreferences.keys()).thenReturn(new String[] { SingleObfuscatedConstants.TEST_PROPERTY }); when(mockPreferences.get(eq(SingleObfuscatedConstants.TEST_PROPERTY), isNull(String.class))).thenReturn( "RESTRICTED::" + PicketBoxObfuscator.encode(testValue)); //create object to test and inject required dependencies ObfuscatedPreferences test = new ObfuscatedPreferences(mockPreferences, SingleObfuscatedConstants.class); //exercise code test.put(SingleObfuscatedConstants.TEST_PROPERTY, testValue); String actualValue = test.get(SingleObfuscatedConstants.TEST_PROPERTY, null); //verify assertions verify(mockPreferences, times(1)).put(eq(SingleObfuscatedConstants.TEST_PROPERTY), eq("RESTRICTED::" + PicketBoxObfuscator.encode(testValue))); verify(mockPreferences, times(2)).get(eq(SingleObfuscatedConstants.TEST_PROPERTY), isNull(String.class)); verify(mockPreferences, times(1)).keys(); verifyNoMoreInteractions(mockPreferences); Assert.assertEquals(actualValue,testValue); } public void testIntialValueNotObfuscated() throws Exception { //setup mocks Preferences mockPreferences = mock(Preferences.class); //setup values to be used final String testValue = "123Test"; //setup mocked replies when(mockPreferences.keys()).thenReturn(new String[] { SingleObfuscatedConstants.TEST_PROPERTY }); when(mockPreferences.get(eq(SingleObfuscatedConstants.TEST_PROPERTY), isNull(String.class))).thenReturn( testValue).thenReturn( "RESTRICTED::" + PicketBoxObfuscator.encode(testValue)); //create object to test and inject required dependencies ObfuscatedPreferences test = new ObfuscatedPreferences(mockPreferences, SingleObfuscatedConstants.class); //exercise code String actualValue = test.get(SingleObfuscatedConstants.TEST_PROPERTY, null); //verify assertions verify(mockPreferences, times(1)).keys(); verify(mockPreferences, times(1)).put(eq(SingleObfuscatedConstants.TEST_PROPERTY), eq("RESTRICTED::" + PicketBoxObfuscator.encode(testValue))); //2 = 1 time from the constructor and then 1 time from the actual test verify(mockPreferences, times(2)).get(eq(SingleObfuscatedConstants.TEST_PROPERTY), isNull(String.class)); verifyNoMoreInteractions(mockPreferences); Assert.assertEquals(actualValue, testValue); } public void testIntialValueObfuscated() throws Exception { //setup mocks Preferences mockPreferences = mock(Preferences.class); //setup values to be used final String testValue = "123Test"; //setup mocked replies when(mockPreferences.keys()).thenReturn(new String[] { SingleObfuscatedConstants.TEST_PROPERTY }); when(mockPreferences.get(eq(SingleObfuscatedConstants.TEST_PROPERTY), isNull(String.class))).thenReturn( "RESTRICTED::" + PicketBoxObfuscator.encode(testValue)); //create object to test and inject required dependencies ObfuscatedPreferences testObject = new ObfuscatedPreferences(mockPreferences, SingleObfuscatedConstants.class); //exercise code String actualValue = testObject.get(SingleObfuscatedConstants.TEST_PROPERTY, null); //verify assertions verify(mockPreferences, times(1)).keys(); verify(mockPreferences, never()).put(eq(SingleObfuscatedConstants.TEST_PROPERTY), eq("RESTRICTED::" + PicketBoxObfuscator.encode(testValue))); //2 = 1 time from the constructor and then 1 time from the actual test verify(mockPreferences, times(2)).get(eq(SingleObfuscatedConstants.TEST_PROPERTY), isNull(String.class)); verifyNoMoreInteractions(mockPreferences); Assert.assertEquals(actualValue, testValue); } public void testIntialValueBadlyObfuscated() throws Exception { //setup mocks Preferences mockPreferences = mock(Preferences.class); //setup values to be used final String testValue = "123Test"; //setup mocked replies when(mockPreferences.keys()).thenReturn(new String[] { SingleObfuscatedConstants.TEST_PROPERTY }); when(mockPreferences.get(eq(SingleObfuscatedConstants.TEST_PROPERTY), isNull(String.class))).thenReturn( "RESTRICTED::" + testValue).thenReturn("RESTRICTED::" + PicketBoxObfuscator.encode(testValue)); //create object to test and inject required dependencies ObfuscatedPreferences testObject = new ObfuscatedPreferences(mockPreferences, SingleObfuscatedConstants.class); //exercise code String actualValue = testObject.get(SingleObfuscatedConstants.TEST_PROPERTY, null); //verify assertions verify(mockPreferences, times(1)).keys(); verify(mockPreferences, times(1)).put(eq(SingleObfuscatedConstants.TEST_PROPERTY), eq("RESTRICTED::" + PicketBoxObfuscator.encode(testValue))); //2 = 1 time from the constructor and then 1 time from the actual test verify(mockPreferences, times(2)).get(eq(SingleObfuscatedConstants.TEST_PROPERTY), isNull(String.class)); verifyNoMoreInteractions(mockPreferences); Assert.assertEquals(actualValue, testValue); } public void testIntialValueObfuscatedButNotRestricted() throws Exception { //setup mocks Preferences mockPreferences = mock(Preferences.class); //setup values to be used final String testValue = "123Test"; final String testDefaultValue = "Test456"; //setup mocked replies when(mockPreferences.keys()).thenReturn(new String[] { SingleContants.TEST_PROPERTY }); when(mockPreferences.get(eq(SingleContants.TEST_PROPERTY), isNull(String.class))).thenReturn( "RESTRICTED::" + PicketBoxObfuscator.encode(testValue)); //create object to test and inject required dependencies ObfuscatedPreferences testObject = new ObfuscatedPreferences(mockPreferences, SingleContants.class); //exercise code String actualValue1 = testObject.get(SingleContants.TEST_PROPERTY, null); String actualValue2 = testObject.get(SingleObfuscatedConstants.TEST_PROPERTY, testDefaultValue); //verify assertions verify(mockPreferences, times(1)).keys(); //2 = 1 time from the constructor and then 1 time from the actual test verify(mockPreferences, times(2)).get(eq(SingleContants.TEST_PROPERTY), isNull(String.class)); verify(mockPreferences, times(1)).get(eq(SingleObfuscatedConstants.TEST_PROPERTY), isNull(String.class)); verifyNoMoreInteractions(mockPreferences); Assert.assertEquals(actualValue1, testValue); Assert.assertEquals(actualValue2, testDefaultValue); } public void testIntialValueObfuscatedButNotRestrictedPut() throws Exception { //setup mocks Preferences mockPreferences = mock(Preferences.class); //setup values to be used final String testValue = "123Test"; final String testValueAfter = "Test456"; //setup mocked replies when(mockPreferences.keys()).thenReturn(new String[] { SingleContants.TEST_PROPERTY }); when(mockPreferences.get(eq(SingleContants.TEST_PROPERTY), isNull(String.class))).thenReturn( "RESTRICTED::" + PicketBoxObfuscator.encode(testValue), "RESTRICTED::" + PicketBoxObfuscator.encode(testValue), "RESTRICTED::" + PicketBoxObfuscator.encode(testValueAfter)); //create object to test and inject required dependencies ObfuscatedPreferences testObject = new ObfuscatedPreferences(mockPreferences, SingleContants.class); //exercise code String actualValue1 = testObject.get(SingleContants.TEST_PROPERTY, null); testObject.put(SingleContants.TEST_PROPERTY, testValueAfter); String actualValue2 = testObject.get(SingleContants.TEST_PROPERTY, null); //verify assertions verify(mockPreferences, times(1)).keys(); //2 = 1 time from the constructor and then 2 times from the actual test verify(mockPreferences, times(3)).get(eq(SingleContants.TEST_PROPERTY), isNull(String.class)); verify(mockPreferences, times(1)).put(eq(SingleContants.TEST_PROPERTY), eq("RESTRICTED::" + PicketBoxObfuscator.encode(testValueAfter))); verifyNoMoreInteractions(mockPreferences); Assert.assertEquals(actualValue1, testValue); Assert.assertEquals(actualValue2, testValueAfter); } }