content: /*
   * 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.carbondata.core;
  
  import java.lang.reflect.InvocationTargetException;
  import java.lang.reflect.Method;
  
  import org.apache.carbondata.core.constants.CarbonCommonConstants;
  import org.apache.carbondata.core.util.CarbonProperties;
  
  import junit.framework.TestCase;
  import org.junit.Test;
  
  /**
   * Method to test the carbon common constant configurations.
   */
  public class CarbonPropertiesValidationTest extends TestCase {
  
    CarbonProperties carbonProperties;
  
    @Override
    public void setUp() throws Exception {
      carbonProperties = CarbonProperties.getInstance();
    }
  
    @Test public void testValidateLockType()
        throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
      Method validateMethodType = carbonProperties.getClass().getDeclaredMethod("validateLockType");
      validateMethodType.setAccessible(true);
      carbonProperties.addProperty(CarbonCommonConstants.LOCK_TYPE, "xyz");
      String valueBeforeValidation = carbonProperties.getProperty(CarbonCommonConstants.LOCK_TYPE);
      validateMethodType.invoke(carbonProperties);
      String valueAfterValidation = carbonProperties.getProperty(CarbonCommonConstants.LOCK_TYPE);
      assertTrue(!valueBeforeValidation.equals(valueAfterValidation));
      assertTrue(CarbonCommonConstants.CARBON_LOCK_TYPE_LOCAL.equalsIgnoreCase(valueAfterValidation));
    }
  
    @Test public void testValidateEnableUnsafeSort()
        throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
      Method validateMethodType =
          carbonProperties.getClass().getDeclaredMethod("validateEnableUnsafeSort");
      validateMethodType.setAccessible(true);
      carbonProperties.addProperty(CarbonCommonConstants.ENABLE_UNSAFE_SORT, "xyz");
      String valueBeforeValidation =
          carbonProperties.getProperty(CarbonCommonConstants.ENABLE_UNSAFE_SORT);
      validateMethodType.invoke(carbonProperties);
      String valueAfterValidation =
          carbonProperties.getProperty(CarbonCommonConstants.ENABLE_UNSAFE_SORT);
      assertTrue(valueBeforeValidation.equals(valueAfterValidation));
      assertTrue(
          CarbonCommonConstants.ENABLE_UNSAFE_SORT_DEFAULT.equalsIgnoreCase(valueAfterValidation));
    }
  
    @Test public void testValidateEnableMV()
        throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
      Method validateMethodType =
          carbonProperties.getClass().getDeclaredMethod("validateEnableMV");
      validateMethodType.setAccessible(true);
      carbonProperties.addProperty(CarbonCommonConstants.CARBON_ENABLE_MV, "xyz");
      String valueBeforeValidation =
          carbonProperties.getProperty(CarbonCommonConstants.CARBON_ENABLE_MV);
      validateMethodType.invoke(carbonProperties);
      String valueAfterValidation =
          carbonProperties.getProperty(CarbonCommonConstants.CARBON_ENABLE_MV);
      assertTrue(valueBeforeValidation.equals("xyz"));
      assertTrue(
          CarbonCommonConstants.CARBON_ENABLE_MV_DEFAULT.equalsIgnoreCase(valueAfterValidation));
    }
  
    @Test public void testValidateEnableOffHeapSort()
        throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
      Method validateMethodType =
          carbonProperties.getClass().getDeclaredMethod("validateEnableOffHeapSort");
      validateMethodType.setAccessible(true);
      carbonProperties.addProperty(CarbonCommonConstants.ENABLE_OFFHEAP_SORT, "True");
      assert (carbonProperties.getProperty(CarbonCommonConstants.ENABLE_OFFHEAP_SORT)
          .equalsIgnoreCase("true"));
      carbonProperties.addProperty(CarbonCommonConstants.ENABLE_OFFHEAP_SORT, "false");
      assert (carbonProperties.getProperty(CarbonCommonConstants.ENABLE_OFFHEAP_SORT)
          .equalsIgnoreCase("false"));
      carbonProperties.addProperty(CarbonCommonConstants.ENABLE_OFFHEAP_SORT, "xyz");
      assert (carbonProperties.getProperty(CarbonCommonConstants.ENABLE_OFFHEAP_SORT)
          .equalsIgnoreCase("true"));
      String valueBeforeValidation =
          carbonProperties.getProperty(CarbonCommonConstants.ENABLE_OFFHEAP_SORT);
      validateMethodType.invoke(carbonProperties);
      String valueAfterValidation =
          carbonProperties.getProperty(CarbonCommonConstants.ENABLE_OFFHEAP_SORT);
      assertTrue(valueBeforeValidation.equals(valueAfterValidation));
      assertTrue(
          CarbonCommonConstants.ENABLE_OFFHEAP_SORT_DEFAULT.equalsIgnoreCase(valueAfterValidation));
    }
  
    @Test public void testValidateCustomBlockDistribution()
        throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
      Method validateMethodType =
          carbonProperties.getClass().getDeclaredMethod("validateCustomBlockDistribution");
      validateMethodType.setAccessible(true);
      carbonProperties.addProperty(CarbonCommonConstants.CARBON_CUSTOM_BLOCK_DISTRIBUTION, "xyz");
      String valueBeforeValidation =
          carbonProperties.getProperty(CarbonCommonConstants.CARBON_CUSTOM_BLOCK_DISTRIBUTION);
      validateMethodType.invoke(carbonProperties);
      String valueAfterValidation =
          carbonProperties.getProperty(CarbonCommonConstants.CARBON_CUSTOM_BLOCK_DISTRIBUTION);
      assertTrue(valueBeforeValidation.equals(valueAfterValidation));
      assertTrue("false"
          .equalsIgnoreCase(valueAfterValidation));
    }
  
    @Test public void testValidateEnableVectorReader()
        throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
      Method validateMethodType =
          carbonProperties.getClass().getDeclaredMethod("validateEnableVectorReader");
      validateMethodType.setAccessible(true);
      carbonProperties.addProperty(CarbonCommonConstants.ENABLE_VECTOR_READER, "xyz");
      String valueBeforeValidation =
          carbonProperties.getProperty(CarbonCommonConstants.ENABLE_VECTOR_READER);
      validateMethodType.invoke(carbonProperties);
      String valueAfterValidation =
          carbonProperties.getProperty(CarbonCommonConstants.ENABLE_VECTOR_READER);
      assertTrue(valueBeforeValidation.equals(valueAfterValidation));
      assertTrue(
          CarbonCommonConstants.ENABLE_VECTOR_READER_DEFAULT.equalsIgnoreCase(valueAfterValidation));
    }
  
    @Test public void testValidateCarbonCSVReadBufferSizeByte()
        throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
      Method validateMethodType =
          carbonProperties.getClass().getDeclaredMethod("validateCarbonCSVReadBufferSizeByte");
      validateMethodType.setAccessible(true);
      carbonProperties.addProperty(CarbonCommonConstants.CSV_READ_BUFFER_SIZE, "xyz");
      String valueBeforeValidation =
          carbonProperties.getProperty(CarbonCommonConstants.CSV_READ_BUFFER_SIZE);
      validateMethodType.invoke(carbonProperties);
      String valueAfterValidation =
          carbonProperties.getProperty(CarbonCommonConstants.CSV_READ_BUFFER_SIZE);
      assertTrue(valueBeforeValidation.equals(valueAfterValidation));
      assertTrue(
          CarbonCommonConstants.CSV_READ_BUFFER_SIZE_DEFAULT.equalsIgnoreCase(valueAfterValidation));
    }
  
    @Test public void testValidateCarbonCSVReadBufferSizeByteRange()
        throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
      Method validateMethodType =
          carbonProperties.getClass().getDeclaredMethod("validateCarbonCSVReadBufferSizeByte");
      validateMethodType.setAccessible(true);
      carbonProperties.addProperty(CarbonCommonConstants.CSV_READ_BUFFER_SIZE, "10485761");
      String valueBeforeValidation =
          carbonProperties.getProperty(CarbonCommonConstants.CSV_READ_BUFFER_SIZE);
      validateMethodType.invoke(carbonProperties);
      String valueAfterValidation =
          carbonProperties.getProperty(CarbonCommonConstants.CSV_READ_BUFFER_SIZE);
      assertTrue(valueBeforeValidation.equals(valueAfterValidation));
      assertTrue(
          CarbonCommonConstants.CSV_READ_BUFFER_SIZE_DEFAULT.equalsIgnoreCase(valueAfterValidation));
      carbonProperties.addProperty(CarbonCommonConstants.CSV_READ_BUFFER_SIZE, "10240");
      valueBeforeValidation =
          carbonProperties.getProperty(CarbonCommonConstants.CSV_READ_BUFFER_SIZE);
      validateMethodType.invoke(carbonProperties);
      valueAfterValidation =
          carbonProperties.getProperty(CarbonCommonConstants.CSV_READ_BUFFER_SIZE);
      assertTrue(valueBeforeValidation.equals(valueAfterValidation));
      carbonProperties.addProperty(CarbonCommonConstants.CSV_READ_BUFFER_SIZE, "10239");
      valueBeforeValidation =
          carbonProperties.getProperty(CarbonCommonConstants.CSV_READ_BUFFER_SIZE);
      validateMethodType.invoke(carbonProperties);
      valueAfterValidation =
          carbonProperties.getProperty(CarbonCommonConstants.CSV_READ_BUFFER_SIZE);
      assertTrue(valueBeforeValidation.equals(valueAfterValidation));
      assertTrue(
          CarbonCommonConstants.CSV_READ_BUFFER_SIZE_DEFAULT.equalsIgnoreCase(valueAfterValidation));
    }
  
    @Test public void testValidateHandoffSize() {
      assertEquals(CarbonCommonConstants.HANDOFF_SIZE_DEFAULT, carbonProperties.getHandoffSize());
      long newSize = 1024L * 1024 * 100;
      carbonProperties.addProperty(CarbonCommonConstants.HANDOFF_SIZE, "" + newSize);
      assertEquals(newSize, carbonProperties.getHandoffSize());
    }
  
    @Test public void testValidateTimeStampFormat()
        throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
      Method validateMethodType = carbonProperties.getClass()
          .getDeclaredMethod("validateTimeFormatKey", new Class[] { String.class, String.class });
      validateMethodType.setAccessible(true);
      carbonProperties.addProperty(CarbonCommonConstants.CARBON_TIMESTAMP_FORMAT, "agdgaJIASDG667");
      String valueBeforeValidation =
          carbonProperties.getProperty(CarbonCommonConstants.CARBON_TIMESTAMP_FORMAT);
      validateMethodType.invoke(carbonProperties, CarbonCommonConstants.CARBON_TIMESTAMP_FORMAT,
          CarbonCommonConstants.CARBON_TIMESTAMP_DEFAULT_FORMAT);
      String valueAfterValidation =
          carbonProperties.getProperty(CarbonCommonConstants.CARBON_TIMESTAMP_FORMAT);
      assertTrue(valueBeforeValidation.equals(valueAfterValidation));
      assertTrue(CarbonCommonConstants.CARBON_TIMESTAMP_DEFAULT_FORMAT
          .equalsIgnoreCase(valueAfterValidation));
      carbonProperties.addProperty(CarbonCommonConstants.CARBON_TIMESTAMP_FORMAT,
          "yyyy-MM-dd hh:mm:ss");
      validateMethodType.invoke(carbonProperties, CarbonCommonConstants.CARBON_TIMESTAMP_FORMAT,
          CarbonCommonConstants.CARBON_TIMESTAMP_DEFAULT_FORMAT);
      assertEquals("yyyy-MM-dd hh:mm:ss",
          carbonProperties.getProperty(CarbonCommonConstants.CARBON_TIMESTAMP_FORMAT));
    }
  
    @Test public void testValidateSortFileWriteBufferSize()
        throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
      Method validateMethodType =
          carbonProperties.getClass().getDeclaredMethod("validateSortFileWriteBufferSize");
      validateMethodType.setAccessible(true);
      carbonProperties.addProperty(CarbonCommonConstants.CARBON_SORT_FILE_WRITE_BUFFER_SIZE, "test");
      String valueBeforeValidation =
          carbonProperties.getProperty(CarbonCommonConstants.CARBON_SORT_FILE_WRITE_BUFFER_SIZE);
      validateMethodType.invoke(carbonProperties);
      String valueAfterValidation =
          carbonProperties.getProperty(CarbonCommonConstants.CARBON_SORT_FILE_WRITE_BUFFER_SIZE);
      assertTrue(valueBeforeValidation.equals(valueAfterValidation));
      assertTrue(CarbonCommonConstants.CARBON_SORT_FILE_WRITE_BUFFER_SIZE_DEFAULT_VALUE
          .equalsIgnoreCase(valueAfterValidation));
    }
    @Test public void testValidateSortIntermediateFilesLimit()
        throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
      Method validateMethodType =
          carbonProperties.getClass().getDeclaredMethod("validateSortIntermediateFilesLimit");
      validateMethodType.setAccessible(true);
      carbonProperties.addProperty(CarbonCommonConstants.SORT_INTERMEDIATE_FILES_LIMIT, "test");
      String valueBeforeValidation =
          carbonProperties.getProperty(CarbonCommonConstants.SORT_INTERMEDIATE_FILES_LIMIT);
      validateMethodType.invoke(carbonProperties);
      String valueAfterValidation =
          carbonProperties.getProperty(CarbonCommonConstants.SORT_INTERMEDIATE_FILES_LIMIT);
      assertTrue(valueBeforeValidation.equals(valueAfterValidation));
      assertTrue(CarbonCommonConstants.SORT_INTERMEDIATE_FILES_LIMIT_DEFAULT_VALUE
          .equalsIgnoreCase(valueAfterValidation));
    }
  
    @Test public void testValidateDynamicSchedulerTimeOut() {
      carbonProperties
          .addProperty(CarbonCommonConstants.CARBON_DYNAMIC_ALLOCATION_SCHEDULER_TIMEOUT, "2");
      String valueAfterValidation = carbonProperties
          .getProperty(CarbonCommonConstants.CARBON_DYNAMIC_ALLOCATION_SCHEDULER_TIMEOUT);
      assertTrue(valueAfterValidation
          .equals(CarbonCommonConstants.CARBON_DYNAMIC_ALLOCATION_SCHEDULER_TIMEOUT_DEFAULT));
      carbonProperties
          .addProperty(CarbonCommonConstants.CARBON_DYNAMIC_ALLOCATION_SCHEDULER_TIMEOUT, "16");
      valueAfterValidation = carbonProperties
          .getProperty(CarbonCommonConstants.CARBON_DYNAMIC_ALLOCATION_SCHEDULER_TIMEOUT);
      assertTrue(valueAfterValidation
          .equals(CarbonCommonConstants.CARBON_DYNAMIC_ALLOCATION_SCHEDULER_TIMEOUT_DEFAULT));
      carbonProperties
          .addProperty(CarbonCommonConstants.CARBON_DYNAMIC_ALLOCATION_SCHEDULER_TIMEOUT, "15");
      valueAfterValidation = carbonProperties
          .getProperty(CarbonCommonConstants.CARBON_DYNAMIC_ALLOCATION_SCHEDULER_TIMEOUT);
      assertTrue(valueAfterValidation
          .equals("15"));
  
    }
    @Test public void testValidateSchedulerMinRegisteredRatio() {
      carbonProperties
          .addProperty(CarbonCommonConstants.CARBON_SCHEDULER_MIN_REGISTERED_RESOURCES_RATIO, "0.0");
      String valueAfterValidation = carbonProperties
          .getProperty(CarbonCommonConstants.CARBON_SCHEDULER_MIN_REGISTERED_RESOURCES_RATIO);
      assertTrue(valueAfterValidation
          .equals(CarbonCommonConstants.CARBON_SCHEDULER_MIN_REGISTERED_RESOURCES_RATIO_DEFAULT));
      carbonProperties
          .addProperty(CarbonCommonConstants.CARBON_SCHEDULER_MIN_REGISTERED_RESOURCES_RATIO, "-0.1");
      valueAfterValidation = carbonProperties
          .getProperty(CarbonCommonConstants.CARBON_SCHEDULER_MIN_REGISTERED_RESOURCES_RATIO);
      assertTrue(valueAfterValidation
          .equals(CarbonCommonConstants.CARBON_SCHEDULER_MIN_REGISTERED_RESOURCES_RATIO_DEFAULT));
      carbonProperties
          .addProperty(CarbonCommonConstants.CARBON_SCHEDULER_MIN_REGISTERED_RESOURCES_RATIO, "0.1");
      valueAfterValidation = carbonProperties
          .getProperty(CarbonCommonConstants.CARBON_SCHEDULER_MIN_REGISTERED_RESOURCES_RATIO);
      assertTrue(valueAfterValidation.equals("0.1"));
    }
  
  }
  