/*
* RHQ Management Platform
* Copyright (C) 2005-2008 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.enterprise.communications.util;
import java.util.ArrayList;
import java.util.List;
import java.util.prefs.Preferences;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.enterprise.communications.util.prefs.PreferencesUpgrade;
import org.rhq.enterprise.communications.util.prefs.PreferencesUpgradeStep;
/**
* Tests ugprading preferences.
*
* @author John Mazzitelli
*/
@Test
public class PreferencesUpgradeTest {
private static final String CONFIG_SCHEMA_VERSION_KEY_NAME = "test-schema-ver";
private static final String KEY_NAME = "test-node";
private Preferences m_testRoot;
/**
* Gets the root test node.
*
* @throws Exception
*/
@BeforeMethod
public void setUp() throws Exception {
m_testRoot = Preferences.userRoot().node("upgrade-test");
m_testRoot.clear();
}
/**
* Clears the root test node.
*
* @throws Exception
*/
@AfterMethod
public void tearDown() throws Exception {
m_testRoot.removeNode();
}
/**
* Tests simple upgrade.
*
* @throws Exception
*/
public void testUpgrade() throws Exception {
ArrayList<PreferencesUpgradeStep> steps = new ArrayList<PreferencesUpgradeStep>();
assert m_testRoot.getInt(CONFIG_SCHEMA_VERSION_KEY_NAME, -1) == -1;
// with no steps, nothing is upgraded, version remains unset
new Upgrade(steps).upgrade(m_testRoot, 2);
assert m_testRoot.getInt(CONFIG_SCHEMA_VERSION_KEY_NAME, -1) == -1;
// even with a version set, with no steps there is nothing to upgrade, so version goes unchanged
m_testRoot.putInt(CONFIG_SCHEMA_VERSION_KEY_NAME, 0);
new Upgrade(steps).upgrade(m_testRoot, 2);
assert m_testRoot.getInt(CONFIG_SCHEMA_VERSION_KEY_NAME, 0) == 0;
// add two upgrade steps, to version 1 and to version 2
steps.add(new UpgradeStep(1));
steps.add(new UpgradeStep(2));
// show that nothing happens when version is same as the last step version
m_testRoot.putInt(CONFIG_SCHEMA_VERSION_KEY_NAME, 2);
new Upgrade(steps).upgrade(m_testRoot, 2);
assert m_testRoot.getInt(CONFIG_SCHEMA_VERSION_KEY_NAME, -1) == 2; // stays at 2
assert !keyExists(KEY_NAME);
assert !keyExists(KEY_NAME + "1");
assert !keyExists(KEY_NAME + "2");
// show that nothing happens when version is higher than the last step version
m_testRoot.putInt(CONFIG_SCHEMA_VERSION_KEY_NAME, 5);
new Upgrade(steps).upgrade(m_testRoot, 2);
assert m_testRoot.getInt(CONFIG_SCHEMA_VERSION_KEY_NAME, -1) == 5; // stays at 5
assert !keyExists(KEY_NAME);
assert !keyExists(KEY_NAME);
assert !keyExists(KEY_NAME + "1");
assert !keyExists(KEY_NAME + "2");
// show that we can upgrade thru some but not all steps
m_testRoot.putInt(CONFIG_SCHEMA_VERSION_KEY_NAME, 0);
new Upgrade(steps).upgrade(m_testRoot, 1); // we can go to 2 but we only want to go to 1
assert m_testRoot.getInt(CONFIG_SCHEMA_VERSION_KEY_NAME, -1) == 1; // upgraded to 1
assert keyExists(KEY_NAME);
assert keyExists(KEY_NAME + "1");
assert !keyExists(KEY_NAME + "2");
assert m_testRoot.get(KEY_NAME, "").equals("MODIFIED 1");
assert m_testRoot.get(KEY_NAME + "1", "").equals("ADDED 1");
// show that we can upgrade to the highest known version
m_testRoot.clear();
assert !keyExists(KEY_NAME); // just me being paranoid - makes sure we cleared the previous test
m_testRoot.putInt(CONFIG_SCHEMA_VERSION_KEY_NAME, 0);
new Upgrade(steps).upgrade(m_testRoot, 2);
assert m_testRoot.getInt(CONFIG_SCHEMA_VERSION_KEY_NAME, -1) == 2; // upgraded to 2
assert keyExists(KEY_NAME);
assert keyExists(KEY_NAME + "1");
assert keyExists(KEY_NAME + "2");
assert m_testRoot.get(KEY_NAME, "").equals("MODIFIED 2");
assert m_testRoot.get(KEY_NAME + "1", "").equals("ADDED 1");
assert m_testRoot.get(KEY_NAME + "2", "").equals("ADDED 2");
// just shows a bunch of steps to confirm we can do more than 2
// and for giggles, show that we can skip version numbers
steps.add(new UpgradeStep(2));
steps.add(new UpgradeStep(3));
steps.add(new UpgradeStep(5)); // skips 4
steps.add(new UpgradeStep(6));
steps.add(new UpgradeStep(7));
m_testRoot.clear();
assert !keyExists(KEY_NAME); // just me being paranoid - makes sure we cleared the previous test
m_testRoot.putInt(CONFIG_SCHEMA_VERSION_KEY_NAME, 0);
new Upgrade(steps).upgrade(m_testRoot, 7);
assert m_testRoot.getInt(CONFIG_SCHEMA_VERSION_KEY_NAME, -1) == 7; // upgraded to 7
assert keyExists(KEY_NAME);
assert keyExists(KEY_NAME + "1");
assert keyExists(KEY_NAME + "2");
assert keyExists(KEY_NAME + "3");
assert !keyExists(KEY_NAME + "4"); // notice we don't have this one since we stepped over 4
assert keyExists(KEY_NAME + "5");
assert keyExists(KEY_NAME + "6");
assert keyExists(KEY_NAME + "7");
assert m_testRoot.get(KEY_NAME, "").equals("MODIFIED 7");
assert m_testRoot.get(KEY_NAME + "1", "").equals("ADDED 1");
assert m_testRoot.get(KEY_NAME + "2", "").equals("ADDED 2");
assert m_testRoot.get(KEY_NAME + "3", "").equals("ADDED 3");
assert m_testRoot.get(KEY_NAME + "5", "").equals("ADDED 5");
assert m_testRoot.get(KEY_NAME + "6", "").equals("ADDED 6");
assert m_testRoot.get(KEY_NAME + "7", "").equals("ADDED 7");
// show that we can upgrade to a number larger than the last step
m_testRoot.clear();
assert !keyExists(KEY_NAME); // just me being paranoid - makes sure we cleared the previous test
m_testRoot.putInt(CONFIG_SCHEMA_VERSION_KEY_NAME, 0);
new Upgrade(steps).upgrade(m_testRoot, 9); // we ask to go to 9 but our steps only go up to 7
assert m_testRoot.getInt(CONFIG_SCHEMA_VERSION_KEY_NAME, -1) == 7; // upgraded to 7
assert keyExists(KEY_NAME);
assert keyExists(KEY_NAME + "1");
assert keyExists(KEY_NAME + "2");
assert keyExists(KEY_NAME + "3");
assert !keyExists(KEY_NAME + "4"); // notice we don't have this one since we stepped over 4
assert keyExists(KEY_NAME + "5");
assert keyExists(KEY_NAME + "6");
assert keyExists(KEY_NAME + "7");
assert m_testRoot.get(KEY_NAME, "").equals("MODIFIED 7");
assert m_testRoot.get(KEY_NAME + "1", "").equals("ADDED 1");
assert m_testRoot.get(KEY_NAME + "2", "").equals("ADDED 2");
assert m_testRoot.get(KEY_NAME + "3", "").equals("ADDED 3");
assert m_testRoot.get(KEY_NAME + "5", "").equals("ADDED 5");
assert m_testRoot.get(KEY_NAME + "6", "").equals("ADDED 6");
assert m_testRoot.get(KEY_NAME + "7", "").equals("ADDED 7");
}
/**
* Checks to make sure the key exists (is not null).
*
* @param key
*
* @return <code>true</code> if the key exists, <code>false</code> if it does not exist or is null
*/
private boolean keyExists(String key) {
return m_testRoot.get(key, null) != null;
}
/**
* Test upgrade step that upgrades to a particular version number specified by the constructor.
*
* @author John Mazzitelli
*/
private class UpgradeStep extends PreferencesUpgradeStep {
private int m_version;
/**
* Builds this test step so it supports upgrading to the given version number.
*
* @param version_supported
*/
public UpgradeStep(int version_supported) {
m_version = version_supported;
}
/**
* @see PreferencesUpgradeStep#getSupportedConfigurationSchemaVersion()
*/
public int getSupportedConfigurationSchemaVersion() {
return m_version;
}
/**
* @see PreferencesUpgradeStep#upgrade(java.util.prefs.Preferences)
*/
public void upgrade(Preferences preferences) {
preferences.put(KEY_NAME + m_version, "ADDED " + m_version);
preferences.put(KEY_NAME, "MODIFIED " + m_version);
}
}
/**
* An upgrade class that we use in our tests..
*/
private class Upgrade extends PreferencesUpgrade {
/**
* @see PreferencesUpgrade#PreferencesUpgrade(List)
*/
public Upgrade(List<PreferencesUpgradeStep> upgrade_steps) {
super(upgrade_steps);
}
/**
* @see PreferencesUpgrade#getConfigurationSchemaVersionPreference()
*/
public String getConfigurationSchemaVersionPreference() {
return CONFIG_SCHEMA_VERSION_KEY_NAME;
}
}
}