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

package org.apache.wss4j.dom.message.token;

import org.apache.wss4j.common.bsp.BSPEnforcer;


import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

/**
 * Tests for DerivedKeyToken type.
 */

public class DerivedKeyTokenTest {

    private static final String TEST_TOKEN_TEMPLATE = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            + "<wsc:DerivedKeyToken "
            + "xmlns:wsc=\"http://schemas.xmlsoap.org/ws/2005/02/sc\" xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\" wsu:Id=\"_3\" >"
            + "<wsse:SecurityTokenReference "
            + "xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\" wsu:Id=\"_5002\">"
            + "<wsse:Reference ValueType=\"http://schemas.xmlsoap.org/ws/2005/02/sc/sct\" URI=\"PLACEHOLDER1\" />"
            + "</wsse:SecurityTokenReference>"
            + "<wsc:Offset>0</wsc:Offset>"
            + "<wsc:Length>PLACEHOLDER2</wsc:Length>"
            + "<wsc:Nonce>Kq/1ptgjZpX2g1q6MiJcSfTX</wsc:Nonce>"
            + "<wsc:Label>WS-SecureConversationWS-SecureConversation</wsc:Label>"
            + "<wsc:Generation>3</wsc:Generation>"
            + "<wsc:Properties>"
            + "<wsc:Name>.../derivedKeySource</wsc:Name>"
            + "</wsc:Properties>"
            + "</wsc:DerivedKeyToken>";

    private DerivedKeyToken token;
    private DerivedKeyToken tokenEqual;
    private DerivedKeyToken tokenNotEqual;

    public DerivedKeyTokenTest() throws Exception {
        token = new DerivedKeyToken(createReferenceDocument(
                TEST_TOKEN_TEMPLATE,
                "#uuid-4063ae9b-fe66-4e09-a5fb-8fda903f34d8", "16")
                .getDocumentElement(), new BSPEnforcer());
        tokenEqual = new DerivedKeyToken(createReferenceDocument(
                TEST_TOKEN_TEMPLATE,
                "#uuid-4063ae9b-fe66-4e09-a5fb-8fda903f34d8", "16")
                .getDocumentElement(), new BSPEnforcer());
        tokenNotEqual = new DerivedKeyToken(createReferenceDocument(
                TEST_TOKEN_TEMPLATE,
                "#uuid-5603ae9b-fe66-4e09-a5fb-8fda903f34d8", "88")
                .getDocumentElement(), new BSPEnforcer());
    }

    @Test
    public void testEquals() throws Exception{
        assertTrue(token.equals(tokenEqual));
        assertTrue(tokenEqual.equals(token));
        assertFalse(token.equals(tokenNotEqual));
        assertFalse(token.equals(null));
        assertFalse("string".equals(token));
    }

    @Test
    public void testHashcode() throws Exception{
        assertEquals(token.hashCode(), tokenEqual.hashCode());
        assertFalse(token.hashCode() == tokenNotEqual.hashCode());
    }

    private static org.w3c.dom.Document createReferenceDocument(
            final String template, final String placeholder1,
            final String placeholder2)
            throws javax.xml.parsers.ParserConfigurationException,
            org.xml.sax.SAXException, java.io.IOException {
        final java.io.InputStream in = new java.io.ByteArrayInputStream(
                template.replaceFirst("PLACEHOLDER1", placeholder1)
                        .replaceFirst("PLACEHOLDER2", placeholder2).getBytes());
        final javax.xml.parsers.DocumentBuilderFactory factory = javax.xml.parsers.DocumentBuilderFactory
                .newInstance();
        factory.setNamespaceAware(true);
        final javax.xml.parsers.DocumentBuilder builder = factory
                .newDocumentBuilder();
        return builder.parse(in);
    }
}