From a72c3d685cdd694249b71b6f579a2830b67bf9b1 Mon Sep 17 00:00:00 2001 From: Joey Frazee Date: Wed, 29 Apr 2020 10:16:37 -0500 Subject: [PATCH] NIFI-7372 Added test for ZooKeeperStateServer Signed-off-by: Pierre Villard This closes #4241. --- .../server/TestZooKeeperStateServer.java | 137 ++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/state/server/TestZooKeeperStateServer.java diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/state/server/TestZooKeeperStateServer.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/state/server/TestZooKeeperStateServer.java new file mode 100644 index 0000000000..80cf0fc76b --- /dev/null +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/state/server/TestZooKeeperStateServer.java @@ -0,0 +1,137 @@ +/* + * 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.nifi.controller.state.server.zookeeper; + +import org.apache.curator.retry.RetryOneTime; +import org.apache.curator.test.InstanceSpec; +import org.apache.curator.framework.CuratorFramework; +import org.apache.curator.framework.CuratorFrameworkFactory; + +import org.apache.nifi.util.NiFiProperties; +import org.apache.nifi.properties.StandardNiFiProperties; +import org.apache.nifi.controller.state.server.ZooKeeperStateServer; + +import org.apache.zookeeper.client.FourLetterWordMain; +import org.apache.zookeeper.common.X509Exception.SSLContextException; +import org.apache.zookeeper.data.Stat; +import org.apache.zookeeper.server.quorum.QuorumPeerConfig.ConfigException; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.testng.Assert; + +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; +import java.util.Properties; + +public class TestZooKeeperStateServer { + + private static ZooKeeperStateServer zkServer; + private static Path tempDir; + private static Path dataDir; + private static Path zkServerConfig; + private static int clientPort; + + @BeforeClass + public static void setup() throws IOException, ConfigException { + tempDir = Paths.get("target/TestZooKeeperStateServer"); + dataDir = tempDir.resolve("state"); + zkServerConfig = tempDir.resolve("zookeeper.properties"); + clientPort = InstanceSpec.getRandomPort(); + + Files.createDirectory(tempDir); + + try (final PrintWriter writer = new PrintWriter(zkServerConfig.toFile())) { + writer.println("tickTime=2000"); + writer.println(String.format("dataDir=%s", dataDir)); + writer.println(String.format("clientPort=%d", clientPort)); + writer.println("initLimit=10"); + writer.println("syncLimit=5"); + writer.println("4lw.commands.whitelist=ruok"); + } + + final Properties properties = new Properties(); + properties.setProperty(NiFiProperties.STATE_MANAGEMENT_ZOOKEEPER_PROPERTIES, zkServerConfig.toString()); + properties.setProperty(NiFiProperties.STATE_MANAGEMENT_START_EMBEDDED_ZOOKEEPER, "true"); + + zkServer = ZooKeeperStateServer.create(new StandardNiFiProperties(properties)); + + if (zkServer != null) zkServer.start(); + } + + @AfterClass + public static void cleanup() throws IOException { + if (zkServer != null) { + try { + zkServer.shutdown(); + } catch (final Exception ignore) {} + } + + if (tempDir != null) { + final List files = Arrays.asList( + dataDir.resolve("version-2/snapshot.0"), + dataDir.resolve("version-2/log.1"), + dataDir.resolve("version-2"), + dataDir.resolve("myid"), + dataDir, + zkServerConfig, + tempDir + ); + + files.forEach(p -> { + try { + if (p != null) Files.deleteIfExists(p); + } catch (final IOException ignore) {} + }); + } + } + + @Test + public void testServerCreated() { + Assert.assertNotNull(zkServer); + } + + @Test + public void testServerOk() throws IOException, SSLContextException { + final String imok = FourLetterWordMain.send4LetterWord("localhost", + clientPort, "ruok", false, 1000); + Assert.assertEquals(imok, "imok\n"); + } + + @Test + public void testServerCreatePath() throws Exception { + final CuratorFramework client = + CuratorFrameworkFactory.newClient( + String.format("localhost:%d", clientPort), + new RetryOneTime(1000)); + + client.start(); + final String testPath = "/test"; + final String createResult = client.create().forPath(testPath, new byte[0]); + final Stat checkExistsResult = client.checkExists().forPath(testPath); + + Assert.assertEquals(createResult, testPath); + Assert.assertNotNull(checkExistsResult); + } + +}