Make socketservertestcase work independently of ant build
diff --git a/build.xml b/build.xml
index 8c7fed7..6e1a811 100644
--- a/build.xml
+++ b/build.xml
@@ -229,51 +229,6 @@
</delete>
</target>
- <target name="run-socketserver"
- depends="clean-output"
- description="Runs SocketServer test">
- <property environment="env" />
- <mkdir dir="${tests.output.dir}" />
- <delete>
- <fileset dir="${tests.output.dir}"
- includes="*"
- />
- </delete>
- <mkdir dir="target/test-classes" />
- <javac srcdir="src/test/java"
- includes="org/apache/log4j/net/ShortSocketServer.java"
- destdir="target/test-classes"
- classpath="${log4j.jar}"
- />
- <parallel>
- <java classname="org.apache.log4j.net.ShortSocketServer"
- fork="yes" dir="src/test/resources"
- classpath="target/test-classes:${log4j.jar}">
- <arg value="8" />
- <arg value="input/socketServer" />
- </java>
- <sequential>
- <sleep seconds="2" />
- <exec executable="${testsuite.exe}"
- dir="${tests.resources.dir}"
- failonerror="true">
- <arg value="-v" />
- <arg value="socketservertestcase" />
-
- <env key="LD_LIBRARY_PATH"
- value="${log4cxx.lib.dir}:${apr.lib.dir}:${apr-util.lib.dir}:${env.LD_LIBRARY_PATH}"
- />
- <env key="DYLD_LIBRARY_PATH"
- value="${log4cxx.lib.dir}:${apr.lib.dir}:${apr-util.lib.dir}:${env.DYLD_LIBRARY_PATH}"
- />
- <env key="Path"
- value="${log4cxx.lib.dir};${env.Path}"
- />
- </exec>
- </sequential>
- </parallel>
- </target>
-
<target name="apidocs"
description="Build log4cxx manual">
<copy file="${base.dir}/src/site/doxy/Doxyfile.in"
diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt
index da8ed95..42ff357 100644
--- a/src/test/CMakeLists.txt
+++ b/src/test/CMakeLists.txt
@@ -1 +1,5 @@
-add_subdirectory(cpp)
\ No newline at end of file
+find_package(Java COMPONENTS Development)
+if(Java_Development_FOUND)
+ add_subdirectory(java)
+endif(Java_Development_FOUND)
+add_subdirectory(cpp)
diff --git a/src/test/cpp/CMakeLists.txt b/src/test/cpp/CMakeLists.txt
index cc5d250..bbe01e3 100644
--- a/src/test/cpp/CMakeLists.txt
+++ b/src/test/cpp/CMakeLists.txt
@@ -56,9 +56,16 @@
COMMAND ${testName} -v
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/../resources
)
- set_tests_properties(${testName} PROPERTIES
- ENVIRONMENT "TOTO=wonderful;key1=value1;key2=value2"
- )
+
+ if(${testName} STREQUAL socketservertestcase)
+ set_tests_properties(socketservertestcase PROPERTIES
+ ENVIRONMENT "SOCKET_SERVER_COMMAND=$<JOIN:${START_SOCKET_SERVER_COMMAND}, >"
+ )
+ else()
+ set_tests_properties(${testName} PROPERTIES
+ ENVIRONMENT "TOTO=wonderful;key1=value1;key2=value2"
+ )
+ endif()
if(WIN32)
set_tests_properties(${testName} PROPERTIES ENVIRONMENT
"PATH=$<SHELL_PATH:$<TARGET_FILE_DIR:log4cxx>>$<SEMICOLON>$ENV{PATH}"
diff --git a/src/test/cpp/net/CMakeLists.txt b/src/test/cpp/net/CMakeLists.txt
index 888dec6..a11e603 100644
--- a/src/test/cpp/net/CMakeLists.txt
+++ b/src/test/cpp/net/CMakeLists.txt
@@ -3,7 +3,6 @@
set(NET_TESTS
socketappendertestcase
sockethubappendertestcase
- socketservertestcase
syslogappendertestcase
telnetappendertestcase
xmlsocketappendertestcase
@@ -14,4 +13,9 @@
foreach(fileName IN LISTS NET_TESTS)
add_executable(${fileName} "${fileName}.cpp")
endforeach()
+if(Java_Development_FOUND)
+ add_executable(socketservertestcase socketserverstarter.cpp socketservertestcase.cpp)
+ add_dependencies(socketservertestcase test-classes)
+ list(APPEND NET_TESTS socketservertestcase)
+endif(Java_Development_FOUND)
set(ALL_LOG4CXX_TESTS ${ALL_LOG4CXX_TESTS} ${NET_TESTS} PARENT_SCOPE)
diff --git a/src/test/cpp/net/socketserverstarter.cpp b/src/test/cpp/net/socketserverstarter.cpp
new file mode 100644
index 0000000..43e9d56
--- /dev/null
+++ b/src/test/cpp/net/socketserverstarter.cpp
@@ -0,0 +1,108 @@
+/*
+ * 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.
+ */
+
+#include "../logunit.h"
+
+#include <apr_thread_proc.h>
+#include <apr_env.h>
+#include <apr_file_io.h>
+#include <apr_strings.h>
+#include <apr_time.h>
+#include <log4cxx/helpers/pool.h>
+
+
+using namespace log4cxx;
+
+LOGUNIT_CLASS(SocketServerStarter)
+{
+ LOGUNIT_TEST_SUITE(SocketServerStarter);
+ LOGUNIT_TEST(startServer);
+ LOGUNIT_TEST_SUITE_END();
+
+public:
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void startServer()
+ {
+ helpers::Pool p;
+ apr_pool_t* pool = p.getAPRPool();
+ char* cmd = NULL;
+ apr_status_t stat = apr_env_get(&cmd, "SOCKET_SERVER_COMMAND", pool);
+
+ if (cmd && *cmd)
+ {
+ // prepare to launch the server
+ //
+ apr_proc_t server_pid;
+ apr_procattr_t* attr = NULL;
+ stat = apr_procattr_create(&attr, pool);
+ LOGUNIT_ASSERT(stat == APR_SUCCESS);
+ stat = apr_procattr_io_set(attr, APR_NO_PIPE, APR_NO_PIPE, APR_NO_PIPE);
+ LOGUNIT_ASSERT(stat == APR_SUCCESS);
+
+ //fprintf(stdout, "SOCKET_SERVER_COMMAND=%s\n", cmd);
+#ifdef SHELL_CMD_TYPE_WORKS
+ stat = apr_procattr_cmdtype_set(attr, APR_SHELLCMD);
+ LOGUNIT_ASSERT(stat == APR_SUCCESS);
+ stat = apr_proc_create(&server_pid, cmd, NULL, NULL, attr, pool);
+#else
+ stat = apr_procattr_cmdtype_set(attr, APR_PROGRAM);
+ LOGUNIT_ASSERT(stat == APR_SUCCESS);
+ // convert the space separated cmd string to the argument list
+ //
+ char** args = (char**)apr_palloc(pool, 15 * sizeof(*args));
+ char* pcmd = apr_pstrdup(pool, cmd);
+ int i = 0;
+ for (; i < 14 && pcmd && *pcmd; ++i)
+ {
+ args[i] = pcmd;
+ if (NULL != (pcmd = strchr(pcmd, ' ')))
+ {
+ while(' ' == *pcmd)
+ {
+ *pcmd = 0;
+ ++pcmd;
+ }
+ }
+ }
+ args[i] = 0;
+ //fprintf(stdout, "starting=%s with %d arguments\n", args[0], i);
+ stat = apr_proc_create(&server_pid, args[0], args, NULL, attr, pool);
+#endif
+
+
+ if (stat == APR_SUCCESS) // Allow server time to load
+ apr_sleep(1000000); // 1 seconds
+ }
+ else
+ fputs("The environment variable SOCKET_SERVER_COMMAND"
+ " must contain the server process path"
+ " followed by space separated command arguments\n", stderr);
+
+ LOGUNIT_ASSERT(stat == APR_SUCCESS);
+ }
+};
+
+
+LOGUNIT_TEST_SUITE_REGISTRATION(SocketServerStarter)
+
diff --git a/src/test/cpp/net/socketservertestcase.cpp b/src/test/cpp/net/socketservertestcase.cpp
index ce4444f..d46b378 100644
--- a/src/test/cpp/net/socketservertestcase.cpp
+++ b/src/test/cpp/net/socketservertestcase.cpp
@@ -38,7 +38,6 @@
#include "../logunit.h"
#include <log4cxx/spi/loggerrepository.h>
-
//Define INT64_C for compilers that don't have it
#if (!defined(INT64_C))
#define INT64_C(value) value ## LL
@@ -478,4 +477,4 @@
const File SocketServerTestCase::TEMP("output/temp");
const File SocketServerTestCase::FILTERED("output/filtered");
-LOGUNIT_TEST_SUITE_REGISTRATION_DISABLED(SocketServerTestCase)
+LOGUNIT_TEST_SUITE_REGISTRATION(SocketServerTestCase)
diff --git a/src/test/java/CMakeLists.txt b/src/test/java/CMakeLists.txt
new file mode 100644
index 0000000..ff4af4b
--- /dev/null
+++ b/src/test/java/CMakeLists.txt
@@ -0,0 +1,18 @@
+include(FetchContent)
+FetchContent_Declare(log4j
+ URL https://www-us.apache.org/dist/logging/log4j/1.2.17/log4j-1.2.17.tar.gz
+ URL_HASH MD5=8218714e41ee0c6509dcfeafa2e1f53f
+)
+FetchContent_GetProperties(log4j)
+if(NOT log4j_POPULATED)
+ FetchContent_Populate(log4j)
+endif()
+set(log4j_CLASSPATH "${log4j_SOURCE_DIR}/log4j-1.2.17.jar" )
+set(SOCKET_SERVER_SOURCES org/apache/log4j/net/ShortSocketServer.java)
+add_custom_target(test-classes
+ COMMAND ${Java_JAVAC_EXECUTABLE} -d ${CMAKE_CURRENT_BINARY_DIR}
+ --class-path "${log4j_CLASSPATH}" ${SOCKET_SERVER_SOURCES}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+)
+set(SOCKET_SERVER_CLASSPATH "${CMAKE_CURRENT_BINARY_DIR}:${log4j_CLASSPATH}" )
+set(START_SOCKET_SERVER_COMMAND ${Java_JAVA_EXECUTABLE} --class-path ${SOCKET_SERVER_CLASSPATH} org.apache.log4j.net.ShortSocketServer 8 input/socketServer PARENT_SCOPE)