/**
 * 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.oodt.cas.resource.system;

//JDK imports
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.util.Properties;

//Apache imports
import org.apache.commons.io.FileUtils;

//OODT imports
import org.apache.oodt.cas.resource.structs.exceptions.MonitorException;

//Junit imports
import junit.framework.TestCase;

/**
 *
 * Test harness for the {@link XmlRpcResourceManager}.
 *
 * @author mattmann
 * @author rajith
 * @version $Revision$
 *
 */
public class TestXmlRpcResourceManager extends TestCase {

  private File tmpPolicyDir;

  private XmlRpcResourceManager rm;

  private static final int RM_PORT = 50001;

  /**
   * @since OODT-182
   */
  public void testDynSetNodeCapacity() {
    XmlRpcResourceManagerClient rmc = null;
    try {
      rmc = new XmlRpcResourceManagerClient(new URL("http://localhost:"
          + RM_PORT));
    } catch (Exception e) {
      fail(e.getMessage());
    }

    assertNotNull(rmc);
    try {
      rmc.setNodeCapacity("localhost", 8);
    } catch (MonitorException e) {
      fail(e.getMessage());
    }

    int setCapacity = -1;
    try {
      setCapacity = rmc.getNodeById("localhost").getCapacity();
    } catch (Exception e) {
      fail(e.getMessage());
    }
    assertEquals(8, setCapacity);

  }

  /*
   * (non-Javadoc)
   *
   * @see junit.framework.TestCase#setUp()
   */
  @Override
  protected void setUp() throws Exception {
    generateTestConfiguration();
    this.rm = new XmlRpcResourceManager(RM_PORT);
  }

  /*
   * (non-Javadoc)
   *
   * @see junit.framework.TestCase#tearDown()
   */
  @Override
  protected void tearDown() throws Exception {
    this.rm.shutdown();
    deleteAllFiles(this.tmpPolicyDir.getAbsolutePath());
  }

  private void deleteAllFiles(String startDir) {
    File startDirFile = new File(startDir);
    File[] delFiles = startDirFile.listFiles();

    if (delFiles != null && delFiles.length > 0) {
      for (int i = 0; i < delFiles.length; i++) {
        delFiles[i].delete();
      }
    }

    startDirFile.delete();

  }

    private void generateTestConfiguration() throws IOException {
    Properties config = new Properties();

    String propertiesFile = "." + File.separator + "src" + File.separator +
            "test" + File.separator + "resources" + File.separator + "test.resource.properties";
    System.getProperties().load(new FileInputStream(new File(propertiesFile)));

    // stage policy
    File tmpPolicyDir = null;
    try {
      tmpPolicyDir = File.createTempFile("test", "ignore").getParentFile();
    } catch (Exception e) {
      fail(e.getMessage());
    }
    for (File policyFile : new File("./src/test/resources/policy")
        .listFiles(new FileFilter() {

          @Override
          public boolean accept(File pathname) {
            return pathname.isFile() && pathname.getName().endsWith(".xml");
          }
        })) {
      try {
        FileUtils.copyFileToDirectory(policyFile, tmpPolicyDir);
      } catch (Exception e) {
        fail(e.getMessage());
      }
    }

    config.setProperty("org.apache.oodt.cas.resource.nodes.dirs", tmpPolicyDir
        .toURI().toString());
    config.setProperty("org.apache.oodt.cas.resource.nodetoqueues.dirs",
        tmpPolicyDir.toURI().toString());

    System.getProperties().putAll(config);
    this.tmpPolicyDir = tmpPolicyDir;
  }

}
