/**
 * 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.hadoop.util;

import java.io.IOException;

import org.apache.hadoop.util.CacheableIPList;
import org.apache.hadoop.util.FileBasedIPList;


import junit.framework.TestCase;

public class TestCacheableIPList extends TestCase {

  /**
   * Add a bunch of subnets and IPSs to the file
   * setup a low cache refresh
   * test for inclusion
   * Check for exclusion
   * Add a bunch of subnets and Ips
   * wait for cache timeout.
   * test for inclusion
   * Check for exclusion
   */
  public void testAddWithSleepForCacheTimeout() throws IOException, InterruptedException {

    String[] ips = {"10.119.103.112", "10.221.102.0/23", "10.113.221.221"};

    TestFileBasedIPList.createFileWithEntries ("ips.txt", ips);

    CacheableIPList cipl = new CacheableIPList(
        new FileBasedIPList("ips.txt"),100);

    assertFalse("10.113.221.222 is in the list",
        cipl.isIn("10.113.221.222"));
    assertFalse ("10.222.103.121 is  in the list",
        cipl.isIn("10.222.103.121"));

    TestFileBasedIPList.removeFile("ips.txt");
    String[]ips2 = {"10.119.103.112", "10.221.102.0/23",
        "10.222.0.0/16", "10.113.221.221", "10.113.221.222"};

    TestFileBasedIPList.createFileWithEntries ("ips.txt", ips2);
    Thread.sleep(101);

    assertTrue("10.113.221.222 is not in the list",
        cipl.isIn("10.113.221.222"));
    assertTrue ("10.222.103.121 is not in the list",
        cipl.isIn("10.222.103.121"));

    TestFileBasedIPList.removeFile("ips.txt");
  }

  /**
   * Add a bunch of subnets and IPSs to the file
   * setup a low cache refresh
   * test for inclusion
   * Check for exclusion
   * Remove a bunch of subnets and Ips
   * wait for cache timeout.
   * test for inclusion
   * Check for exclusion
   */
  public void testRemovalWithSleepForCacheTimeout() throws IOException, InterruptedException {

    String[] ips = {"10.119.103.112", "10.221.102.0/23",
        "10.222.0.0/16", "10.113.221.221", "10.113.221.222"};

    TestFileBasedIPList.createFileWithEntries ("ips.txt", ips);

    CacheableIPList cipl = new CacheableIPList(
        new FileBasedIPList("ips.txt"),100);

    assertTrue("10.113.221.222 is not in the list",
        cipl.isIn("10.113.221.222"));
    assertTrue ("10.222.103.121 is not in the list",
        cipl.isIn("10.222.103.121"));

    TestFileBasedIPList.removeFile("ips.txt");
    String[]ips2 = {"10.119.103.112", "10.221.102.0/23", "10.113.221.221"};

    TestFileBasedIPList.createFileWithEntries ("ips.txt", ips2);
    Thread.sleep(1005);

    assertFalse("10.113.221.222 is in the list",
        cipl.isIn("10.113.221.222"));
    assertFalse ("10.222.103.121 is  in the list",
        cipl.isIn("10.222.103.121"));

    TestFileBasedIPList.removeFile("ips.txt");
  }

  /**
   * Add a bunch of subnets and IPSs to the file
   * setup a low cache refresh
   * test for inclusion
   * Check for exclusion
   * Add a bunch of subnets and Ips
   * do a refresh
   * test for inclusion
   * Check for exclusion
   */
  public void testAddWithRefresh() throws IOException, InterruptedException {

    String[] ips = {"10.119.103.112", "10.221.102.0/23", "10.113.221.221"};

    TestFileBasedIPList.createFileWithEntries ("ips.txt", ips);

    CacheableIPList cipl = new CacheableIPList(
        new FileBasedIPList("ips.txt"),100);

    assertFalse("10.113.221.222 is in the list",
        cipl.isIn("10.113.221.222"));
    assertFalse ("10.222.103.121 is  in the list",
        cipl.isIn("10.222.103.121"));

    TestFileBasedIPList.removeFile("ips.txt");
    String[]ips2 = {"10.119.103.112", "10.221.102.0/23",
        "10.222.0.0/16", "10.113.221.221", "10.113.221.222"};

    TestFileBasedIPList.createFileWithEntries ("ips.txt", ips2);
    cipl.refresh();

    assertTrue("10.113.221.222 is not in the list",
        cipl.isIn("10.113.221.222"));
    assertTrue ("10.222.103.121 is not in the list",
        cipl.isIn("10.222.103.121"));

    TestFileBasedIPList.removeFile("ips.txt");
  }

  /**
   * Add a bunch of subnets and IPSs to the file
   * setup a low cache refresh
   * test for inclusion
   * Check for exclusion
   * Remove a bunch of subnets and Ips
   * wait for cache timeout.
   * test for inclusion
   * Check for exclusion
   */
  public void testRemovalWithRefresh() throws IOException, InterruptedException {

    String[] ips = {"10.119.103.112", "10.221.102.0/23",
        "10.222.0.0/16", "10.113.221.221", "10.113.221.222"};

    TestFileBasedIPList.createFileWithEntries ("ips.txt", ips);

    CacheableIPList cipl = new CacheableIPList(
        new FileBasedIPList("ips.txt"),100);

    assertTrue("10.113.221.222 is not in the list",
        cipl.isIn("10.113.221.222"));
    assertTrue ("10.222.103.121 is not in the list",
        cipl.isIn("10.222.103.121"));

    TestFileBasedIPList.removeFile("ips.txt");
    String[]ips2 = {"10.119.103.112", "10.221.102.0/23", "10.113.221.221"};

    TestFileBasedIPList.createFileWithEntries ("ips.txt", ips2);
    cipl.refresh();

    assertFalse("10.113.221.222 is in the list",
        cipl.isIn("10.113.221.222"));
    assertFalse ("10.222.103.121 is  in the list",
        cipl.isIn("10.222.103.121"));

    TestFileBasedIPList.removeFile("ips.txt");
  }



}
