/*******************************************************************************
 * 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.exceptions.ValidationException;
import org.eclipse.persistence.sessions.DatabaseSession;
import org.eclipse.persistence.testing.framework.AutoVerifyTestCase;
import org.eclipse.persistence.testing.framework.TestErrorException;
import org.eclipse.persistence.sessions.factories.SessionManager;
import org.eclipse.persistence.sessions.factories.XMLSessionConfigLoader;


/**
 * Test that a NO_SESSION_FOUND exception is caught on a getSession call to the
 * SessionManager for a session that does not exist.
 *
 * Must be using the new loader, that is the XMLSessionConfigLoader and not
 * the deprecated XMLLoader.
 *
 * Bug #3821922
 *
 * @author Guy Pelletier
 * @version 1.0
 * @date September 27, 2004
 */
public class SessionManagerGetSessionNotFoundTest extends AutoVerifyTestCase {
    DatabaseSession m_session;
    ValidationException m_exception;

    public SessionManagerGetSessionNotFoundTest() {
        setDescription("Tests that the proper exception is thrown when a session is not found in the session.xml file");
    }

    public void reset() {
        if ((m_session != null) && m_session.isConnected()) {
            m_session.logout();
            SessionManager.getManager().getSessions().remove("SessionShouldNotBeFound");
            m_session = null;
        }
    }

    protected void setup() {
        m_session = null;
        m_exception = null;
    }

    public void test() {
        try {
            XMLSessionConfigLoader loader = new XMLSessionConfigLoader("org/eclipse/persistence/testing/models/sessionsxml/XMLSchemaSession.xml");
            m_session = (DatabaseSession)SessionManager.getManager().getSession(loader, "SessionShouldNotBeFound", getClass().getClassLoader(), false, false);
        } catch (ValidationException e) {
            m_exception = e;
        }
    }

    protected void verify() {
        if (m_exception == null) {
            throw new TestErrorException("No exception was caught on the getSession call");
        } else if (m_exception.getErrorCode() != ValidationException.NO_SESSION_FOUND) {
            throw new TestErrorException("The wrong exception was caught. Caught (" + m_exception.getErrorCode() + "), wanted (" + ValidationException.NO_SESSION_FOUND + ")");
        }
    }
}
