/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 */

package org.apache.qpid.server.security.access.management;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import org.apache.qpid.server.security.auth.database.Base64MD5PasswordFilePrincipalDatabase;

import junit.framework.TestCase;

public class AMQUserManagementMBeanTest extends TestCase
{
    private Base64MD5PasswordFilePrincipalDatabase _database;
    private AMQUserManagementMBean _amqumMBean;

    private static final String _QPID_HOME =  System.getProperty("QPID_HOME");

    private static final String USERNAME = "testuser";
    private static final String PASSWORD = "password";
    private static final String JMXRIGHTS = "admin";
    private static final String TEMP_PASSWORD_FILE_NAME = "tempPasswordFile.tmp";
    private static final String TEMP_JMXACCESS_FILE_NAME = "tempJMXAccessFile.tmp";

    @Override
    protected void setUp() throws Exception
    {
        assertNotNull("QPID_HOME not set", _QPID_HOME);

        _database = new Base64MD5PasswordFilePrincipalDatabase();
        _amqumMBean = new AMQUserManagementMBean();
    }

    @Override
    protected void tearDown() throws Exception
    {
        File testFile = new File(_QPID_HOME + File.separator + TEMP_JMXACCESS_FILE_NAME + ".tmp");
        if (testFile.exists())
        {
            testFile.delete();
        }

        testFile = new File(_QPID_HOME + File.separator + TEMP_JMXACCESS_FILE_NAME + ".old");
        if (testFile.exists())
        {
            testFile.delete();
        }

        testFile = new File(_QPID_HOME + File.separator + TEMP_PASSWORD_FILE_NAME + ".tmp");
        if (testFile.exists())
        {
            testFile.delete();
        }

        testFile = new File(_QPID_HOME + File.separator + TEMP_PASSWORD_FILE_NAME + ".old");
        if (testFile.exists())
        {
            testFile.delete();
        }
    }

    public void testDeleteUser()
    {
        loadTestPasswordFile();
        loadTestAccessFile();

        boolean deleted = false;

        try
        {
            deleted = _amqumMBean.deleteUser(USERNAME);
        }
        catch(Exception e){
            fail("Unable to delete user: " + e.getMessage());
        }

        assertTrue(deleted);
    }
 
    
    // ============================ Utility methods =========================

    private void loadTestPasswordFile()
    {
        try
        {
            File tempPasswordFile = new File(_QPID_HOME + File.separator + TEMP_PASSWORD_FILE_NAME);
            if (tempPasswordFile.exists())
            {
                tempPasswordFile.delete();
            }
            tempPasswordFile.deleteOnExit();

            BufferedWriter passwordWriter = new BufferedWriter(new FileWriter(tempPasswordFile));
            passwordWriter.write(USERNAME + ":" + PASSWORD);
            passwordWriter.newLine();
            passwordWriter.flush();

            _database.setPasswordFile(tempPasswordFile.toString());
            _amqumMBean.setPrincipalDatabase(_database);
        }
        catch (IOException e)
        {
            fail("Unable to create test password file: " + e.getMessage());
        }
    }

    private void loadTestAccessFile()
    {
        try
        {
            File tempAccessFile = new File(_QPID_HOME + File.separator + TEMP_JMXACCESS_FILE_NAME);
            if (tempAccessFile.exists())
            {
                tempAccessFile.delete();
            }
            tempAccessFile.deleteOnExit();

            BufferedWriter accessWriter = new BufferedWriter(new FileWriter(tempAccessFile));
            accessWriter.write(USERNAME + "=" + JMXRIGHTS);
            accessWriter.newLine();
            accessWriter.flush();

            _amqumMBean.setAccessFile(tempAccessFile.toString());
        }
        catch (Exception e)
        {
            fail("Unable to create test access file: " + e.getMessage());
        }
    }
}
