You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pe...@apache.org on 2022/03/16 14:32:10 UTC
[celix] branch feature/conan_support updated: Add test_package for the framework, http_admin and log_admin.
This is an automated email from the ASF dual-hosted git repository.
pengzheng pushed a commit to branch feature/conan_support
in repository https://gitbox.apache.org/repos/asf/celix.git
The following commit(s) were added to refs/heads/feature/conan_support by this push:
new 66724b9 Add test_package for the framework, http_admin and log_admin.
66724b9 is described below
commit 66724b94902b5cc6131ab5c50793d993ab854438
Author: PengZheng <ho...@gmail.com>
AuthorDate: Wed Mar 16 22:29:07 2022 +0800
Add test_package for the framework, http_admin and log_admin.
---
test_package/CMakeLists.txt | 67 ++++++++++++++++++++++
test_package/conanfile.py | 43 +++++++++++++++
test_package/hello_bundle.c | 52 +++++++++++++++++
test_package/my_log_writer_activator.c | 71 ++++++++++++++++++++++++
test_package/test_framework.c | 39 +++++++++++++
test_package/test_http_admin_activator.c | 95 ++++++++++++++++++++++++++++++++
6 files changed, 367 insertions(+)
diff --git a/test_package/CMakeLists.txt b/test_package/CMakeLists.txt
new file mode 100644
index 0000000..b85b52e
--- /dev/null
+++ b/test_package/CMakeLists.txt
@@ -0,0 +1,67 @@
+# 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.
+
+cmake_minimum_required (VERSION 3.14)
+project(test_package)
+include(${CMAKE_BINARY_DIR}/conan_paths.cmake)
+
+set(CMAKE_CXX_STANDARD 17)
+
+find_package(Celix REQUIRED)
+
+add_celix_bundle(hello VERSION 1.0.0 SOURCES hello_bundle.c)
+# log_helper is always available
+target_link_libraries(hello PRIVATE Celix::log_helper)
+celix_get_bundle_file(hello HELLO_TEST_BUNDLE)
+add_executable(framework test_framework.c)
+target_link_libraries(framework Celix::framework)
+add_celix_bundle_dependencies(framework hello)
+target_compile_definitions(framework PRIVATE HELLO_TEST_BUNDLE_LOCATION="${HELLO_TEST_BUNDLE}")
+
+option(TEST_HTTP_ADMIN "Test http_admin" ON)
+if (TEST_HTTP_ADMIN)
+ # make sure http_admin_api is accessible
+ add_celix_bundle(http_admin_sut
+ SOURCES
+ test_http_admin_activator.c
+ VERSION 1.0.0
+ )
+ target_link_libraries(http_admin_sut PRIVATE Celix::http_admin_api)
+ # make sure http_admin bundle is accessible
+ add_celix_container(use_http_admin COPY
+ BUNDLES
+ Celix::http_admin
+ http_admin_sut
+ )
+endif ()
+
+option(TEST_LOG_SERVICE "Test log_admin" ON)
+if (TEST_LOG_SERVICE)
+ add_celix_bundle(my_log_writer
+ SOURCES
+ my_log_writer_activator.c
+ VERSION 1.0.0
+ )
+ # make sure log_service_api is accessible
+ target_link_libraries(my_log_writer PRIVATE Celix::log_helper Celix::log_service_api)
+ add_celix_container(use_log_writer COPY)
+ # make sure log_admin is accessible
+ celix_container_bundles(use_log_writer LEVEL 0 Celix::log_admin)
+ # make sure my_log_writer is available to hello
+ celix_container_bundles(use_log_writer LEVEL 1 my_log_writer)
+ celix_container_bundles(use_log_writer LEVEL 2 hello)
+endif ()
diff --git a/test_package/conanfile.py b/test_package/conanfile.py
new file mode 100644
index 0000000..6bb0121
--- /dev/null
+++ b/test_package/conanfile.py
@@ -0,0 +1,43 @@
+# 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.
+
+from conans import CMake, ConanFile, tools
+import os
+
+
+class TestPackageConan(ConanFile):
+ settings = "os", "arch", "compiler", "build_type"
+ generators = "cmake_paths"
+
+ def requirements(self):
+ if not self.requires:
+ self.requires("celix/2.2.3@zhengpeng/testing")
+
+ def build(self):
+ cmake = CMake(self)
+ cmake.configure()
+ cmake.definitions["TEST_HTTP_ADMIN"] = self.options["celix"].build_http_admin
+ cmake.definitions["TEST_LOG_SERVICE"] = self.options["celix"].build_log_service
+ cmake.build()
+
+ def test(self):
+ if not tools.cross_building(self, skip_x64_x86=True):
+ self.run("./framework", run_environment=True)
+ if self.options["celix"].build_http_admin:
+ self.run("./use_http_admin", cwd=os.path.join("deploy", "use_http_admin"), run_environment=True)
+ if self.options["celix"].build_log_service:
+ self.run("./use_log_writer", cwd=os.path.join("deploy", "use_log_writer"), run_environment=True)
diff --git a/test_package/hello_bundle.c b/test_package/hello_bundle.c
new file mode 100644
index 0000000..fb47df6
--- /dev/null
+++ b/test_package/hello_bundle.c
@@ -0,0 +1,52 @@
+/*
+ * 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 <celix_api.h>
+#include <celix_log_helper.h>
+#include <stdio.h>
+
+typedef struct activator_data {
+ celix_log_helper_t *logger;
+} activator_data_t;
+
+
+static celix_status_t activator_start(activator_data_t *data, celix_bundle_context_t *ctx) {
+ const char *key = NULL;
+ data->logger = celix_logHelper_create(ctx, "test");
+ printf("Hello world from C bundle with id %li\n", celix_bundle_getId(celix_bundleContext_getBundle(ctx)));
+ celix_properties_t *prop = celix_properties_create();
+ celix_properties_set(prop, "name", "FOO");
+ celix_properties_setLong(prop, "age", 39);
+ celix_properties_setBool(prop, "married", true);
+ celix_properties_setDouble(prop, "height", 1.75);
+ CELIX_PROPERTIES_FOR_EACH(prop, key) {
+ celix_logHelper_info(data->logger,"[Hello Bundle] |- %s=%s\n", key, celix_properties_get(prop, key, NULL));
+ }
+ celix_properties_store(prop, "prop.txt", NULL);
+ celix_properties_destroy(prop);
+ celix_framework_stopBundleAsync(celix_bundleContext_getFramework(ctx), CELIX_FRAMEWORK_BUNDLE_ID); // make to container quit immediately
+ return CELIX_SUCCESS;
+}
+
+static celix_status_t activator_stop(activator_data_t *data, celix_bundle_context_t *ctx) {
+ celix_logHelper_info(data->logger, "Goodbye world from C bundle with id %li\n", celix_bundle_getId(celix_bundleContext_getBundle(ctx)));
+ celix_logHelper_destroy(data->logger);
+ return CELIX_SUCCESS;
+}
+
+CELIX_GEN_BUNDLE_ACTIVATOR(activator_data_t, activator_start, activator_stop)
diff --git a/test_package/my_log_writer_activator.c b/test_package/my_log_writer_activator.c
new file mode 100644
index 0000000..7fcae2a
--- /dev/null
+++ b/test_package/my_log_writer_activator.c
@@ -0,0 +1,71 @@
+/*
+ * 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 "celix_api.h"
+#include "celix_log_sink.h"
+#define _GNU_SOURCE
+#include <stdio.h>
+
+typedef struct my_log_writer_activator {
+ celix_log_sink_t logSinkSvc;
+ long logSinkSvcId;
+} my_log_writer_activator_t;
+
+static void myLogWriter_sinkLog(void *handle __attribute__((unused)), celix_log_level_e level, long logServiceId __attribute__((unused)), const char* logServiceName, const char* file, const char* function, int line, const char *format, va_list formatArgs) {
+
+ //note details are note used
+ (void)file;
+ (void)function;
+ (void)line;
+ (void)level;
+
+ char buffer[1024];
+ size_t needed = vsnprintf(buffer, 1024, format, formatArgs);
+ if (needed > 1024) {
+ char *allocatedBuffer = NULL;
+ vasprintf(&allocatedBuffer, format, formatArgs);
+ printf("my [%s]: %s", logServiceName, allocatedBuffer);
+ free(allocatedBuffer);
+ } else {
+ printf("my [%s]: %s", logServiceName, buffer);
+ }
+}
+
+static celix_status_t myLogWriterActivator_start(my_log_writer_activator_t* act, celix_bundle_context_t* ctx) {
+ act->logSinkSvc.handle = NULL;
+ act->logSinkSvc.sinkLog = myLogWriter_sinkLog;
+
+ celix_service_registration_options_t opts = CELIX_EMPTY_SERVICE_REGISTRATION_OPTIONS;
+ celix_properties_t* props = celix_properties_create();
+ celix_properties_set(props, CELIX_LOG_SINK_PROPERTY_NAME, "my_log_writer");
+ opts.serviceName = CELIX_LOG_SINK_NAME;
+ opts.serviceVersion = CELIX_LOG_SINK_VERSION;
+ opts.properties = props;
+ opts.svc = &act->logSinkSvc;
+ act->logSinkSvcId = celix_bundleContext_registerServiceWithOptions(ctx, &opts);
+
+ return CELIX_SUCCESS;
+}
+
+static celix_status_t myLogWriterActivator_stop(my_log_writer_activator_t* act, celix_bundle_context_t* ctx) {
+ celix_bundleContext_unregisterService(ctx, act->logSinkSvcId);
+ return CELIX_SUCCESS;
+}
+
+CELIX_GEN_BUNDLE_ACTIVATOR(my_log_writer_activator_t, myLogWriterActivator_start, myLogWriterActivator_stop);
diff --git a/test_package/test_framework.c b/test_package/test_framework.c
new file mode 100644
index 0000000..0a9bcc9
--- /dev/null
+++ b/test_package/test_framework.c
@@ -0,0 +1,39 @@
+/*
+ * 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 <celix_api.h>
+#include <assert.h>
+#include <stddef.h>
+
+int main() {
+ celix_framework_t* fw = NULL;
+ celix_bundle_context_t *ctx = NULL;
+ celix_properties_t *properties = NULL;
+
+ properties = properties_create();
+ properties_set(properties, "LOGHELPER_ENABLE_STDOUT_FALLBACK", "true");
+ properties_set(properties, "org.osgi.framework.storage.clean", "onFirstInit");
+ properties_set(properties, "org.osgi.framework.storage", ".cacheBundleContextTestFramework");
+
+ fw = celix_frameworkFactory_createFramework(properties);
+ ctx = framework_getContext(fw);
+ long bndId = celix_bundleContext_installBundle(ctx, HELLO_TEST_BUNDLE_LOCATION, true);
+ assert(bndId >= 0);
+ celix_frameworkFactory_destroyFramework(fw);
+ return 0;
+}
diff --git a/test_package/test_http_admin_activator.c b/test_package/test_http_admin_activator.c
new file mode 100644
index 0000000..73a74d8
--- /dev/null
+++ b/test_package/test_http_admin_activator.c
@@ -0,0 +1,95 @@
+/*
+ * 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 <stdlib.h>
+
+#include "celix_api.h"
+#include "http_admin/api.h"
+
+#include "civetweb.h"
+
+struct activator {
+ celix_http_service_t httpSvc;
+ celix_http_service_t httpSvc2;
+ celix_http_service_t httpSvc3;
+ long httpSvcId;
+ long httpSvcId2;
+ long httpSvcId3;
+
+ celix_websocket_service_t sockSvc;
+ long sockSvcId;
+};
+
+//Local function prototypes
+int alias_test_put(void *handle, struct mg_connection *connection, const char *path, const char *data, size_t length);
+int websocket_data_echo(struct mg_connection *connection, int op_code, char *data, size_t length, void *handle);
+
+celix_status_t bnd_start(struct activator *act, celix_bundle_context_t *ctx) {
+ celix_properties_t *props = celix_properties_create();
+ celix_properties_set(props, HTTP_ADMIN_URI, "/alias");
+ act->httpSvc.handle = act;
+ act->httpSvc.doPut = alias_test_put;
+ act->httpSvcId = celix_bundleContext_registerService(ctx, &act->httpSvc, HTTP_ADMIN_SERVICE_NAME, props);
+
+ celix_properties_t *props2 = celix_properties_create();
+ celix_properties_set(props2, HTTP_ADMIN_URI, "/foo/bar");
+ act->httpSvc2.handle = act;
+ act->httpSvcId2 = celix_bundleContext_registerService(ctx, &act->httpSvc2, HTTP_ADMIN_SERVICE_NAME, props2);
+
+ celix_properties_t *props3 = celix_properties_create();
+ celix_properties_set(props3, HTTP_ADMIN_URI, "/");
+ act->httpSvc3.handle = act;
+ act->httpSvcId3 = celix_bundleContext_registerService(ctx, &act->httpSvc3, HTTP_ADMIN_SERVICE_NAME, props3);
+
+ celix_properties_t *props4 = celix_properties_create();
+ celix_properties_set(props4, WEBSOCKET_ADMIN_URI, "/");
+ act->sockSvc.handle = act;
+ act->sockSvc.data = websocket_data_echo;
+ act->sockSvcId = celix_bundleContext_registerService(ctx, &act->sockSvc, WEBSOCKET_ADMIN_SERVICE_NAME, props4);
+ celix_framework_stopBundleAsync(celix_bundleContext_getFramework(ctx), CELIX_FRAMEWORK_BUNDLE_ID); // make to container quit immediately
+ return CELIX_SUCCESS;
+}
+
+celix_status_t bnd_stop(struct activator *act, celix_bundle_context_t *ctx) {
+ celix_bundleContext_unregisterService(ctx, act->httpSvcId);
+ celix_bundleContext_unregisterService(ctx, act->httpSvcId2);
+ celix_bundleContext_unregisterService(ctx, act->httpSvcId3);
+ celix_bundleContext_unregisterService(ctx, act->sockSvcId);
+
+ return CELIX_SUCCESS;
+}
+
+CELIX_GEN_BUNDLE_ACTIVATOR(struct activator, bnd_start, bnd_stop);
+
+int alias_test_put(void *handle __attribute__((unused)), struct mg_connection *connection, const char *path __attribute__((unused)), const char *data, size_t length) {
+ //If data received, echo the data for the test case
+ if(length > 0 && data != NULL) {
+ const char *mime_type = mg_get_header(connection, "Content-Type");
+ mg_printf(connection,
+ "HTTP/1.1 200 OK\r\nContent-Type: %s\r\nConnection: close\r\n\r\n%s", mime_type, data);
+
+ }
+
+ return 200;
+}
+
+int websocket_data_echo(struct mg_connection *connection, int op_code __attribute__((unused)), char *data, size_t length, void *handle __attribute__((unused))) {
+ mg_websocket_write(connection, MG_WEBSOCKET_OPCODE_PONG, data, length);
+
+ return 0; //Close socket after echoing.
+}