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

import static org.junit.Assert.assertEquals;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.testclassification.LargeTests;
import org.apache.hadoop.hbase.testclassification.MiscTests;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;

@Category({ MiscTests.class, LargeTests.class })
public class TestFullLogReconstruction {

  private final static HBaseTestingUtility
      TEST_UTIL = new HBaseTestingUtility();

  private final static TableName TABLE_NAME = TableName.valueOf("tabletest");
  private final static byte[] FAMILY = Bytes.toBytes("family");

  /**
   * @throws java.lang.Exception
   */
  @BeforeClass
  public static void setUpBeforeClass() throws Exception {
    Configuration c = TEST_UTIL.getConfiguration();
    // quicker heartbeat interval for faster DN death notification
    c.setInt("dfs.namenode.heartbeat.recheck-interval", 5000);
    c.setInt("dfs.heartbeat.interval", 1);
    c.setInt("dfs.client.socket-timeout", 5000);
    // faster failover with cluster.shutdown();fs.close() idiom
    c.setInt("hbase.ipc.client.connect.max.retries", 1);
    c.setInt("dfs.client.block.recovery.retries", 1);
    c.setInt(HConstants.ZK_SESSION_TIMEOUT, 1000);
    TEST_UTIL.startMiniCluster(3);
  }

  /**
   * @throws java.lang.Exception
   */
  @AfterClass
  public static void tearDownAfterClass() throws Exception {
    TEST_UTIL.shutdownMiniCluster();
  }

  /**
   * Test the whole reconstruction loop. Build a table with regions aaa to zzz
   * and load every one of them multiple times with the same date and do a flush
   * at some point. Kill one of the region servers and scan the table. We should
   * see all the rows.
   * @throws Exception
   */
  @Test (timeout=300000)
  public void testReconstruction() throws Exception {
    Table table = TEST_UTIL.createMultiRegionTable(TABLE_NAME, FAMILY);

    // Load up the table with simple rows and count them
    int initialCount = TEST_UTIL.loadTable(table, FAMILY);
    int count = TEST_UTIL.countRows(table);

    assertEquals(initialCount, count);

    for(int i = 0; i < 4; i++) {
      TEST_UTIL.loadTable(table, FAMILY);
    }

    TEST_UTIL.expireRegionServerSession(0);
    int newCount = TEST_UTIL.countRows(table);
    assertEquals(count, newCount);
    table.close();
  }
}
