/*******************************************************************************
 * 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:
 *     dminsky - initial API and implementation
 ******************************************************************************/ 
package org.eclipse.persistence.testing.tests.queries;

import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.exceptions.*;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.sessions.server.*;

/**
 * Test to ensure that a connection is released by a ServerSession after a query
 * is executed with a query timeout value set, and a cursor is returned.
 * EL Bug 244241 - connection not released on query timeout when cursor used
 * @author dminsky
 */
public class QueryTimeoutConnectionReleasedTest extends TestCase {

    protected boolean queryTimeoutExceeded;
    protected int preConnectionsAvailable;
    protected int postConnectionsAvailable;
    protected ServerSession serverSession;

    public QueryTimeoutConnectionReleasedTest() {
        setDescription("Test the ServerSession releases pooled connections with a query returning a cursor and query timeout set");
    }
    
    public void setup() {
        preConnectionsAvailable = 0;
        postConnectionsAvailable = 0;
        queryTimeoutExceeded = false;
        serverSession = (ServerSession)getSession().getProject().createServerSession(5,5);
        DatabaseLogin clonedLogin = (DatabaseLogin) getSession().getLogin().clone();
        serverSession.setLogin(clonedLogin);
        serverSession.login();
    }
    
    public void test() {
        if (getSession().getPlatform().isSymfoware()) {
            throwWarning("Test QueryTimeoutConnectionReleasedTest skipped for this platform, "
                    + "the driver does not support query timeout. (bug 304905)");
        }
        if (getSession().getPlatform().isMaxDB()) {
            throwWarning("Test QueryTimeoutConnectionReleasedTest skipped for this platform, "
                    + "the driver does not support query timeout. (bug 326503)");
        }
        if (getSession().getPlatform().isHANA()) {
            throwWarning("Test QueryTimeoutConnectionReleasedTest skipped for this platform, "
                    + "the driver does not support query timeout. (bug 384135)");
        }
        preConnectionsAvailable = serverSession.getReadConnectionPool().getConnectionsAvailable().size();
        try {
            DataReadQuery query = new DataReadQuery();
            String sqlString = "SELECT SUM(e.EMP_ID) from EMPLOYEE e , EMPLOYEE b, EMPLOYEE c, EMPLOYEE d, EMPLOYEE f, EMPLOYEE g, EMPLOYEE h";
            query.setSQLString(sqlString);
            query.setQueryTimeout(1);
            query.useCursoredStream(1, 1);
            serverSession.acquireClientSession().executeQuery(query);
        } catch (Exception e) {
            if (e instanceof DatabaseException) {
                queryTimeoutExceeded = true;
            }
        } finally {
            postConnectionsAvailable = serverSession.getReadConnectionPool().getConnectionsAvailable().size();
        }
    }
    
    public void verify() {
        // It is expected that the query timeout was exceeded, and also the number of connections available after the exception is the same as before
        if (queryTimeoutExceeded) {
            if (preConnectionsAvailable != postConnectionsAvailable) {
                throw new TestErrorException("Number of connections available in pool is: " + postConnectionsAvailable + " expected: " + preConnectionsAvailable);
            }
        } else {
            throw new TestErrorException("Query timeout was not exceeded, this is required for correct testing");
        }
    }

	public void reset() {
		if (this.serverSession != null) {
			serverSession.logout();
			serverSession.release();
		}
	}

}
