/*******************************************************************************
 * Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
 * This program and the accompanying materials are made available under the 
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Oracle - initial API and implementation from Oracle TopLink
 ******************************************************************************/  
package org.eclipse.persistence.testing.tests.sessionsxml;

import org.eclipse.persistence.testing.framework.AutoVerifyTestCase;
import org.eclipse.persistence.testing.framework.TestErrorException;
import org.eclipse.persistence.internal.sessions.factories.model.SessionConfigs;
import org.eclipse.persistence.internal.sessions.factories.model.session.DatabaseSessionConfig;
import org.eclipse.persistence.sessions.factories.SessionManager;


/**
 * Test that a getPassword() call from the Mapping Workbench to the config
 * model detects unencrypted passwords and then re-stores encrypted on the model.
 *
 * @author Guy Pelletier
 * @version 1.0
 * @date Septmeber 28, 2004
 */
public class MWConfigModelEncryptionTest extends AutoVerifyTestCase {
    DatabaseSessionConfig m_sessionConfig1;
    DatabaseSessionConfig m_sessionConfig2;


    public MWConfigModelEncryptionTest() {
        setDescription("Tests the detection and encryption of a unencrypted password on the config model");
    }

    public void test() throws Exception {
        // Read a session with an unencrypted password
        SessionConfigs m_sessions = SessionManager.getManager().getInternalMWConfigObjects("org/eclipse/persistence/testing/models/sessionsxml/XMLSchemaSession.xml", getClass().getClassLoader());

        // There are 2 sessions in this session.xml file with unencrypted 
        // passwords
        // The first one will preserve the password and test the forced 
        // encryption on the getPassword() call
        m_sessionConfig1 = (DatabaseSessionConfig)m_sessions.getSessionConfigs().firstElement();

        // The second one will blank out the password and test that the 
        // getPassword() call doesn't throw a null pointer exception
        m_sessionConfig2 = (DatabaseSessionConfig)m_sessions.getSessionConfigs().lastElement();
        m_sessionConfig2.getLoginConfig().setEncryptedPassword(null);
    }

    protected void verify() {
        // For the first config test the encryption with an actual password stored
        String password1 = m_sessionConfig1.getLoginConfig().getEncryptedPassword();
        String password2 = m_sessionConfig1.getLoginConfig().getPassword();
        String password3 = m_sessionConfig1.getLoginConfig().getEncryptedPassword();

        if (! password1.equals(password3)) {
            throw new TestErrorException("Get encrypted password returned different values.");
        }
        
        if (password1.equals(password2)) {
            throw new TestErrorException("Get password returned an encrypted password."); 
        }

        // For the second config test the getPassword() call with a null password
        try {
            m_sessionConfig2.getLoginConfig().getPassword();
        } catch (NullPointerException e) {
            throw new TestErrorException("Call to getPassword() with a null password caused a NPE");
        }

    }
}
