/**
 * 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.pinot.integration.tests;

import com.google.common.collect.ImmutableMap;
import java.util.Map;
import org.apache.helix.zookeeper.constant.ZkSystemPropertyKeys;
import org.apache.pinot.common.utils.helix.HelixHelper;
import org.apache.pinot.util.TestUtils;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;


/**
 * This test is created to show the bug in Helix 0.9.8 that if a ZooKeeper IdealState is larger than 1MB after
 * compression, it cannot be updated anymore. Somehow this test can also make sure in future we will support
 * large IdealStates
 */
public class HelixZNodeSizeLimitTest extends BaseClusterIntegrationTest {

  @BeforeClass
  public void setUp()
      throws Exception {
    // This line of code has to be executed before the org.apache.helix.zookeeper.zkclient.ZkClient.WRITE_SIZE_LIMIT
    // is initialized. The code is in:
    // https://github.com/apache/helix/blob/master/zookeeper-api/
    // src/main/java/org/apache/helix/zookeeper/zkclient/ZkClient.java#L105
    // The below line gets executed before ZkClient.WRITE_SIZE_LIMIT is created
    System.setProperty(ZkSystemPropertyKeys.JUTE_MAXBUFFER, "4000000");

    TestUtils.ensureDirectoriesExistAndEmpty(_tempDir);

    // Start Zookeeper
    startZk();
    startController();
    startBroker();
    startServer();
    addSchema(createSchema());
    addTableConfig(createOfflineTableConfig());
  }

  @AfterClass(alwaysRun = true)
  public void tearDown()
      throws Exception {
    stopServer();
    stopBroker();
    stopController();
    stopZk();
  }

  @Test
  public void testUpdateIdealState() {
    // In Helix 0.9.8, we get error logs like below:
    // 13:03:51.576 ERROR [ZkBaseDataAccessor] [main] Exception while setting path:
    // /HelixZNodeSizeLimitTest/IDEALSTATES/mytable_OFFLINE
    //  org.apache.helix.HelixException: Data size larger than 1M
    //  at org.apache.helix.manager.zk.zookeeper.ZkClient.checkDataSizeLimit(ZkClient.java:1513) ~[helix-core-0.9.8
    //  .jar:0.9.8]
    //  at org.apache.helix.manager.zk.zookeeper.ZkClient.writeDataReturnStat(ZkClient.java:1406) ~[helix-core-0.9.8
    //  .jar:0.9.8]
    String tableNameWithType = getTableName() + "_OFFLINE";
    System.setProperty(ZkSystemPropertyKeys.ZK_SERIALIZER_ZNRECORD_WRITE_SIZE_LIMIT_BYTES, "4000000");
    // The updated IdealState after compression is roughly 2MB
    try {
      HelixHelper.updateIdealState(_helixManager, tableNameWithType, idealState -> {
        Map<String, Map<String, String>> currentAssignment = idealState.getRecord().getMapFields();
        for (int i = 0; i < 500_000; i++) {
          currentAssignment.put("segment_" + i,
              ImmutableMap.of("Server_with_some_reasonable_long_prefix_" + (i % 10), "ONLINE"));
          currentAssignment.put("segment_" + i,
              ImmutableMap.of("Server_with_some_reasonable_long_prefix_" + (i % 9), "ONLINE"));
        }
        return idealState;
      });
    } catch (Exception e) {
      Assert.fail("Exception shouldn't be thrown even if the data size of the ideal state is larger than 1M");
    }
  }
}
