cz.muni.ics.remsig.impl.CertificateManagerImplTest.java Source code

Java tutorial

Introduction

Here is the source code for cz.muni.ics.remsig.impl.CertificateManagerImplTest.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package cz.muni.ics.remsig.impl;

import cz.muni.ics.remsig.CertificateManager;
import cz.muni.ics.remsig.RemSigServlet;
//import static cz.muni.ics.remsig.RemSigServlet.CONFIG_FILE;
import cz.muni.ics.remsig.common.XmlParser;
import static cz.muni.ics.remsig.impl.CertificateManagerImpl.STATE_EXPIRED;
import static cz.muni.ics.remsig.impl.CertificateManagerImpl.STATE_NOT_YET_VALID;
import static cz.muni.ics.remsig.impl.CertificateManagerImpl.STATE_PASSWORD_RESET;
import static cz.muni.ics.remsig.impl.CertificateManagerImpl.STATE_REVOKED;
import static cz.muni.ics.remsig.impl.CertificateManagerImpl.STATE_SUSPENDED;
import static cz.muni.ics.remsig.impl.CertificateManagerImpl.STATE_VALID;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.KeyStore;
import java.security.Security;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.sql.Array;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Properties;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
//import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.sql.DataSource;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.tomcat.dbcp.dbcp.BasicDataSource;
//import org.apache.tomcat.util.codec.binary.Base64;
import org.bouncycastle.util.encoders.Base64;
//import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
//import org.apache.commons.dbcp.BasicDataSource;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jce.provider.X509CertificateObject;
//import org.bouncycastle.util.encoders.Base64;
import org.dbunit.Assertion;
import org.dbunit.DBTestCase;
import org.dbunit.IDatabaseTester;
import org.dbunit.JdbcDatabaseTester;
import org.dbunit.PropertiesBasedJdbcDatabaseTester;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import org.dbunit.operation.DatabaseOperation;
import org.eclipse.jdt.internal.compiler.ast.SwitchStatement;
import org.junit.After;
import org.junit.AfterClass;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import static org.mockito.Mockito.mock;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.w3c.dom.Attr;
import org.w3c.dom.CDATASection;
import org.w3c.dom.Comment;
import org.w3c.dom.DOMConfiguration;
import org.w3c.dom.DOMException;
import org.w3c.dom.DOMImplementation;

import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.DocumentType;
import org.w3c.dom.Element;
import org.w3c.dom.EntityReference;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.ProcessingInstruction;
import org.w3c.dom.Text;
import org.w3c.dom.UserDataHandler;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSSerializer;

import java.io.File;
import java.nio.charset.Charset;
import java.sql.DatabaseMetaData;
import static java.sql.Types.BLOB;
import java.util.LinkedList;
import java.util.List;
import org.w3c.dom.Document;
import org.w3c.dom.*;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.core.IsNot.not;
import org.junit.Assert;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

// pridat db unit k jdbctemple 
// spojenie jdbcTemplate a db unitpopripade nieco ine
/*
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import static org.junit.Assert.*;
 import cz.muni.ics.remsig.common.XmlParser;
 import static cz.muni.ics.remsig.common.XmlParser.ELEM_ERROR;
 import static cz.muni.ics.remsig.common.XmlParser.ELEM_ROOT_REMSIG;
 import static cz.muni.ics.remsig.impl.Audit.*;
 import static cz.muni.ics.remsig.impl.Authz.*;
 import cz.muni.ics.remsig.impl.CertificateManagerImpl;
 import static cz.muni.ics.remsig.impl.CertificateManagerImpl.CONFIG_FILE;
 import static cz.muni.ics.remsig.impl.CertificateManagerImpl.STATE_EXPIRED;
 import static cz.muni.ics.remsig.impl.CertificateManagerImpl.STATE_NOT_YET_VALID;
 import static cz.muni.ics.remsig.impl.CertificateManagerImpl.STATE_PASSWORD_RESET;
 import static cz.muni.ics.remsig.impl.CertificateManagerImpl.STATE_REVOKED;
 import static cz.muni.ics.remsig.impl.CertificateManagerImpl.STATE_SUSPENDED;
 import static cz.muni.ics.remsig.impl.CertificateManagerImpl.STATE_VALID;
 import cz.muni.ics.remsig.impl.Client;
 import cz.muni.ics.remsig.impl.ErrorCode;
 import cz.muni.ics.remsig.impl.Person;
 import cz.muni.ics.remsig.impl.RemSigException;
 import cz.muni.ics.remsig.impl.RemSigSession;
 import cz.muni.ics.remsig.impl.SignerImpl;
 import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.security.Security;
 import java.security.cert.CertificateException;
 import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
 import java.util.Properties;
 import java.util.Set;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
 import javax.servlet.annotation.WebServlet;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import org.bouncycastle.jce.provider.BouncyCastleProvider;
 import org.bouncycastle.util.encoders.Base64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.w3c.dom.Document;
 */
/**
 *
 * @author Miroslav
 */
public class CertificateManagerImplTest extends DBTestCase {

    private CertificateManagerImpl manager;
    private Properties configuration;
    public static final String CONFIG_FILE = "/etc/remsig/remsig.properties";

    private final static org.slf4j.Logger logger = LoggerFactory.getLogger(CertificateManagerImplTest.class);
    private IDatabaseTester databaseTester;
    private IDatabaseConnection dbUnitConnection;
    private Connection connection;
    private java.sql.Statement statement;

    TestManager testManager = new TestManager();

    org.w3c.dom.Document testDocument1 = null;
    org.w3c.dom.Document testDocument2 = null;
    org.w3c.dom.Document testDocument3 = null;
    org.w3c.dom.Document testDocument4 = null;
    org.w3c.dom.Document testDocument5 = null;
    org.w3c.dom.Document testDocument6 = null;
    org.w3c.dom.Document testDocument7 = null;
    org.w3c.dom.Document testDocument8 = null;
    org.w3c.dom.Document testDocument9 = null;

    Person anderson = new Person(1);
    Person bobaFet = new Person(2);
    Person cyril = new Person(3);
    Person daryl = new Person(4);
    Person eva = new Person(5);
    Person frank = new Person(6);
    Person gregor = new Person(7);
    Person helena = new Person(8);
    Person igor = new Person(9);
    Person jane = new Person(10);

    String andersonDefPass = "123456";
    String bobaFetDefPass = "bobaFet1";
    String cyrilDefPass = "654321";
    String darylDefPass = "g8r4d2";
    String evaDefPass = "strongpassword";
    String frankDefPass = "frankrulles";
    String gregorDefPass = "password";
    String helenaDefPass = "";
    String igorDefPass = "forever";
    String janeDefPass = "h86fds";

    int andersonCerId = 0;
    int bobaFetCerId = 0;
    int cyrilCerId = 0;

    private String initXmlDoc = "NewInitDatabase.xml"; // dataset
    private String workingDatabase = "NewInitDatabase.xml";
    //private String initXmlDoc = "initDatabase.xml"; // dataset
    //private String workingDatabase = "initDatabase.xml";
    private ITable expectedTable = null;
    @Mock
    Service service;

    @Override
    protected IDataSet getDataSet() throws Exception {

        return new FlatXmlDataSetBuilder().build(new FileInputStream(initXmlDoc));

    }

    public CertificateManagerImplTest() {

    }

    public CertificateManagerImplTest(String name) {
        super(name);
        System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, "com.mysql.jdbc.Driver"); // in case of trouble this need to be changedcom.mysql.jdbc.Driver

        System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL,
                "jdbc:mysql://localhost:3306/Remsig?zeroDateTimeBehavior=convertToNull");
        System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, "root");
        System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, "");
        // 
    }

    @BeforeClass
    public static void setUpClass() {
    }

    @AfterClass
    public static void tearDownClass() {
    }

    @Override
    protected DatabaseOperation getSetUpOperation() throws Exception {
        return DatabaseOperation.DELETE_ALL;
    }

    @Before
    public void setUp() throws Exception {

        getSetUpOperation();

        configuration = new Properties();
        try (FileInputStream input = new FileInputStream(CONFIG_FILE)) {
            configuration.load(input);
        } catch (FileNotFoundException ex) {
            throw new RemSigException("Configuration properties file not found", ex, ErrorCode.ERROR258EN);
        } catch (IOException ex) {
            throw new RemSigException("Error while loading configuration properties", ex, ErrorCode.ERROR259EN);
        }
        databaseTester = new JdbcDatabaseTester("com.mysql.jdbc.Driver",
                "jdbc:mysql://localhost:3306/Remsig?zeroDateTimeBehavior=convertToNull", "root", "");
        //        
        IDataSet dataSet = new FlatXmlDataSetBuilder().setColumnSensing(true)
                .build(new FileInputStream(initXmlDoc));

        //databaseTester.setSetUpOperation(DatabaseOperation.DELETE_ALL); //*89 this is supposed to be here but it is anoying
        databaseTester.setTearDownOperation(DatabaseOperation.DELETE_ALL);
        databaseTester.setDataSet(dataSet);
        //databaseTester.getDataSet().getTable("credentials");
        databaseTester.setSetUpOperation(DatabaseOperation.REFRESH);
        databaseTester.onSetup();
        dbUnitConnection = databaseTester.getConnection();
        connection = dbUnitConnection.getConnection();

        statement = connection.createStatement();
        //expectedTable = statement.execute("SELECT * FROM credentials");
        expectedTable = dataSet.getTable("credentials");

    }

    @After
    public void tearDown() throws Exception {
        databaseTester.setTearDownOperation(DatabaseOperation.DELETE_ALL);
        databaseTester.onTearDown();

        //databaseTester.onSetup();

    }

    /**
     * Test of setJdbcTemplate method, of class CertificateManagerImpl.
     */
    @Test
    public void testSetJdbcTemplate() {
        //System.out.println("setJdbcTemplate");
        /*JdbcTemplate jdbcTemplate = null;
          CertificateManagerImpl instance = new CertificateManagerImpl();
          instance.setJdbcTemplate(jdbcTemplate); */ // *89
        // TODO review the generated test code and remove the default call to fail.
        //        fail("The test case is a prototype.");
    }

    /**
     * Test of loadQualifiedAuthorities method, of class CertificateManagerImpl.
     */
    @Test
    public void testLoadQualifiedAuthorities() throws Exception {
        //System.out.println("loadQualifiedAuthorities");
        CertificateManagerImpl instance = new CertificateManagerImpl(new Properties());
        // instance.loadQualifiedAuthorities();
        // TODO review the generated test code and remove the default call to fail.
        //fail("The test case is a prototype.");
    }

    /**
     * Test of generateRequest method, of class CertificateManagerImpl.
     */
    @Test
    public void testGenerateRequest() throws Exception {
        docInit();

        //generateXmlForSetUp()   ;
        // one way to clear database 
        databaseTester.setSetUpOperation(DatabaseOperation.DELETE_ALL);
        databaseTester.onSetup();

        org.w3c.dom.Document testDocument = null; //new org.w3c.dom.Document() {};      
        CertificateManagerImpl instance = new CertificateManagerImpl();
        configuration = new Properties();

        try (FileInputStream input = new FileInputStream(CONFIG_FILE)) {
            configuration.load(input);
        } catch (FileNotFoundException ex) {
            throw new RemSigException("Configuration properties file not found", ex, ErrorCode.ERROR258EN);
        } catch (IOException ex) {
            throw new RemSigException("Error while loading configuration properties", ex, ErrorCode.ERROR259EN);
        }
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        manager = new CertificateManagerImpl(configuration);
        manager.setJdbcTemplate((JdbcTemplate) ac.getBean("jdbcTemplate"));
        instance.setJdbcTemplate((JdbcTemplate) ac.getBean("jdbcTemplate"));
        Security.addProvider(new BouncyCastleProvider());

        Person person = new Person(5);
        String password = "weakpassword";

        int numberOfInsertedRecords = 5;

        ITable newTable = databaseTester.getDataSet().getTable("credentials");

        // inserting into empty database 
        try {
            // // *89 if properties is null hadze to nullpoiter exception bez poriadneje hlasky                       
            testDocument = manager.generateRequest(person, password);
            testDocument1 = manager.generateRequest(new Person(83512), "K845F234J98");
            testDocument2 = manager.generateRequest(new Person(7), "mIKp443SDJI");
            testDocument3 = manager.generateRequest(new Person(6), password);
            testDocument4 = manager.generateRequest(person, password);
            try {
                manager.generateRequest(null, "somepass");
                manager.generateRequest(person, null);
                manager.generateRequest(null, null);
            } catch (NullPointerException e) {
                // *89Note CertificateManger is not chceking for null values on lowest level later on is catching in with broad exceptio
            }

            ResultSet r = statement.executeQuery("SELECT COUNT(*) AS rowcount FROM credentials");
            r.next();
            int count = r.getInt("rowcount");

            assertEquals("Inserting into empty database failed either somerecords "
                    + "werent inserted or some null value were" + "expected count" + numberOfInsertedRecords
                    + "row value " + count, numberOfInsertedRecords, count);

            IDataSet dataSet = new FlatXmlDataSetBuilder().build(new FileInputStream(workingDatabase));
            databaseTester.setDataSet(dataSet);
            databaseTester.setSetUpOperation(DatabaseOperation.REFRESH);
            databaseTester.onSetup();

            r = statement.executeQuery("SELECT COUNT(*) AS newRowCount FROM credentials");
            r.next();
            int finalRowCount = r.getInt("newRowCount") + numberOfInsertedRecords;
            // inserting addition request

            testDocument5 = manager.generateRequest(person, "greatPass");
            testDocument6 = manager.generateRequest(new Person(83512), "K845F234J98");
            testDocument7 = manager.generateRequest(new Person(8), "mIKp443SDJI");
            manager.generateRequest(new Person(9), "greatPass");
            manager.generateRequest(person, "greatPass");
            try {
                manager.generateRequest(null, "somepass");
                manager.generateRequest(person, null);
                manager.generateRequest(null, null);
            } catch (NullPointerException e) {
                // *89Note CertificateManger is not chceking for null values on lowest level later on is catching in with broad exceptio
            }
            r = statement.executeQuery("SELECT COUNT(*) AS rowcount FROM credentials");
            r.next();
            count = r.getInt("rowcount");
            assertEquals(finalRowCount, count);
            r = statement.executeQuery(
                    "SELECT userID,private_key,request,pubkey_hash,salt, key_backup" + " FROM credentials");

            String[] dataBaseEntry = new String[] { "userID", "private_key", "pubkey_hash", "salt", "key_backup" };
            chcekNullValues(r, dataBaseEntry);
            r.close();

        } catch (RemSigException ex) {
            System.out.println("remsign exception was thrown while generating request" + ex);
        }

        //extractDocIntoXml("output.xml", testDocument);

    }

    @Test
    public void testImportPKCS12() throws Exception {
        docInit();
        databaseTester.setSetUpOperation(DatabaseOperation.DELETE_ALL);
        databaseTester.onSetup();
        // to do try generating new p12 certificate 
        // load xml file there seems to be a lot of work done with them its in output2.xml and it is your certificate
        // generate 3 or 4 certificates by certificate autority for testing 
        // xml file will be uploaded with 10 generated person id 1-10

        //*89 to note doesnt link certificate with generate request and it was my understanding that this is supposed to happen
        /*
        posiible error but could be fixed by loading from xml file instead of steady p12 file
            
        */

        /*   ResultSet r = statement.executeQuery("SELECT COUNT(*) AS rowcount FROM credentials");
        r.next();
        int count = r.getInt("rowcount");
          System.out.println("MIRO  "+ count);
          */

        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        manager = new CertificateManagerImpl(configuration);
        manager.setJdbcTemplate((JdbcTemplate) ac.getBean("jdbcTemplate"));
        Security.addProvider(new BouncyCastleProvider());

        /**
         * Standard for loading p12 files 
         * In order to test multiple p12 certificates it is nessacery to set proper 
         * name and pass to certificates they are not included in any files
         * 
         */

        //String xmlP12 = LoadPKCS12("output2.xml");
        //manager.importPKCS12(anderson, xmlP12, andersonDefPass, "123456");

        // one and 2 are the same certificates 
        String p12Certificate1 = loadPKCS12("TestingCertificates/newSsl/sslcert/sub1-cert.p12");
        String p12Certificate2 = loadPKCS12("TestingCertificates/newSsl/sslcert/sub1-cert.p12");

        // In case of multiple certificates to test

        String p12Certificate3 = loadPKCS12("TestingCertificates/newSsl/sslcert/sub2-cert.p12");
        String p12Certificate4 = loadPKCS12("TestingCertificates/newSsl/sslcert/sub3-cert.p12");
        String p12Certificate5 = loadPKCS12("mine.p12");
        String p12Certificate6 = loadPKCS12("mine.p12");

        String p12passToCer3 = "123456";
        String p12passToCer4 = "123456";
        String p12passToCer5 = "123456";
        String p12passToCer6 = "changeit";

        String p12passToCer1 = "123456";
        String p12passToCer2 = "123456";

        /** 
         * Test with one working certificate 
         */

        //testDocument2 =  manager.importPKCS12(bobaFet, p12Certificate5, bobaFetDefPass, p12passToCer5);

        testDocument1 = manager.importPKCS12(anderson, p12Certificate1, andersonDefPass, p12passToCer1);
        testDocument2 = manager.importPKCS12(bobaFet, p12Certificate2, bobaFetDefPass, p12passToCer2);

        /* *89 to delete just for testing
            
            
        */
        testDocument3 = manager.importPKCS12(cyril, p12Certificate3, cyrilDefPass, p12passToCer3);
        testDocument4 = manager.importPKCS12(daryl, p12Certificate4, darylDefPass, p12passToCer4);

        int doc1 = extractRequestIdFromXmlDoc(testDocument1);
        int doc2 = extractRequestIdFromXmlDoc(testDocument2);

        ResultSet r = statement.executeQuery("SELECT userId, certificate, private_key, dn, serial, issuer,"
                + "expiration_from, expiration_to, pubkey_hash, key_backup, salt,"
                + "chain FROM credentials WHERE (userId = 1 AND id = " + doc1 + ") OR (userId = 2 AND id = " + doc2
                + ") ");

        String[] dataBaseEntry = new String[] { "userId", "certificate", "private_key", "dn", "serial", "issuer",
                "expiration_from", "expiration_to", "pubkey_hash", "key_backup", "salt", "chain" };
        chcekNullValues(r, dataBaseEntry);
        r.close();

        /**
         * Throws error instead of some reasonable exemption unreasonable error
         * maybe rewrite using catch error  
         */
        /*
        try {
                manager.importPKCS12(anderson, p12passToCer2, null, p12passToCer2);
                manager.importPKCS12(null, p12passToCer2, andersonDefPass, p12passToCer2);
                manager.importPKCS12(anderson, null, andersonDefPass, p12passToCer2);
                manager.importPKCS12(anderson, p12passToCer2, andersonDefPass, p12passToCer2);
                manager.importPKCS12(anderson, p12passToCer2, andersonDefPass, null);
                manager.importPKCS12(null, p12passToCer2, null, p12passToCer2);
                manager.importPKCS12(anderson, null, andersonDefPass, null);
                manager.importPKCS12(null, null, null, null);
                                       
                
                
        } catch (NullPointerException e) {
        fail("Import with null values wasnt catched ");
        }
        */

        ResultSet r1 = statement.executeQuery("SELECT certificate,dn, serial, issuer,"
                + "expiration_from, expiration_to" + " FROM credentials WHERE (userId = 1 AND id = " + doc1
                + ") OR (userId = 2 AND id = " + doc2 + ") ");

        String[] dataBaseEntry1 = new String[] { "certificate", "dn", "serial", "issuer", "expiration_from",
                "expiration_to" };
        // person back up with blob 172
        chcekValuesOfTwo(r1, dataBaseEntry1);
        r1.close();

        /**
         * Multiple working certificates 
         * Testing 5 different certificates   
         */

        /*
        testDocument3 = manager.importPKCS12(cyril, p12Certificate3, cyrilDefPass, p12passToCer3);
        testDocument4 =  manager.importPKCS12(daryl, p12Certificate4, darylDefPass, p12passToCer4);
        testDocument5 =  manager.importPKCS12(eva, p12Certificate5, evaDefPass, p12passToCer5);
        testDocument6 =  manager.importPKCS12(frank, p12Certificate6, frankDefPass, p12passToCer6);
            
        int doc3 = extractRequestIdFromXmlDoc(testDocument3);
        int doc4 = extractRequestIdFromXmlDoc(testDocument4);
        int doc5 = extractRequestIdFromXmlDoc(testDocument5);
        int doc6 = extractRequestIdFromXmlDoc(testDocument6);
            
        ResultSet r2= statement.executeQuery("SELECT userId, certificate, private_key, dn, serial, issuer,"
        + "expiration_from, expiration_to, pubkey_hash, key_backup, salt,"
        + "chain FROM credentials  WHERE (userId = 1 AND id = "+ doc1 +") OR (userId = 2 AND id = "+ doc2 +") OR "
            + "(userId = 3 AND id = "+ doc3 +") OR (userId = 4 AND id = "+ doc4 +") OR"
            + "(userId = 5 AND id = "+ doc5 +") OR (userId = 4 AND id = "+ doc4 +")");
            
        chcekNullValues(r2, dataBaseEntry1);
            
        ResultSet r3= statement.executeQuery("SELECT certificate,dn, serial, issuer,"
                                + "expiration_from, expiration_to"
                                + " FROM credentials WHERE (userId = 1 AND id = "+ doc1 +") OR (userId = 2 AND id = "+ doc2 +") OR "
            + "(userId = 3 AND id = "+ doc3 +") OR (userId = 4 AND id = "+ doc4 +") OR"
            + "(userId = 5 AND id = "+ doc5 +") OR (userId = 4 AND id = "+ doc4 +")");
            
        String[] dataBaseEntry3 = new String[]{"certificate", "dn", "serial", "issuer",
                        "expiration_from", "expiration_to"};
            
        chcekValuesNonEqual(r3, dataBaseEntry3,5);
        r2.close();
        r3.close();
        */

        /**
         * End of test 
         */

        /*
        Document[] allDoc = new Document[]{testDocument1, testDocument2, testDocument3, testDocument4};
            
        int testResult = documentTesting(allDoc, 2, 3);
        switch (testResult) {
        case 1:
            fail("Different results gave same output");
        case 2:
            fail("Data that supposed to give same results didn't");
        case 3:
            fail("One or more object was same with null");
        case 0: {
        }
            
        }*/
    }

    /**
     * This test works under assumption that in database already exist 3 records 
     * of imported p12 certificates method generateXmlForSetUp() generates 
     * xml database entry necessary for this test
     * @throws Exception 
     */
    @Test
    public void testExportPKCS12() throws Exception {
        docInit();
        //generateXmlForSetUp();        
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        manager = new CertificateManagerImpl(configuration);
        manager.setJdbcTemplate((JdbcTemplate) ac.getBean("jdbcTemplate"));
        Security.addProvider(new BouncyCastleProvider());

        String p12passToCer1 = "123456";
        /*
        Selection of certificate might need some work         
        */
        int andersonCerId = 0;
        int bobaFetCerId = 0;
        int cyrilCerId = 0;

        try {
            ResultSet r1 = statement.executeQuery("SELECT id" + " FROM credentials WHERE (userId = "
                    + anderson.getId() + " AND NOT (serial <=> NULL))");
            r1.next();
            andersonCerId = r1.getInt("id");
            r1 = statement.executeQuery("SELECT id" + " FROM credentials WHERE (userId = " + bobaFet.getId()
                    + " AND NOT (serial <=> NULL))");
            r1.next();
            bobaFetCerId = r1.getInt("id");

            r1 = statement.executeQuery("SELECT id" + " FROM credentials WHERE (userId = " + cyril.getId()
                    + " AND NOT (serial <=> NULL))");
            r1.next();
            cyrilCerId = r1.getInt("id");

            r1.close();

        } catch (SQLException e) {
            fail("failed to get certificate id from database ");
        }

        try {
            manager.exportPKCS12(null, andersonCerId, p12passToCer1, p12passToCer1);
            manager.exportPKCS12(anderson, andersonCerId, null, p12passToCer1);
            manager.exportPKCS12(anderson, andersonCerId, p12passToCer1, null);
            manager.exportPKCS12(null, andersonCerId, null, p12passToCer1);
            manager.exportPKCS12(null, andersonCerId, p12passToCer1, null);
            manager.exportPKCS12(null, andersonCerId, null, null);

        } catch (NullPointerException e) {
            fail("unreported nullPointerException was thrown");
        }

        try {
            testDocument1 = manager.exportPKCS12(anderson, andersonCerId, andersonDefPass, p12passToCer1);
            testDocument2 = manager.exportPKCS12(bobaFet, bobaFetCerId, bobaFetDefPass, p12passToCer1);
            testDocument3 = manager.exportPKCS12(cyril, cyrilCerId, cyrilDefPass, p12passToCer1);

        } catch (RemSigException ex) {
            Logger.getLogger(CertificateManagerImplTest.class.getName()).log(Level.SEVERE, null, ex);
        }

        try {
            extractDocIntoXml("test0001.xml", testDocument1);
            extractDocIntoXml("test0002.xml", testDocument2);
            extractDocIntoXml("test0003.xml", testDocument3);

            //FileInputStream xmlDoc1 = new FileInputStream("test0001.xml");
            //String doc1p12 = extractElementFromXmlDoc(testDocument1, "pkcs12");
            databaseTester.setSetUpOperation(DatabaseOperation.DELETE_ALL);
            databaseTester.onSetup();
            //manager.importPKCS12(anderson, doc1p12, andersonDefPass, p12passToCer1);
            //manager.importPKCS12(frank, doc1p12, andersonDefPass, p12passToCer1);
            System.out.printf("adas");

            //assertEquals(testDocument1, testDocument2);
        } catch (Exception ex) {
            fail("not working");
        }

        FileInputStream xmlDoc1 = new FileInputStream("test0001.xml");
        FileInputStream xmlDoc2 = new FileInputStream("test0002.xml");
        FileInputStream xmlDoc3 = new FileInputStream("test0003.xml");
        String doc1p12 = extractElementFromXmlDoc(testDocument1, "pkcs12");
        String doc2p12 = extractElementFromXmlDoc(testDocument2, "pkcs12");
        String doc3p12 = extractElementFromXmlDoc(testDocument3, "pkcs12");

        assertNotNull(doc1p12);
        assertNotNull(doc2p12);
        assertNotNull(doc3p12);

        CertificateFactory cf = CertificateFactory.getInstance("X.509");

    }

    @Test
    public void testCheckPassword() throws Exception {
        docInit();
        setUpId();

        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        manager = new CertificateManagerImpl(configuration);
        manager.setJdbcTemplate((JdbcTemplate) ac.getBean("jdbcTemplate"));
        Security.addProvider(new BouncyCastleProvider());

        try {
            manager.checkPassword(anderson, andersonCerId, andersonDefPass);
            manager.checkPassword(bobaFet, bobaFetCerId, bobaFetDefPass);
            manager.checkPassword(cyril, cyrilCerId, cyrilDefPass);
            try {
                manager.checkPassword(anderson, andersonCerId, darylDefPass);
                manager.checkPassword(anderson, andersonCerId, bobaFetDefPass);
                manager.checkPassword(anderson, andersonCerId, cyrilDefPass);
                manager.checkPassword(bobaFet, bobaFetCerId, andersonDefPass);
                manager.checkPassword(bobaFet, bobaFetCerId, darylDefPass);
                manager.checkPassword(bobaFet, bobaFetCerId, cyrilDefPass);
                manager.checkPassword(cyril, cyrilCerId, andersonDefPass);
                manager.checkPassword(cyril, cyrilCerId, bobaFetDefPass);
                manager.checkPassword(cyril, cyrilCerId, darylDefPass);
                fail("Password that werent same passed");
            } catch (RemSigException e) {

            }

        } catch (Exception e) {
            fail("password that was supposed to be same didnt passed ");
        }
        try {
            manager.checkPassword(anderson, andersonCerId, null);
            manager.checkPassword(null, andersonCerId, andersonDefPass);
            manager.checkPassword(null, andersonCerId, andersonDefPass);

        } catch (NullPointerException e) {
            //fail("Uncaught null pointer exception"); *90 supposed to be here

            /*89 
            No null pointer exception not caught
            */
        }

    }

    /**
     * This test is dependent on working of method check password
     * Test of changePassword method, of class CertificateManagerImpl.
     */
    @Test
    public void testChangePassword() throws Exception {
        docInit();
        setUpId();
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        manager = new CertificateManagerImpl(configuration);
        manager.setJdbcTemplate((JdbcTemplate) ac.getBean("jdbcTemplate"));
        Security.addProvider(new BouncyCastleProvider());
        try {
            manager.changePassword(eva, andersonCerId, andersonDefPass, andersonDefPass);
            manager.changePassword(anderson, bobaFetCerId, andersonDefPass, andersonDefPass);
            manager.changePassword(anderson, andersonCerId, igorDefPass, igorDefPass);
            manager.changePassword(anderson, 0, andersonDefPass, igorDefPass);

            manager.changePassword(bobaFet, bobaFetCerId, bobaFetDefPass, gregorDefPass);
            manager.changePassword(bobaFet, cyrilCerId, bobaFetDefPass, gregorDefPass);
            manager.changePassword(bobaFet, bobaFetCerId, cyrilDefPass, gregorDefPass);
            fail("Some problem with autentication passwords that wasnt supposed to match "
                    + "or id passed autentication when it was expected to fail");
        } catch (Exception e) {
        }
        try {
            manager.changePassword(null, andersonCerId, andersonDefPass, andersonDefPass);
            manager.changePassword(anderson, bobaFetCerId, andersonDefPass, andersonDefPass);
            manager.changePassword(anderson, andersonCerId, null, igorDefPass);
            manager.changePassword(anderson, 0, andersonDefPass, igorDefPass);
            manager.changePassword(null, bobaFetCerId, null, gregorDefPass);
            manager.changePassword(null, cyrilCerId, null, null);
            manager.changePassword(null, 0, null, null);

        } catch (NullPointerException e) {
            //fail("nullPointer exception was not caught"+e);
            //*100 

        }

        try {
            manager.changePassword(anderson, andersonCerId, andersonDefPass, igorDefPass);
            manager.changePassword(bobaFet, bobaFetCerId, bobaFetDefPass, gregorDefPass);

            manager.checkPassword(anderson, andersonCerId, igorDefPass);
            manager.checkPassword(bobaFet, bobaFetCerId, gregorDefPass);
            manager.checkPassword(cyril, cyrilCerId, cyrilDefPass);
        } catch (RemSigException e) {
            fail("there was an error changing passwor" + e);
        }

    }

    /**
     * 
     * Test of resetPassword method, of class CertificateManagerImpl.
     */
    @Test
    public void testResetPassword() throws Exception {
        docInit();
        setUpId();
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        manager = new CertificateManagerImpl(configuration);
        manager.setJdbcTemplate((JdbcTemplate) ac.getBean("jdbcTemplate"));
        Security.addProvider(new BouncyCastleProvider());
        try {
            manager.resetPassword(null, andersonCerId);

        } catch (NullPointerException e) {
            //fail();
        }
        try {
            manager.checkPassword(anderson, andersonCerId, andersonDefPass);
            testDocument2 = manager.resetPassword(anderson, andersonCerId);
            extractDocIntoXml("testResetpass.xml", testDocument2);

            manager.checkPassword(anderson, andersonCerId, andersonDefPass);
            fail("password didnt change");
        } catch (RemSigException | TransformerException e) {
        }

        try {
            manager.checkPassword(anderson, andersonCerId, andersonDefPass);
            testDocument1 = manager.resetPassword(anderson, andersonCerId);
            extractDocIntoXml("testResetpass.xml", testDocument1);
            String newPass = extractElementFromXmlDoc(testDocument1, "password");
            manager.checkPassword(anderson, andersonCerId, newPass);

            manager.checkPassword(anderson, andersonCerId, andersonDefPass);
        } catch (Exception e) {
            fail("failed to reset password ");
        }

    }

    /**
     * For some reason anderson certificate is set to password reset this shouldnt happen
     * *89 there is need to recheck db unit operation set up 
     * 
     */
    @Test
    public void testChangeCertificateStatus() throws Exception {
        docInit();
        setUpId();
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        manager = new CertificateManagerImpl(configuration);
        manager.setJdbcTemplate((JdbcTemplate) ac.getBean("jdbcTemplate"));
        Security.addProvider(new BouncyCastleProvider());

        String rule = "userId =" + bobaFet.getId() + " AND id = " + bobaFetCerId + "";
        int ko = -1;
        String test = "a";
        try {
            if (null != (exportOneCollumFromDatabase("state", "credentials", rule))) {
                fail("inicial status should be null");
            }
            manager.changeCertificateStatus(null, bobaFetCerId, STATE_SUSPENDED);
        } catch (NullPointerException e) {
            //fail("unreported nullpointer exception"); *89 This is one of errors
        }

        // testing standart changing of the certificate status
        try {
            manager.changeCertificateStatus(bobaFet, bobaFetCerId, STATE_SUSPENDED);
            ko = Integer.parseInt(exportOneCollumFromDatabase("state", "credentials", rule));
            assertEquals(ko, STATE_SUSPENDED);

            manager.changeCertificateStatus(bobaFet, bobaFetCerId, STATE_VALID);
            test = exportOneCollumFromDatabase("state", "credentials", rule);
            assertNull(test);

            manager.changeCertificateStatus(bobaFet, bobaFetCerId, STATE_SUSPENDED);
            ko = Integer.parseInt(exportOneCollumFromDatabase("state", "credentials", rule));
            assertEquals(ko, STATE_SUSPENDED);

            manager.changeCertificateStatus(bobaFet, bobaFetCerId, STATE_EXPIRED);
            test = exportOneCollumFromDatabase("state", "credentials", rule);
            assertNull(test);

            manager.changeCertificateStatus(bobaFet, bobaFetCerId, STATE_SUSPENDED);
            ko = Integer.parseInt(exportOneCollumFromDatabase("state", "credentials", rule));
            assertEquals(ko, STATE_SUSPENDED);

            manager.changeCertificateStatus(bobaFet, bobaFetCerId, STATE_NOT_YET_VALID);
            test = exportOneCollumFromDatabase("state", "credentials", rule);
            assertNull(test);

        } catch (NullPointerException e) {
            fail("failed to change status as expected");
        }
        // testing if status does change after certificate is revoked
        try {
            manager.changeCertificateStatus(bobaFet, bobaFetCerId, STATE_REVOKED);
            ko = Integer.parseInt(exportOneCollumFromDatabase("state", "credentials", rule));
            assertEquals(ko, STATE_REVOKED);

            manager.changeCertificateStatus(bobaFet, bobaFetCerId, STATE_SUSPENDED);
            ko = Integer.parseInt(exportOneCollumFromDatabase("state", "credentials", rule));
            assertEquals(ko, STATE_REVOKED);

            manager.changeCertificateStatus(bobaFet, bobaFetCerId, STATE_VALID);
            ko = Integer.parseInt(exportOneCollumFromDatabase("state", "credentials", rule));
            assertEquals(ko, STATE_REVOKED);

            manager.changeCertificateStatus(bobaFet, bobaFetCerId, STATE_EXPIRED);
            ko = Integer.parseInt(exportOneCollumFromDatabase("state", "credentials", rule));
            assertEquals(ko, STATE_REVOKED);

            manager.changeCertificateStatus(bobaFet, bobaFetCerId, STATE_PASSWORD_RESET);
            ko = Integer.parseInt(exportOneCollumFromDatabase("state", "credentials", rule));
            assertEquals(ko, STATE_REVOKED);

        } catch (RemSigException | NumberFormatException e) {
            fail("exception was thrown" + e);
        }
        ko = -1;

        rule = "userId =" + cyril.getId() + " AND id = " + cyrilCerId + "";
        if (null != (exportOneCollumFromDatabase("state", "credentials", rule))) {
            fail("inicial status should be null");
        }
        // testing if certificate status changes after password is reseted
        try {
            manager.changeCertificateStatus(cyril, cyrilCerId, STATE_PASSWORD_RESET);
            ko = Integer.parseInt(exportOneCollumFromDatabase("state", "credentials", rule));
            assertEquals(ko, STATE_PASSWORD_RESET);

            manager.changeCertificateStatus(cyril, cyrilCerId, STATE_SUSPENDED);
            ko = Integer.parseInt(exportOneCollumFromDatabase("state", "credentials", rule));
            assertEquals(ko, STATE_PASSWORD_RESET);

            manager.changeCertificateStatus(cyril, cyrilCerId, STATE_VALID);
            ko = Integer.parseInt(exportOneCollumFromDatabase("state", "credentials", rule));
            assertEquals(ko, STATE_PASSWORD_RESET);

            manager.changeCertificateStatus(cyril, cyrilCerId, STATE_REVOKED);
            ko = Integer.parseInt(exportOneCollumFromDatabase("state", "credentials", rule));
            assertEquals(ko, STATE_PASSWORD_RESET);

            manager.changeCertificateStatus(cyril, cyrilCerId, STATE_NOT_YET_VALID);
            ko = Integer.parseInt(exportOneCollumFromDatabase("state", "credentials", rule));
            assertEquals(ko, STATE_PASSWORD_RESET);

            manager.changeCertificateStatus(cyril, cyrilCerId, STATE_EXPIRED);
            ko = Integer.parseInt(exportOneCollumFromDatabase("state", "credentials", rule));
            assertEquals(ko, STATE_PASSWORD_RESET);

        } catch (RemSigException | NumberFormatException e) {
            fail("exception was thrown" + e);
        }
        // testing if certificate status doesnt change to something weird
        try {
            int init = Integer.parseInt(exportOneCollumFromDatabase("state", "credentials", rule));
            manager.changeCertificateStatus(cyril, cyrilCerId, 59);
            ko = Integer.parseInt(exportOneCollumFromDatabase("state", "credentials", rule));
            assertEquals(ko, init);

            manager.changeCertificateStatus(cyril, cyrilCerId, -6);
            ko = Integer.parseInt(exportOneCollumFromDatabase("state", "credentials", rule));
            assertEquals(ko, init);
            manager.changeCertificateStatus(cyril, cyrilCerId, Integer.MAX_VALUE + 1);
            ko = Integer.parseInt(exportOneCollumFromDatabase("state", "credentials", rule));
            assertEquals(ko, init);
            manager.changeCertificateStatus(cyril, cyrilCerId, Integer.MIN_VALUE - 1);
            ko = Integer.parseInt(exportOneCollumFromDatabase("state", "credentials", rule));
            assertEquals(ko, init);

        } catch (Exception e) {
        }

        /*                case STATE_VALID:
         case STATE_NOT_YET_VALID:
         case STATE_EXPIRED: null
             
         case STATE_SUSPENDED: state
             
         case STATE_REVOKED:
            
         case STATE_PASSWORD_RESET:
            
        statement.execute("UPDATE credentials SET state= 39 WHERE userId="+ bobaFet.getId()+" AND id= "+bobaFetCerId+ ""
           + "   AND state is null");
        //statement.execute("UPDATE credentials SET state= 27 WHERE userId="+ bobaFet.getId()+"");               
            
        manager.changeCertificateStatus(bobaFet, bobaFetCerId, 4);
        manager.changeCertificateStatus(daryl, 942, 4);
        manager.changeCertificateStatus(eva, 943 , 1);
        manager.changeCertificateStatus(frank, 944 , 0);
         manager.changeCertificateStatus(daryl, 942, STATE_VALID);
        */

    }

    @Test
    public void testListCertificatesWithStatus() throws Exception {
        docInit();
        setUpId();
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        manager = new CertificateManagerImpl(configuration);
        manager.setJdbcTemplate((JdbcTemplate) ac.getBean("jdbcTemplate"));
        Security.addProvider(new BouncyCastleProvider());

        try {
            manager.listCertificatesWithStatus(null, 1);
        } catch (NullPointerException e) {
            //fail("unreported nullPpointerException");
        }
        // not yet valid should be derived from current date or set for something like 2349

        statement.execute("UPDATE credentials SET state= null WHERE userId=" + anderson.getId() + " AND id= "
                + andersonCerId);
        statement.execute("UPDATE credentials SET state= null, expiration_from = 1480075200 WHERE userId="
                + bobaFet.getId() + " AND id= " + bobaFetCerId);
        statement.execute("UPDATE credentials SET state= null, expiration_to = 1453161600 WHERE userId="
                + cyril.getId() + " AND id= " + cyrilCerId);

        testDocument1 = manager.listCertificatesWithStatus(anderson, STATE_VALID);
        testDocument2 = manager.listCertificatesWithStatus(bobaFet, STATE_NOT_YET_VALID);
        testDocument3 = manager.listCertificatesWithStatus(cyril, STATE_EXPIRED);
        extractDocIntoXml("testListCertificateWithStatus1.xml", testDocument1);
        extractDocIntoXml("testListCertificateWithStatus2.xml", testDocument2);
        extractDocIntoXml("testListCertificateWithStatus3.xml", testDocument3);

        // chain and certificate is modified in extractMultipleColuumsFromDatabase there is 
        // extra line seperator at the end
        String[] xmlExtraction = new String[] { "dn", "issuer", "serialNumber", "expirationFrom", "expirationTo",
                "certificatePEM", "chainPEM" };
        String[] databaseExtraction = new String[] { "dn", "issuer", "serial", "expiration_From", "expiration_To",
                "certificate", "chain" };

        String ruleA = "id =" + andersonCerId + " AND userId =" + anderson.getId();
        String ruleB = "id =" + bobaFetCerId + " AND userId =" + bobaFet.getId();
        String ruleC = "id =" + cyrilCerId + " AND userId =" + cyril.getId();
        try {
            ArrayList<String> dataFromDoc = extractMultipleElementsFromDoc(xmlExtraction, testDocument1);
            ArrayList<String> dataFromDatabase = extractMultipleCollumsFromDatabase(databaseExtraction,
                    "credentials", ruleA);

            for (int i = 0; i < dataFromDoc.size(); i++) {
                assertEquals("at element " + databaseExtraction[i], dataFromDoc.get(i), dataFromDatabase.get(i));
            }

            dataFromDoc = extractMultipleElementsFromDoc(xmlExtraction, testDocument2);
            dataFromDatabase = extractMultipleCollumsFromDatabase(databaseExtraction, "credentials", ruleB);

            for (int i = 0; i < dataFromDoc.size(); i++) {
                assertEquals("at element " + databaseExtraction[i], dataFromDoc.get(i), dataFromDatabase.get(i));
            }

            dataFromDoc = extractMultipleElementsFromDoc(xmlExtraction, testDocument3);
            dataFromDatabase = extractMultipleCollumsFromDatabase(databaseExtraction, "credentials", ruleC);

            for (int i = 0; i < dataFromDoc.size(); i++) {
                assertEquals("at element " + databaseExtraction[i], dataFromDoc.get(i), dataFromDatabase.get(i));
            }

        } catch (Exception e) {
            fail("there wasnt supposed to be any exception " + e);
        }

        try {
            statement.execute("UPDATE credentials SET state= " + STATE_REVOKED + " WHERE userId=" + anderson.getId()
                    + " AND id= " + andersonCerId);
            statement.execute("UPDATE credentials SET state= " + STATE_SUSPENDED
                    + ", expiration_from = 1453161600 WHERE userId=" + bobaFet.getId() + " AND id= "
                    + bobaFetCerId);
            statement.execute("UPDATE credentials SET state= " + STATE_PASSWORD_RESET
                    + ", expiration_to = 1480075200 WHERE userId=" + cyril.getId() + " AND id= " + cyrilCerId);
            testDocument4 = manager.listCertificatesWithStatus(anderson, STATE_REVOKED);
            testDocument5 = manager.listCertificatesWithStatus(bobaFet, STATE_SUSPENDED);
            testDocument6 = manager.listCertificatesWithStatus(cyril, STATE_PASSWORD_RESET);

            ArrayList<String> dataFromDoc = extractMultipleElementsFromDoc(xmlExtraction, testDocument4);
            ArrayList<String> dataFromDatabase = extractMultipleCollumsFromDatabase(databaseExtraction,
                    "credentials", ruleA);

            for (int i = 0; i < dataFromDoc.size(); i++) {
                assertEquals("at element " + databaseExtraction[i], dataFromDoc.get(i), dataFromDatabase.get(i));
            }

            dataFromDoc = extractMultipleElementsFromDoc(xmlExtraction, testDocument5);
            dataFromDatabase = extractMultipleCollumsFromDatabase(databaseExtraction, "credentials", ruleB);

            for (int i = 0; i < dataFromDoc.size(); i++) {
                assertEquals("at element " + databaseExtraction[i], dataFromDoc.get(i), dataFromDatabase.get(i));
            }

            dataFromDoc = extractMultipleElementsFromDoc(xmlExtraction, testDocument6);
            dataFromDatabase = extractMultipleCollumsFromDatabase(databaseExtraction, "credentials", ruleC);

            for (int i = 0; i < dataFromDoc.size(); i++) {
                assertEquals("at element " + databaseExtraction[i], dataFromDoc.get(i), dataFromDatabase.get(i));
            }

        } catch (SQLException | RemSigException e) {
            fail("there was error listing certificate " + e);
        }

    }

    /**
     *Removes blank space from end of certificate and chain 
     * @param input
     * @return 
     */
    public String changeEndCertificate(String input) {
        String toBefound = "END CERTIFICATE-----" + System.lineSeparator();
        String replaceWith = "END CERTIFICATE-----";

        String replace = input.replace(toBefound, replaceWith);
        return replace;

    }

    public ArrayList<String> extractMultipleElementsFromDoc(String[] elements, Document doc) {
        ArrayList<String> result = new ArrayList<>();
        for (String element : elements) {
            result.add(extractElementFromXmlDoc(doc, element));
        }

        return result;

    }

    public ArrayList<String> extractMultipleCollumsFromDatabase(String[] dataToBeExtracted, String databaseName,
            String rule) {
        ArrayList<String> result = new ArrayList<String>();
        String temp = null;
        for (String rowName : dataToBeExtracted) {
            try {
                ResultSet r = statement.executeQuery(
                        "SELECT " + rowName + "" + " FROM " + databaseName + " " + "WHERE (" + rule + ")");
                r.next();
                temp = r.getString(rowName);
                if (rowName.equals("chain") || rowName.equals("certificate")) {
                    temp = changeEndCertificate(temp);
                }
                result.add(temp);
            } catch (SQLException ex) {
                System.out.println("Failed to load data " + rowName + " from " + databaseName + " ");
            }
        }
        return result;

    }

    @Test
    public void testListAllCertificatesWithStatus() throws Exception {
        docInit();
        setUpId();
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        manager = new CertificateManagerImpl(configuration);
        manager.setJdbcTemplate((JdbcTemplate) ac.getBean("jdbcTemplate"));
        Security.addProvider(new BouncyCastleProvider());
        String ruleA = "userId =" + anderson.getId() + " AND id = " + andersonCerId + "";
        String ruleB = "userId =" + bobaFet.getId() + " AND id = " + bobaFetCerId + "";
        String ruleC = "userId =" + cyril.getId() + " AND id = " + cyrilCerId + "";

        ArrayList<String> databaseAnderson = new ArrayList<>();
        ArrayList<String> databaseCyril = new ArrayList<>();
        ArrayList<String> databaseBobaFet = new ArrayList<>();

        String[] xmlExtraction = new String[] { "dn", "issuer", "serialNumber", "expirationFrom", "expirationTo",
                "certificatePEM", "chainPEM" };
        String[] databaseExtraction = new String[] { "dn", "issuer", "serial", "expiration_From", "expiration_To",
                "certificate", "chain" };

        databaseAnderson = testManager.extractMultipleCollumsFromDatabase(databaseExtraction, "credentials", ruleA);
        databaseBobaFet = testManager.extractMultipleCollumsFromDatabase(databaseExtraction, "credentials", ruleB);
        databaseCyril = testManager.extractMultipleCollumsFromDatabase(databaseExtraction, "credentials", ruleC);

        ArrayList<String[]> result = new ArrayList<String[]>();

        statement.execute("UPDATE credentials SET state= " + STATE_REVOKED + " WHERE userId=" + anderson.getId()
                + " AND id= " + andersonCerId);
        statement.execute("UPDATE credentials SET state= " + STATE_SUSPENDED + " WHERE userId=" + bobaFet.getId()
                + " AND id= " + bobaFetCerId);
        statement.execute("UPDATE credentials SET state= " + STATE_REVOKED + " WHERE userId=" + cyril.getId()
                + " AND id= " + cyrilCerId);
        testDocument1 = manager.listAllCertificatesWithStatus(STATE_REVOKED);
        testDocument2 = manager.listAllCertificatesWithStatus(STATE_SUSPENDED);
        extractDocIntoXml("testListAllCertificateWithStatus.xml", testDocument1);
        extractDocIntoXml("testListAllCertificateWithStatusExpired.xml", testDocument2);

        ArrayList<String[]> revokedData = testManager.parseXmlDoc(testDocument1, xmlExtraction);
        ArrayList<String[]> suspendedData = testManager.parseXmlDoc(testDocument2, xmlExtraction);

        if (revokedData.size() == 2) {
            databaseAnderson = testManager.extractMultipleCollumsFromDatabase(databaseExtraction, "credentials",
                    ruleA);
            databaseCyril = testManager.extractMultipleCollumsFromDatabase(databaseExtraction, "credentials",
                    ruleC);
            databaseBobaFet = testManager.extractMultipleCollumsFromDatabase(databaseExtraction, "credentials",
                    ruleB);
            assertArrayEquals(databaseAnderson.toArray(), revokedData.get(0));
            assertArrayEquals(databaseCyril.toArray(), revokedData.get(1));
            assertArrayEquals(databaseBobaFet.toArray(), suspendedData.get(0));

        }
        statement.execute("UPDATE credentials SET state= " + "null" + " WHERE userId=" + anderson.getId()
                + " AND id= " + andersonCerId);
        statement.execute("UPDATE credentials SET state= " + "null" + " WHERE userId=" + bobaFet.getId()
                + " AND id= " + bobaFetCerId);
        statement.execute("UPDATE credentials SET state= " + "null" + " WHERE userId=" + cyril.getId() + " AND id= "
                + cyrilCerId);

        testDocument3 = manager.listAllCertificatesWithStatus(STATE_VALID);
        testManager.exportDocIntoXml("testlistallCertificateWithStatusvalid.xml", testDocument3);
        ArrayList<String[]> validData = testManager.parseXmlDoc(testDocument3, xmlExtraction);
        assertArrayEquals(databaseAnderson.toArray(), validData.get(0));
        assertArrayEquals(databaseBobaFet.toArray(), validData.get(1));
        assertArrayEquals(databaseCyril.toArray(), validData.get(2));

        statement.execute("UPDATE credentials SET state= " + STATE_PASSWORD_RESET + " WHERE userId="
                + anderson.getId() + " AND id= " + andersonCerId);
        statement.execute("UPDATE credentials SET state= null, expiration_from = 1480075200 WHERE userId="
                + bobaFet.getId() + " AND id= " + bobaFetCerId);
        statement.execute("UPDATE credentials SET state= null, expiration_to = 1453161600 WHERE userId="
                + cyril.getId() + " AND id= " + cyrilCerId);

        testDocument4 = manager.listAllCertificatesWithStatus(STATE_PASSWORD_RESET);
        testDocument5 = manager.listAllCertificatesWithStatus(STATE_NOT_YET_VALID);
        testDocument6 = manager.listAllCertificatesWithStatus(STATE_EXPIRED);

        databaseAnderson = testManager.extractMultipleCollumsFromDatabase(databaseExtraction, "credentials", ruleA);
        databaseBobaFet = testManager.extractMultipleCollumsFromDatabase(databaseExtraction, "credentials", ruleB);
        databaseCyril = testManager.extractMultipleCollumsFromDatabase(databaseExtraction, "credentials", ruleC);

        ArrayList<String[]> resetData = testManager.parseXmlDoc(testDocument4, xmlExtraction);
        ArrayList<String[]> notYetValidData = testManager.parseXmlDoc(testDocument5, xmlExtraction);
        ArrayList<String[]> expiredData = testManager.parseXmlDoc(testDocument6, xmlExtraction);

        assertArrayEquals(databaseAnderson.toArray(), resetData.get(0));
        assertArrayEquals(databaseBobaFet.toArray(), notYetValidData.get(0));
        assertArrayEquals(databaseCyril.toArray(), expiredData.get(0));

    }

    /**
     * Test of uploadPrivateKey method, of class CertificateManagerImpl.
     */
    @Test
    public void testUploadPrivateKey() throws Exception {
        docInit();
        setUpId();
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        manager = new CertificateManagerImpl(configuration);
        manager.setJdbcTemplate((JdbcTemplate) ac.getBean("jdbcTemplate"));
        Security.addProvider(new BouncyCastleProvider());

        byte[] differentData = new byte[] { 4, 2, 3, 4, 1, 23, 4, 1 };
        byte[] privateKeyA = testManager
                .loadFileBytes("TestingCertificates/newSsl/sslcert/private/testsubject1-key.pem");
        byte[] privateKeyB = testManager
                .loadFileBytes("TestingCertificates/newSsl/sslcert/private/testsubject2-key.pem");
        byte[] privateKeyC = testManager
                .loadFileBytes("TestingCertificates/newSsl/sslcert/private/testsubject3-key.pem");

        testDocument1 = manager.resetPassword(anderson, andersonCerId);
        byte[] passHashA = extractElementFromXmlDoc(testDocument1, "password").getBytes();

        testDocument2 = manager.resetPassword(bobaFet, bobaFetCerId);
        byte[] passHashB = extractElementFromXmlDoc(testDocument2, "password").getBytes();

        String[] dataToBeExtracted = new String[] { "userId", "id", "dn", "issuer", "serial", "expiration_from",
                "expiration_to" };

        String ruleA = "userId =" + anderson.getId() + " AND id = " + andersonCerId + "";
        String ruleB = "userId =" + bobaFet.getId() + " AND id = " + bobaFetCerId + "";
        String ruleC = "userId =" + cyril.getId() + " AND id = " + cyrilCerId + "";

        try {
            testDocument3 = manager.uploadPrivateKey(null, anderson, cyrilCerId, differentData);
            testDocument4 = manager.uploadPrivateKey(differentData, anderson, cyrilCerId, null);
            testDocument5 = manager.uploadPrivateKey(null, anderson, cyrilCerId, null);
            testDocument6 = manager.uploadPrivateKey(differentData, null, cyrilCerId, differentData);
            testDocument7 = manager.uploadPrivateKey(null, null, cyrilCerId, differentData);
            testDocument8 = manager.uploadPrivateKey(null, null, cyrilCerId, null);
        } catch (NullPointerException e) {
            //fail("uncaught null pointer exception");
        }
        Document[] allDoc = new Document[] { testDocument3, testDocument4, testDocument5, testDocument6,
                testDocument7, testDocument8 };
        if (0 != testManager.chceckDocuments(allDoc, 0, 0)) {
            fail("some key was uploaded with null values");
        }

        try {

            String originalKey = testManager.extractOneCollumFromDatabase("private_key", "credentials", ruleA);

            testDocument2 = manager.uploadPrivateKey(privateKeyA, anderson, cyrilCerId, passHashA);
            testDocument3 = manager.uploadPrivateKey(privateKeyA, anderson, andersonCerId, differentData);
            testDocument4 = manager.uploadPrivateKey(privateKeyA, anderson, bobaFetCerId, differentData);

            String newPrivateKey = testManager.extractOneCollumFromDatabase("private_key", "credentials", ruleA);
            assertEquals(originalKey, newPrivateKey);

        } catch (RemSigException e) {
        }

        byte[] originalAnderson = testManager.extractOneCollumFromDatabase("private_key", "credentials", ruleA)
                .getBytes();
        byte[] originalBobaFet = testManager.extractOneCollumFromDatabase("private_key", "credentials", ruleB)
                .getBytes();
        byte[] originalCyril = testManager.extractOneCollumFromDatabase("private_key", "credentials", ruleC)
                .getBytes();

        testDocument5 = manager.uploadPrivateKey(privateKeyA, anderson, andersonCerId, passHashA);
        testDocument6 = manager.uploadPrivateKey(privateKeyB, bobaFet, bobaFetCerId, passHashB);
        testDocument7 = manager.uploadPrivateKey(privateKeyC, cyril, cyrilCerId, differentData);

        byte[] uploadedAnderson = testManager.extractOneCollumFromDatabase("private_key", "credentials", ruleA)
                .getBytes();
        byte[] uploadedBobaFet = testManager.extractOneCollumFromDatabase("private_key", "credentials", ruleB)
                .getBytes();
        byte[] uploadedCyril = testManager.extractOneCollumFromDatabase("private_key", "credentials", ruleC)
                .getBytes();

        assertThat(originalAnderson, not(uploadedAnderson));
        assertThat(originalBobaFet, not(uploadedBobaFet));
        assertThat(originalCyril, is(uploadedCyril));

    }

    /**
     * Only testing expected outcome since nothing else can be properly tested
     * Test of stats method, of class CertificateManagerImpl.
     */
    // method neccesary to read and parse string 

    @Test
    public void testStats() throws Exception {
        docInit();
        setUpId();
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        manager = new CertificateManagerImpl(configuration);
        manager.setJdbcTemplate((JdbcTemplate) ac.getBean("jdbcTemplate"));
        Security.addProvider(new BouncyCastleProvider());

        ArrayList<String[]> xmlData = testManager.parseXmlDoc("testStats.xml");

        String[] dataToBeExtracted = new String[] { "userId", "id", "dn", "issuer", "serial", "expiration_from",
                "expiration_to" };

        String ruleA = "userId =" + anderson.getId() + " AND id = " + andersonCerId + "";
        String ruleB = "userId =" + bobaFet.getId() + " AND id = " + bobaFetCerId + "";
        String ruleC = "userId =" + cyril.getId() + " AND id = " + cyrilCerId + "";

        ArrayList<String> databaseAndersonData = testManager.extractMultipleCollumsFromDatabase(dataToBeExtracted,
                "credentials", ruleA);
        ArrayList<String> databaseBobaFetData = testManager.extractMultipleCollumsFromDatabase(dataToBeExtracted,
                "credentials", ruleB);
        ArrayList<String> databaseCyrilData = testManager.extractMultipleCollumsFromDatabase(dataToBeExtracted,
                "credentials", ruleC);

        Object[] databaseAnderson = databaseAndersonData.toArray();
        Object[] databaseBobaFet = databaseBobaFetData.toArray();
        Object[] databaseCyril = databaseCyrilData.toArray();
        assertArrayEquals(databaseAnderson, xmlData.get(0));
        assertArrayEquals(databaseBobaFet, xmlData.get(1));
        assertArrayEquals(databaseCyril, xmlData.get(2));

    }

    @Test
    public void testImportCertificate() throws Exception {
        docInit();
        setUpId();
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        manager = new CertificateManagerImpl(configuration);
        manager.setJdbcTemplate((JdbcTemplate) ac.getBean("jdbcTemplate"));
        Security.addProvider(new BouncyCastleProvider());

        String ruleA = "userId =" + anderson.getId() + " AND id = " + andersonCerId + "";
        String ruleB = "userId =" + bobaFet.getId() + " AND id = " + bobaFetCerId + "";
        String ruleC = "userId =" + cyril.getId() + " AND id = " + cyrilCerId + "";

        String ok = testManager.extractOneCollumFromDatabase("request", "credentials", ruleA);
        String certchain = testManager.extractOneCollumFromDatabase("chain", "credentials", ruleA);
        FileInputStream first = new FileInputStream("TestingCertificates/newSsl/sslcert/pkcs7/sub1cer.der");
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        X509Certificate firstCert = (X509Certificate) cf.generateCertificate(first);
        statement.execute("UPDATE credentials SET level= 1" + " WHERE userId=" + anderson.getId() + " AND id= "
                + andersonCerId);
        manager.importCertificate(anderson, firstCert, certchain);
        String p12Certificate2 = loadPKCS12("TestingCertificates/newSsl/sslcert/sub2-cert.p12");

    }

    public String exportOneCollumFromDatabase(String dataToBeExported, String databaseName, String rule) {
        String result = null;
        try {
            ResultSet r = statement.executeQuery(
                    "SELECT " + dataToBeExported + "" + " FROM " + databaseName + " " + "WHERE (" + rule + ")");
            r.next();
            result = r.getString(dataToBeExported);
        } catch (SQLException ex) {
            System.out.println("Failed to load data " + dataToBeExported + " from " + databaseName + " ");
        }

        return result;
    }

    public void setUpId() {

        try {
            ResultSet r1 = statement.executeQuery("SELECT id" + " FROM credentials WHERE (userId = "
                    + anderson.getId() + " AND NOT (serial <=> NULL))");
            r1.next();
            andersonCerId = r1.getInt("id");
            r1 = statement.executeQuery("SELECT id" + " FROM credentials WHERE (userId = " + bobaFet.getId()
                    + " AND NOT (serial <=> NULL))");
            r1.next();
            bobaFetCerId = r1.getInt("id");

            r1 = statement.executeQuery("SELECT id" + " FROM credentials WHERE (userId = " + cyril.getId()
                    + " AND NOT (serial <=> NULL))");
            r1.next();
            cyrilCerId = r1.getInt("id");

            r1.close();

        } catch (SQLException e) {
            fail("failed to get certificate id from database ");
        }
    }

    /**
     * 
     * @param File name
     * @return Content of xml file converted into string
     * @throws FileNotFoundException
     * @throws IOException 
     */
    public String getStringFromXmlFile(String input) throws FileNotFoundException, IOException {
        File xmlFile = new File(input);

        // Let's get XML file as String using BufferedReader
        // FileReader uses platform's default character encoding
        // if you need to specify a different encoding, use InputStreamReader
        Reader fileReader = new FileReader(xmlFile);
        BufferedReader bufReader = new BufferedReader(fileReader);

        StringBuilder sb = new StringBuilder();
        String line = bufReader.readLine();
        while (line != null) {
            sb.append(line).append("\n");
            line = bufReader.readLine();
        }
        String xml2String = sb.toString();
        System.out.println("XML to String using BufferedReader : ");
        System.out.println(xml2String);

        return xml2String;
    }

    /**
     * 
     * @param document to be converted 
     * @return String converted from doc document
     */
    public String getStringFromDoc(org.w3c.dom.Document doc) {
        DOMImplementationLS domImplementation = (DOMImplementationLS) doc.getImplementation();
        LSSerializer lsSerializer = domImplementation.createLSSerializer();
        return lsSerializer.writeToString(doc);
    }

    /**
     * 
     * @param filePath to p12 file
     * @return convert through bytes and returns string
     */
    public String loadPKCS12(String filePath) {
        String encodedString = null;
        try {
            byte[] bytes = Files.readAllBytes(Paths.get(filePath));
            byte[] encoded = Base64.encode(bytes);
            encodedString = new String(encoded);
        } catch (IOException ex) {

        }
        return encodedString;
    }

    /**
     * Takes result set and string[] values to be chceck if they were inserted 
     * into the database and are not null
     * @param inRs
     * @param valuesToChceck
     * @return 
     */
    public boolean chcekNullValues(ResultSet inRs, String[] valuesToChceck) {
        try {
            while (inRs.next()) {
                for (String databaseEntry : valuesToChceck) {
                    assertNotNull("Values weren't inserted correctly some of them were null",
                            inRs.getObject(databaseEntry));
                }
                //                    ArrayList<String> singleAddress = new ArrayList<String>(); array list declarataion for posiible changes 
            }

        } catch (SQLException e) {
        }

        return true;
    }

    /**
     * Check if the values in 2 result same are the same 
     * @param inRs
     * @param valuesToChceck
     * @return 
     */
    public boolean chcekValuesOfTwo(ResultSet inRs, String[] valuesToChceck) {
        try {
            LinkedList<Object> set1 = new LinkedList<Object>();
            LinkedList<Object> set2 = new LinkedList<Object>();
            //LinkedList<Object> set1 = new LinkedList<String>();
            //LinkedList<String> set2 = new LinkedList<String>();
            int counter = 0;
            while (inRs.next()) {
                for (String databaseEntry : valuesToChceck) {
                    if (counter == 0) {
                        set1.add(inRs.getObject(databaseEntry));
                    } else {
                        set2.add(inRs.getObject(databaseEntry));
                    }

                    //assertNotNull("Values weren't inserted correctly some of them were null", inRs.getObject(databaseEntry));
                }
                //                    ArrayList<String> singleAddress = new ArrayList<String>(); array list declarataion for posiible changes 
                ++counter;
            }
            for (int i = 0; i < set1.size(); i++) {

                assertEquals("Error while chceking same value inserted into database at differnt times",
                        set1.get(i), set2.get(i));

            }

            assertEquals("Error while chceking same value inserted into database at differnt times", set1, set2);

        } catch (SQLException e) {
        }

        return true;
    }

    /**
     * Still in progress for now only works for 5 results set 
     * chceck if any of the resultsets are the same
     * @param inRs
     * @param valuesToChceck
     * @param k
     * @return 
     */
    public boolean chcekValuesNonEqual(ResultSet inRs, String[] valuesToChceck, int k) {
        // List of list could work for all sizes 

        try {
            LinkedList<Object> set1 = new LinkedList<Object>();
            LinkedList<Object> set2 = new LinkedList<Object>();
            LinkedList<Object> set3 = new LinkedList<Object>();
            LinkedList<Object> set4 = new LinkedList<Object>();
            LinkedList<Object> set5 = new LinkedList<Object>();

            LinkedList<LinkedList<Object>> all = new LinkedList<LinkedList<Object>>();

            //LinkedList<Object> set1 = new LinkedList<String>();
            //LinkedList<String> set2 = new LinkedList<String>();
            int counter = 0;
            while (inRs.next()) {
                for (String databaseEntry : valuesToChceck) {

                    switch (counter) {
                    case 0:
                        set1.add(inRs.getObject(databaseEntry));
                        break;
                    case 1:
                        set2.add(inRs.getObject(databaseEntry));
                        break;
                    case 2:
                        set3.add(inRs.getObject(databaseEntry));
                        break;
                    case 3:
                        set4.add(inRs.getObject(databaseEntry));
                        break;
                    case 4:
                        set5.add(inRs.getObject(databaseEntry));
                        break;
                    }

                    //assertNotNull("Values weren't inserted correctly some of them were null", inRs.getObject(databaseEntry));
                }
                //                    ArrayList<String> singleAddress = new ArrayList<String>(); array list declarataion for posiible changes 
                ++counter;
            }
            for (int i = 0; i < k; i++) {

            }

            assertThat(set1, not(set2));
            assertThat(set1, not(set3));
            assertThat(set1, not(set4));
            assertThat(set1, not(set5));
            assertThat(set2, not(set3));
            assertThat(set2, not(set4));
            assertThat(set2, not(set5));
            assertThat(set3, not(set4));
            assertThat(set3, not(set5));
            assertThat(set4, not(set5));

            //Assert.assertThat(set1, not(all));

        } catch (SQLException e) {
        }

        return true;
    }

    /**
     * Takes input document and creates new output document
     * @param outputFilename
     * @param inputDoc to be transfered
     * @throws TransformerConfigurationException
     * @throws TransformerException 
     */
    public void extractDocIntoXml(String outputFilename, Document inputDoc)
            throws TransformerConfigurationException, TransformerException {
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        Result output = new StreamResult(new File(outputFilename));
        Source input = new DOMSource(inputDoc);
        transformer.transform(input, output);
    }

    /**
     * returns request id from doc document
     * @param docToBeExtracted
     * @return 
     */
    public int extractRequestIdFromXmlDoc(Document docToBeExtracted) {
        int result = 0;
        try {

            /*DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
            Document doc = docBuilder.parse ("output3.xml");
            */
            Document doc = docToBeExtracted;
            // normalize text representation
            doc.getDocumentElement().normalize();
            //System.out.println ("Root element of the doc is " +  doc.getDocumentElement().getNodeName());

            //doc.getElementById(evaDefPass)
            NodeList listOfPersons = doc.getElementsByTagName("remsig");

            int totalPersons = listOfPersons.getLength();

            for (int s = 0; s < listOfPersons.getLength(); s++) {

                Node firstPersonNode = listOfPersons.item(s);
                if (firstPersonNode.getNodeType() == Node.ELEMENT_NODE) {

                    Element firstPersonElement = (Element) firstPersonNode;

                    //-------
                    NodeList firstNameList = firstPersonElement.getElementsByTagName("requestId");
                    Element firstNameElement = (Element) firstNameList.item(0);

                    NodeList textFNList = firstNameElement.getChildNodes();

                    result = Integer.parseInt((((Node) textFNList.item(0)).getNodeValue().trim()));
                    //Integer.parseInt("1234"); 

                } //end of if clause

            } //end of for loop with s var

        } catch (Exception e) {

        } catch (Throwable t) {
            t.printStackTrace();
        }

        return result;
    }

    public String extractElementFromXmlDoc(Document docToBeExtracted, String elementName) {
        String result = null;
        try {

            /*DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
            Document doc = docBuilder.parse ("output3.xml");
            */
            Document doc = docToBeExtracted;
            // normalize text representation
            doc.getDocumentElement().normalize();

            //doc.getElementById(evaDefPass)
            NodeList listOfPersons = doc.getElementsByTagName("remsig");

            int totalPersons = listOfPersons.getLength();

            for (int s = 0; s < listOfPersons.getLength(); s++) {

                Node firstPersonNode = listOfPersons.item(s);
                if (firstPersonNode.getNodeType() == Node.ELEMENT_NODE) {

                    Element firstPersonElement = (Element) firstPersonNode;

                    //-------
                    NodeList firstNameList = firstPersonElement.getElementsByTagName(elementName);
                    Element firstNameElement = (Element) firstNameList.item(0);

                    NodeList textFNList = firstNameElement.getChildNodes();

                    result = ((((Node) textFNList.item(0)).getNodeValue().trim()));
                    //Integer.parseInt("1234"); 

                } //end of if clause

            } //end of for loop with s var

        } catch (Exception e) {

        } catch (Throwable t) {
            t.printStackTrace();
        }

        return result;
    }

    /**
     * Setting up database for first use it is expected to have database in this 
     * format 2 different p12 certificates are necessary 
     * @throws RemSigException
     * @throws Exception 
     */
    private void generateXmlForSetUp() throws RemSigException, Exception {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        manager = new CertificateManagerImpl(configuration);
        manager.setJdbcTemplate((JdbcTemplate) ac.getBean("jdbcTemplate"));
        Security.addProvider(new BouncyCastleProvider());
        databaseTester.setSetUpOperation(DatabaseOperation.DELETE_ALL);
        //databaseTester.setDataSet();
        databaseTester.onSetup();

        manager.generateRequest(anderson, andersonDefPass);
        manager.generateRequest(bobaFet, bobaFetDefPass);
        manager.generateRequest(cyril, cyrilDefPass);
        manager.generateRequest(daryl, darylDefPass);
        manager.generateRequest(eva, evaDefPass);
        manager.generateRequest(frank, frankDefPass);
        manager.generateRequest(gregor, gregorDefPass);
        manager.generateRequest(helena, helenaDefPass);
        manager.generateRequest(igor, igorDefPass);

        String p12Certificate1 = loadPKCS12("TestingCertificates/newSsl/sslcert/sub1-cert.p12");
        String p12Certificate2 = loadPKCS12("TestingCertificates/newSsl/sslcert/sub2-cert.p12");
        String p12Certificate3 = loadPKCS12("TestingCertificates/newSsl/sslcert/sub3-cert.p12");
        //String p12Certificate4 = loadPKCS12("right.p12");

        String p12passToCer1 = "123456";
        String p12passToCer2 = "123456";
        String p12passToCer3 = "123456";

        manager.importPKCS12(anderson, p12Certificate1, andersonDefPass, p12passToCer1);
        manager.importPKCS12(bobaFet, p12Certificate2, bobaFetDefPass, p12passToCer2);
        manager.importPKCS12(cyril, p12Certificate3, cyrilDefPass, p12passToCer3);

        try {
            exportsDatabaseIntoXml("NewInitDatabase.xml");
        } catch (Exception ex) {
        }

    }

    @Mock
    private JdbcTemplate jdbcTemplate;
    /*
        @Test
        public void testImportCertificate() throws Exception {
    docInit();
    /*jdbcTemplate = Mockito.mock(JdbcTemplate.class);
            
            
     jdbcTemplate.update(
     "INSERT INTO credentials "
     + "(userId,private_key,request,pubkey_hash,salt,key_backup) "
     + "VALUES (7,sd,asd,w,gd,tr)",
            
     new int[]{
     Types.INTEGER, Types.BLOB, Types.VARCHAR,
     Types.BLOB, Types.BLOB, Types.BLOB});
     */
    /*
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    manager = new CertificateManagerImpl(configuration);
    //manager.setJdbcTemplate(jdbcTemplate);
    manager.setJdbcTemplate((JdbcTemplate) ac.getBean("jdbcTemplate"));
    Security.addProvider(new BouncyCastleProvider());
        
    FileInputStream first = new FileInputStream("FirstCertificate.cer");
        
    //    FileInputStream first=new FileInputStream("FirstCertificate.cer");//*89 *
    FileInputStream second = new FileInputStream("SecondCertificate.cer");
    FileInputStream third = new FileInputStream("FirstCertificate.cer");
    X509Certificate firstCert = null;
    try {
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        firstCert = (X509Certificate) cf.generateCertificate(first);
        X509Certificate secondCert = (X509Certificate) cf.generateCertificate(second);
        X509Certificate thirdCert = (X509Certificate) cf.generateCertificate(third);
        
            
        //r.next();
        //int count = r.getInt("rowcount");
        //assertEquals(finalRowCount, count);
            
        System.out.println("lok");
        /*testDocument2 = manager.importCertificate(new Person(5), secondCert, CONFIG_FILE);
         testDocument3 = manager.importCertificate(new Person(5), thirdCert, CONFIG_FILE);
         testDocument4 = manager.importCertificate(new Person(6), thirdCert, CONFIG_FILE);
         testDocument5 = manager.importCertificate(new Person(6), secondCert, CONFIG_FILE); //*89 test chain by removing database a seeing output 
         testDocument6 = manager.importCertificate(new Person(6), null, CONFIG_FILE);       // siganture should be same with diferent certchains i hope
         */
    // add chcek against database if nessesary
    /*
    } catch (Exception e) {
        fail("Fail to load test certificate or inicialize prototype documents" + e);
    } finally {
        //first.close();
        second.close();
        first.close();
    }
    ResultSet r = statement.executeQuery("SELECT request FROM credentials WHERE userID = 5");
    //ResultSet r = statement.executeQuery("SELECT CAST(pubkey_hash AS CHAR(10000) CHARACTER SET utf8) FROM credentials WHERE userID = 5");
        
    //SELECT CONVERT(column USING utf8) FROM.
        r.next();
        byte[] request =  r.getBytes("request");
        /*Blob blob = r.getBlob("pubkey_hash");
        byte[] bdata = blob.getBytes(1, (int) blob.length());
        String publicHash = new String(bdata);
            
        */
    /*
        X509Certificate x509Certificate = null;
        //cerificate;
         /*FileInputStream preinput=new FileInputStream("cerificate.txt");
         CertificateFactory cf = CertificateFactory.getInstance("X.509");
         X509Certificate tryCertificate = (X509Certificate) cf.generateCertificate(preinput);
        //byte[] encoded = Files.readAllBytes(Paths.get(preinput));
        */
    /*
        FileInputStream preinput=new FileInputStream("TestingCertificates/miroslav_macor_410127.pem");
        //String content = new Scanner(new File("TestingCertificates/pokus.pem")).useDelimiter("\\Z").next();
        //String content = new Scanner(new File("TestingCertificates/miroslav_macor_410127.pem")).useDelimiter("\\Z").next();
        //String content = new Scanner(new File("TestingCertificates/miroslav_macor_410127.crt")).useDelimiter("\\Z").next();
        String content = new Scanner(new File("TestingCertificates/01.pem")).useDelimiter("\\Z").next();
        byte[] encoded = Files.readAllBytes(Paths.get("TestingCertificates/pokus.pem"));
    /*
            
        FileInputStream first5 = new FileInputStream("TestingCertificates/01.pem");
            
        
    //    FileInputStream first=new FileInputStream("FirstCertificate.cer");//*89 *
        
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        X509Certificate firstCert5 = (X509Certificate) cf.generateCertificate(first5);
               
            
          try {
            
     CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
     x509Certificate = (X509Certificate) certFactory.
           generateCertificate(new ByteArrayInputStream(encoded));
          } catch (CertificateException ex) {
     throw new RemSigException(
           "Error while generating certificate in this fucking region",
           ex, ErrorCode.ERROR248EN);
          }
            
            
            
            
       String certChain =  " -----BEGIN CERTIFICATE-----\n"
        + "MIIF6jCCA9KgAwIBAgIRAM0n6PuHVxFfdlSNZoQ9l/owDQYJKoZIhvcNAQEMBQAw\n"
        + "gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtK\n"
        + "ZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYD\n"
        + "VQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTE0\n"
        + "MTAwOTAwMDAwMFoXDTI0MTAwODIzNTk1OVowaTELMAkGA1UEBhMCTkwxFjAUBgNV\n"
        + "BAgTDU5vb3JkLUhvbGxhbmQxEjAQBgNVBAcTCUFtc3RlcmRhbTEPMA0GA1UEChMG\n"
        + "VEVSRU5BMR0wGwYDVQQDExRURVJFTkEgUGVyc29uYWwgQ0EgMjCCASIwDQYJKoZI\n"
        + "hvcNAQEBBQADggEPADCCAQoCggEBAIt/txlfYTgQu/SsFvalu41zNJsnlZV8L2L2\n"
        + "2pUwZyCfFo+Y1TUhlh6+3ppy8iN53w4L8oIOeJtWdlTTCG2cstFjVMDPGDt5qSZg\n"
        + "2J/+p5SsClYDkuRhLd2JhKm0XTzF2Xk+G5fSLS4fp9gD2fCua7yqFU6vcr2OKpCB\n"
        + "uK+sNQgwagGZHUhR92hxhmGYihsg7JbCqv5sGEOclH+2i34wqbxVbOtXB3rTHkLj\n"
        + "uqVTC+rY7/fUz5GKDnraaVq56unRxerjmLKGTNwHcL+tlC4H1RMqkcxukrljaVPQ\n"
        + "nWhJYp0rSvRfwlFJGgTNHUvt/jmjqsVfqwzssyLHU3mJAkTxl70CAwEAAaOCAWsw\n"
        + "ggFnMB8GA1UdIwQYMBaAFFN5v1qqK0rPVIDh2JvAnfKyA2bLMB0GA1UdDgQWBBT7\n"
        + "nDgjUKHXAASZLTgGZJCjJhvb7TAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgw\n"
        + "BgEB/wIBADAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwGAYDVR0gBBEw\n"
        + "DzANBgsrBgEEAbIxAQICHTBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLnVz\n"
        + "ZXJ0cnVzdC5jb20vVVNFUlRydXN0UlNBQ2VydGlmaWNhdGlvbkF1dGhvcml0eS5j\n"
        + "cmwwdgYIKwYBBQUHAQEEajBoMD8GCCsGAQUFBzAChjNodHRwOi8vY3J0LnVzZXJ0\n"
        + "cnVzdC5jb20vVVNFUlRydXN0UlNBQWRkVHJ1c3RDQS5jcnQwJQYIKwYBBQUHMAGG\n"
        + "GWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggIBAECZ\n"
        + "vR9W7r9ievG4g95FRUr9M/saDMcLJonWtk1pFoO4jkJyTBryic4xo+DBk48fW92G\n"
        + "ukiUQEIcNGkhGPVMfYFTwp7Cue8yjjyoKMDpJMVx/72iJA0tL+LXbGgedtxxKXGM\n"
        + "f1EsE97nDy4xCreriELxXBPqt8x9Wscs9go/1uPW4laDLVT/RwQiiGDx/UNZb1ev\n"
        + "6RKtRAg6y+Anp5Yd6AUf2/6caQ8H9tjrcxZ6nsiNcc5DrFx4hK2KTqZAVfud8HCm\n"
        + "BR0ic4WtbRFBd65HKCx5AcN+Usc9I48MF+7Ohz2ZJSDiAVmNwrMYFTX5cHBTD9Nt\n"
        + "26TezyuKQEooR1hx2ODxQqnT+xXOiJxxltZgw4dh9RT/fyEaIhAFmqJCaTGYqCnV\n"
        + "ED2MDYTiWJeZ8Ag6qCk99Aqou49IMOiZNdWQCHw97qFlx8XhTc4RfxSFqhYpK1Kb\n"
        + "6DouDmuwmRPT0MWuRZNs2fTumA3b08klQkLK0f+OEFJWVAWyRSfWvS/6v8XPNxzO\n"
        + "gtbiSjAX1vixM/5lrNei6JlmJjhgODr+X7ydaAddhvzu5p6hqIsmLRNPoRZkumfj\n"
        + "ppoVkX/X8SSkMg7a6mMXDjl3o4vOD0A8sZ4t/TZTkhXSdxxy2kO8zBk3HOvNnc9J\n"
        + "gekNS8kiK3OaBG7Vv2CPyc0vknfcyGVhzBOAnish\n"
        + "-----END CERTIFICATE-----\n"
        + "-----BEGIN CERTIFICATE-----\n"
        + "MIIFdzCCBF+gAwIBAgIQE+oocFv07O0MNmMJgGFDNjANBgkqhkiG9w0BAQwFADBv\n"
        + "MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk\n"
        + "ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF\n"
        + "eHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFow\n"
        + "gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtK\n"
        + "ZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYD\n"
        + "VQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjAN\n"
        + "BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAgBJlFzYOw9sIs9CsVw127c0n00yt\n"
        + "UINh4qogTQktZAnczomfzD2p7PbPwdzx07HWezcoEStH2jnGvDoZtF+mvX2do2NC\n"
        + "tnbyqTsrkfjib9DsFiCQCT7i6HTJGLSR1GJk23+jBvGIGGqQIjy8/hPwhxR79uQf\n"
        + "jtTkUcYRZ0YIUcuGFFQ/vDP+fmyc/xadGL1RjjWmp2bIcmfbIWax1Jt4A8BQOujM\n"
        + "8Ny8nkz+rwWWNR9XWrf/zvk9tyy29lTdyOcSOk2uTIq3XJq0tyA9yn8iNK5+O2hm\n"
        + "AUTnAU5GU5szYPeUvlM3kHND8zLDU+/bqv50TmnHa4xgk97Exwzf4TKuzJM7UXiV\n"
        + "Z4vuPVb+DNBpDxsP8yUmazNt925H+nND5X4OpWaxKXwyhGNVicQNwZNUMBkTrNN9\n"
        + "N6frXTpsNVzbQdcS2qlJC9/YgIoJk2KOtWbPJYjNhLixP6Q5D9kCnusSTJV882sF\n"
        + "qV4Wg8y4Z+LoE53MW4LTTLPtW//e5XOsIzstAL81VXQJSdhJWBp/kjbmUZIO8yZ9\n"
        + "HE0XvMnsQybQv0FfQKlERPSZ51eHnlAfV1SoPv10Yy+xUGUJ5lhCLkMaTLTwJUdZ\n"
        + "+gQek9QmRkpQgbLevni3/GcV4clXhB4PY9bpYrrWX1Uu6lzGKAgEJTm4Diup8kyX\n"
        + "HAc/DVL17e8vgg8CAwEAAaOB9DCB8TAfBgNVHSMEGDAWgBStvZh6NLQm9/rEJlTv\n"
        + "A73gJMtUGjAdBgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/\n"
        + "BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAGBgRVHSAAMEQGA1Ud\n"
        + "HwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9BZGRUcnVzdEV4\n"
        + "dGVybmFsQ0FSb290LmNybDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0\n"
        + "dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggEBAJNl9jeD\n"
        + "lQ9ew4IcH9Z35zyKwKoJ8OkLJvHgwmp1ocd5yblSYMgpEg7wrQPWCcR23+WmgZWn\n"
        + "RtqCV6mVksW2jwMibDN3wXsyF24HzloUQToFJBv2FAY7qCUkDrvMKnXduXBBP3zQ\n"
        + "YzYhBx9G/2CkkeFnvN4ffhkUyWNnkepnB2u0j4vAbkN9w6GAbLIevFOFfdyQoaS8\n"
        + "Le9Gclc1Bb+7RrtubTeZtv8jkpHGbkD4jylW6l/VXxRTrPBPYer3IsynVgviuDQf\n"
        + "Jtl7GQVoP7o81DgGotPmjw7jtHFtQELFhLRAlSv0ZaBIefYdgWOWnU914Ph85I6p\n"
        + "0fKtirOMxyHNwu8=\n"
        + "-----END CERTIFICATE-----" ;
            
            
            
            
    //r = statement.executeQuery("SELECT userID,private_key,request,pubkey_hash,salt, key_backup"    + " FROM credentials");
        Person robo = new Person(25); 
        manager.generateRequest(robo, "pass");
        System.out.print(firstCert.toString());
        //testDocument1 = manager.importPKCS12(robo, "right.p12", "pass", "123456");
        testDocument1 = manager.importCertificate(robo, firstCert5, content);
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
    Result output = new StreamResult(new File("output.xml"));
    Source input = new DOMSource(testDocument1);
    transformer.transform(input, output);
            
            
        
        
    Document[] allDoc = new Document[]{testDocument1, testDocument2, testDocument3, testDocument4, testDocument5, testDocument6};
        
    int testResult = documentTesting(allDoc, 5, 8);
    switch (testResult) {
        case 1:
            fail("Different results gave same output");
        case 2:
            fail("Data that supposed to give same results didn't");
        case 3:
            fail("One or more object was same with null");
        case 0: {
        }
        
    }
        
        }
        
    */

    private int documentTesting(Document[] testsubject, int diffEnd, int sameEnd) {
        for (int i = 0; i < diffEnd; i++) {
            for (int j = i; j < diffEnd - 1; j++) {
                if (testsubject[i] == testsubject[j + 1]) {
                    return 1;
                    // testing data that are expected do be different
                }
            }

        }
        for (int i = diffEnd; i < sameEnd; i++) {
            for (int j = i; j < sameEnd - 1; j++) {
                if (testsubject[i] != testsubject[j + 1]) {
                    return 2;
                    // testing data that are expected to be same against each other a
                }
            }
        }
        for (int i = sameEnd; i < testsubject.length; i++) {
            for (int j = i; j < testsubject.length - 1; j++) {
                if (testsubject[i] != testsubject[j + 1]) {
                    return 3;
                    // null object testing against each other
                }
            }
        }
        return 0;
    }

    /*
        @Test
        public void testExportPKCS12() throws Exception {
    docInit();
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    manager = new CertificateManagerImpl(configuration);
    manager.setJdbcTemplate((JdbcTemplate) ac.getBean("jdbcTemplate"));
    Security.addProvider(new BouncyCastleProvider());
    Person andreson = new Person(5);
    int cerId = 5; // SELECT certificateId FROM table WHERE Person id = 5 
    testDocument1 = manager.importPKCS12(andreson, "mine.ps12", "weakpassword", "changeit");
    manager.importPKCS12(null, "mine.ps12", "weakpassword", "changeit");
    manager.importPKCS12(new Person(7), "mine.ps12", "weakpassword", "changeit");
    testDocument2 = manager.exportPKCS12(andreson, 5, "weakpassword", "changeit");
    assertEquals(testDocument1, testDocument2);
        
                 
        ResultSet sr = statement.executeQuery("SELECT id FROM credentials WHERE userId = 1");
        sr.next();
        Integer certificateId = sr.getInt("id");
        
            
        
        testDocument2 =  manager.exportPKCS12(anderson, certificateId, andersonDefPass, "123456");
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
            
            
    CertificateManagerImpl instance = new CertificateManagerImpl();
    Document expResult = null;
    Document result = instance.exportPKCS12(null, 0, "", "");
    assertEquals(expResult, result);
        
        }
        
        @Test
        public void testCheckPassword() throws Exception {
    docInit();
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    manager = new CertificateManagerImpl(configuration);
    manager.setJdbcTemplate((JdbcTemplate) ac.getBean("jdbcTemplate"));
    Security.addProvider(new BouncyCastleProvider());
    Person anderson = new Person(5);
    //manager.generateRequest(anderson, "test");
        
    testDocument1 = manager.checkPassword(new Person(5), 0, "test");
    testDocument2 = manager.checkPassword(anderson, 1, "test");
    testDocument3 = manager.checkPassword(anderson, 0, "Test");
    testDocument4 = manager.checkPassword(null, 0, "test");
    testDocument5 = manager.checkPassword(new Person(6), 0, "test");
    testDocument6 = manager.checkPassword(anderson, 0, "test");
        
    Document[] allDoc = new Document[]{testDocument1, testDocument2, testDocument3, testDocument4, testDocument5, testDocument6};
        
    int testResult = documentTesting(allDoc, 2, 3);
    switch (testResult) {
        case 1:
            fail("Different results gave same output");
        case 2:
            fail("Data that supposed to give same results didn't");
        case 3:
            fail("One or more object was same with null");
        case 0: {
        }
        
    }
    assertEquals("test", testDocument6.getElementsByTagName("password")); // possibli password or passHash  
        
        }
    */
    private void docInit() {
        testDocument1 = null;
        testDocument2 = null;
        testDocument3 = null;
        testDocument4 = null;
        testDocument5 = null;
        testDocument6 = null;
        testDocument7 = null;
        testDocument8 = null;
        testDocument9 = null;
    }

    /*
        @Test
        public void testChangePassword() throws Exception {
    docInit();
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    manager = new CertificateManagerImpl(configuration);
    manager.setJdbcTemplate((JdbcTemplate) ac.getBean("jdbcTemplate"));
    Person anderson = new Person(5);
    int certid = 0;
        
    //testDocument1 = manager.generateRequest(anderson, "oldpass");
    try {
        manager.changePassword(null, certid, "oldpass", "newpass");
    } catch (NullPointerException e) {
        fail("Nullpoiter when person was null exception was thrown " + e);
    }
    testDocument4 = manager.checkPassword(anderson, certid, "oldpass");
    testDocument2 = manager.changePassword(anderson, certid, "oldpass", "newpass");
    testDocument3 = manager.checkPassword(anderson, certid, "newpass");
    assertFalse(testDocument4 == testDocument3);
    assertEquals("newpass", testDocument3.getElementsByTagName("password"));
    manager.changePassword(anderson, certid, "newpass", "oldpass");
    testDocument5 = manager.checkPassword(anderson, certid, "oldpass");
    assertEquals(testDocument4, testDocument5);
        
        }
    */
    /** 
     * Exports current database into xml document output as FirstParameter
     * 
     * exportXml(working.xml);
     * @param FileNameOutput
     * @throws Exception 
     */
    public void exportsDatabaseIntoXml(String fileNameOutput) throws Exception {
        Class driverClass = Class.forName("com.mysql.jdbc.Driver");
        Connection jdbcConnection = DriverManager
                .getConnection("jdbc:mysql://localhost:3306/Remsig?zeroDateTimeBehavior=convertToNull", "root", "");

        //FlatDtdDataSet.write(jdbcConnection.createDataSet(), new FileOutputStream("test.dtd"));
        IDatabaseConnection connection = new DatabaseConnection(jdbcConnection);
        QueryDataSet partialDataSet = new QueryDataSet(connection);
        partialDataSet.addTable("Remsig", "select * from credentials;");
        int multi = 5;
        FlatXmlDataSet.write(partialDataSet, new FileOutputStream("partial" + multi + ".xml"));

        IDataSet fullDataSet = connection.createDataSet();
        FlatXmlDataSet.write(fullDataSet, new FileOutputStream(fileNameOutput));
        //FlatXmlDataSet.write(fullDataSet, new FileOutputStream("initDatabase.xml"));
    }

    /**
     * Test of importCertificate method, of class CertificateManagerImpl.
     */
}