/*
 * Copyright (c) 1998, 2021 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 v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.tests.security;

import java.util.Properties;
import org.eclipse.persistence.sessions.Project;
import org.eclipse.persistence.sessions.DatabaseLogin;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.sessions.DatabaseSession;
import org.eclipse.persistence.sessions.factories.SessionManager;
import org.eclipse.persistence.sessions.Session;

/**
 * Tests the database login when no encryption object has been initialized via
 * the setPassword() or setEncryptedPassword() methods.
 *
 * Fix for bug 2700529
 *
 * @author Guy Pelletier
 */
public class DatabaseLoginWithNoEncryptorTest extends AutoVerifyTestCase {
    boolean exceptionOccurred;
    DatabaseSession mySession;
  Session originalSession = null;

    public DatabaseLoginWithNoEncryptorTest() {
        setDescription("Test the login without making a set password call, i.e. no Securable object initialized");
    }

    @Override
    public void reset() {
        if ((mySession != null) && mySession.isConnected()) {
            mySession.logout();// If session is logged in, log it out
        }

        SessionManager.getManager().getSessions().remove(mySession);
        mySession = null;
    }

    @Override
    protected void setup() throws Throwable {
    exceptionOccurred = false;

    originalSession = getSession();

    DatabaseLogin login = new DatabaseLogin();
    login.setPlatform(originalSession.getLogin().getPlatform());
    //this change for making tests pass on oc4j server, suggested by James
    /*
    login.setDriverClassName(originalSession.getLogin().getDriverClassName());
    login.setConnectionString(originalSession.getLogin().getConnectionString());
    */
    login.setConnector(originalSession.getLogin().getConnector());
    Properties properties = new Properties();
    if (originalSession.getLogin().getUserName() != null){
        properties.setProperty("user", originalSession.getLogin().getUserName());
    }
    if (originalSession.getLogin().getPassword() != null){
        properties.setProperty("password", originalSession.getLogin().getPassword());
    }

        login.setProperties(properties);

        mySession = new Project(login).createDatabaseSession();
        mySession.dontLogMessages();
    }

    @Override
    public void test() {
        try {
            mySession.login();
        } catch (Exception e) {
            exceptionOccurred = true;
        }
    }

    @Override
    protected void verify() {
        if (exceptionOccurred) {
            throw new TestErrorException("Exception was caught on login");
        } else if (!mySession.isConnected()) {
            throw new TestWarningException("Session was not connected, but no exception was thrown");
        }
    }
}
