// 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 com.cloud.hypervisor.ovm3.objects;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

public class PoolTest {
    ConnectionTest con = new ConnectionTest();
    Pool pool = new Pool(con);
    XmlTestResultTest results = new XmlTestResultTest();

    private String UUID = "0004fb0000020000ba9aaf00ae5e2d73";
    private String BOGUSUUID = "deadbeefdeadbeefdeadbeefdeadbeef";
    private String VIP = "192.168.1.230";
    private String ALIAS = "Pool 0";
    private String HOST = "ovm-1";
    private String HOST2 = "ovm-2";
    private String IP = "192.168.1.64";
    private String IP2 = "192.168.1.65";
    private String EMPTY = results.escapeOrNot("<?xml version=\"1.0\" ?>"
            + "<Discover_Server_Pool_Result/>");
    private String DISCOVERPOOL = results
            .escapeOrNot("<?xml version=\"1.0\" ?>"
                    + "<Discover_Server_Pool_Result>" + "  <Server_Pool>"
                    + "    <Unique_Id>"
                    + UUID
                    + "</Unique_Id>"
                    + "    <Pool_Alias>"
                    + ALIAS
                    + "</Pool_Alias>"
                    + "    <Master_Virtual_Ip>"
                    + VIP
                    + "</Master_Virtual_Ip>"
                    + "    <Member_List>"
                    + "      <Member>"
                    + "        <Registered_IP>"
                    + IP
                    + "</Registered_IP>"
                    + "      </Member>"
                    + "      <Member>"
                    + "        <Registered_IP>"
                    + IP2
                    + "</Registered_IP>"
                    + "      </Member>"
                    + "    </Member_List>"
                    + "  </Server_Pool>" + "</Discover_Server_Pool_Result>");


    @Test
    public void testDiscoverServerPool() throws Ovm3ResourceException {
        con.setResult(results.simpleResponseWrapWrapper(EMPTY));
        results.basicBooleanTest(pool.isInAPool(), false);
        results.basicBooleanTest(pool.isInPool(UUID), false);
        results.basicBooleanTest(pool.discoverServerPool(), false);
        results.basicBooleanTest(pool.isInPool(UUID), false);
        con.setResult(results.simpleResponseWrapWrapper(DISCOVERPOOL));
        results.basicBooleanTest(pool.discoverServerPool());
        results.basicBooleanTest(pool.isInAPool(), true);
        results.basicBooleanTest(pool.isInPool(UUID), true);
        results.basicStringTest(pool.getPoolId(), UUID);
        results.basicStringTest(pool.getPoolId(), UUID);
        results.basicStringTest(pool.getPoolAlias(), ALIAS);
        results.basicStringTest(pool.getPoolMasterVip(), VIP);
        results.basicBooleanTest(pool.getPoolMemberList().contains(IP));
        results.basicBooleanTest(pool.getPoolMemberList().contains(IP2));
    }

    @Test
    public void poolMembers() throws Ovm3ResourceException {
        List<String> poolHosts = new ArrayList<String>();
        poolHosts.add(IP);
        poolHosts.add(IP2);
        con.setResult(results.simpleResponseWrapWrapper(EMPTY));
        results.basicBooleanTest(pool.getPoolMemberList().contains(IP), false);

        con.setResult(results.simpleResponseWrapWrapper(DISCOVERPOOL));
        results.basicBooleanTest(pool.discoverServerPool());
        con.setResult(results.getNil());
        results.basicBooleanTest(pool.removePoolMember(IP), true);
        results.basicBooleanTest(pool.addPoolMember(IP), true);
        results.basicBooleanTest(pool.setPoolMemberList(poolHosts), true);
    }

    @Test
    public void testCreateServerPool() throws Ovm3ResourceException {
        con.setResult(results.getNil());
        results.basicBooleanTest(
                pool.createServerPool(ALIAS, UUID, VIP, 1, HOST, IP), true);
        con.setResult(results.simpleResponseWrapWrapper(DISCOVERPOOL));
        results.basicBooleanTest(pool.discoverServerPool());
        results.basicBooleanTest(
                pool.createServerPool(ALIAS, UUID, VIP, 1, HOST, IP), true);

    }

    @Test(expected = Ovm3ResourceException.class)
    public void testCreateServerPoolFail1() throws Ovm3ResourceException {
        con.setResult(results.simpleResponseWrapWrapper(DISCOVERPOOL));
        results.basicBooleanTest(
                pool.createServerPool(ALIAS, BOGUSUUID, VIP, 1, HOST, IP),
                false);
    }

    @Test(expected = Ovm3ResourceException.class)
    public void testCreateServerPoolFail2() throws Ovm3ResourceException {
        con.setResult(results.errorResponseWrap(1,
                "exceptions.Exception:Repository already exists"));
        results.basicBooleanTest(
                pool.createServerPool(ALIAS, UUID, VIP, 1, HOST, IP), false);
    }

    @Test
    public void testJoinServerPool() throws Ovm3ResourceException {
        con.setResult(results.getNil());
        Integer poolsize = 2;
        results.basicBooleanTest(
                pool.joinServerPool(ALIAS, UUID, VIP, poolsize, HOST2, IP2),
                true);
        con.setResult(results.simpleResponseWrapWrapper(DISCOVERPOOL));
        results.basicBooleanTest(pool.discoverServerPool());
        results.basicBooleanTest(
                pool.joinServerPool(ALIAS, UUID, VIP, poolsize, HOST2, IP2),
                true);
    }
    @Test(expected = Ovm3ResourceException.class)
    public void testJoinServerPoolFail1() throws Ovm3ResourceException {
        Integer poolsize = 2;
        con.setResult(results.simpleResponseWrapWrapper(DISCOVERPOOL));
        results.basicBooleanTest(pool.joinServerPool(ALIAS, BOGUSUUID, VIP,
                poolsize, HOST2, IP2), false);
    }

    @Test(expected = Ovm3ResourceException.class)
    public void testJoinServerPoolFail() throws Ovm3ResourceException {
        con.setResult(results
                .errorResponseWrap(1,
                        "exceptions.Exception:Server already a member of pool: "
                                + UUID));
        Integer poolsize = 2;
        results.basicBooleanTest(pool.joinServerPool(ALIAS, UUID, VIP, poolsize,
                HOST2, IP2), false);
    }

    @Test
    public void testValidPoolRoles() throws Ovm3ResourceException {
        con.setResult(results.getNil());
        results.basicBooleanTest(pool.setServerRoles(pool.getValidRoles()),
                true);

    }

    @Test(expected = Ovm3ResourceException.class)
    public void testValidPoolRolesInvalid() throws Ovm3ResourceException {
        String broken = "broken_token";
        con.setResult(results
                .errorResponseWrap(1,
                "exceptions.Exception:Invalid roles: set(['xen', '" + broken
                        + "', 'utility'])"));
        results.basicBooleanTest(pool.setServerRoles(pool.getValidRoles()),
                false);
    }
}
