YACA: Stress tests for multiple threads 75/73575/12
authorKrzysztof Jackiewicz <k.jackiewicz@samsung.com>
Wed, 8 Jun 2016 12:25:45 +0000 (14:25 +0200)
committerKrzysztof Jackiewicz <k.jackiewicz@samsung.com>
Wed, 15 Jun 2016 11:30:28 +0000 (13:30 +0200)
Tests concurrency issues and library/thread initialization/cleanup.

Run: yaca-test --group=T8000_YACA_STRESS

Change-Id: I30696dcb99ba5bf164e4d84c2bfbc7f80514ef13

src/yaca/CMakeLists.txt
src/yaca/lorem.cpp [new file with mode: 0644]
src/yaca/lorem.h [new file with mode: 0644]
src/yaca/yaca-test-stress.cpp [new file with mode: 0644]

index 23c6211..a712aa3 100644 (file)
@@ -32,8 +32,13 @@ ADD_EXECUTABLE(${YACA_TEST} ${yaca_test_SRCS})
 ## Link libraries ##############################################################
 PKG_CHECK_MODULES(YACA_TEST_DEPS REQUIRED yaca)
 
+FIND_PACKAGE (Threads)
+
 INCLUDE_DIRECTORIES(SYSTEM ${YACA_TEST_DEPS_INCLUDE_DIRS})
-TARGET_LINK_LIBRARIES(${YACA_TEST} ${YACA_TEST_DEPS_LIBRARIES} dpl-test-framework)
+TARGET_LINK_LIBRARIES(${YACA_TEST}
+                      ${YACA_TEST_DEPS_LIBRARIES}
+                      dpl-test-framework
+                      ${CMAKE_THREAD_LIBS_INIT})
 
 ## Install #####################################################################
 INSTALL(TARGETS ${YACA_TEST} DESTINATION bin)
diff --git a/src/yaca/lorem.cpp b/src/yaca/lorem.cpp
new file mode 100644 (file)
index 0000000..b2ddeff
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ *  Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Krzysztof Jackiewicz <k.jackiewicz@samsung.com>
+ *
+ *  Licensed 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
+ */
+
+/**
+ * @file lorem.cpp
+ * @brief Lorem Ipsum
+ */
+
+#include "lorem.h"
+
+const char lorem8[LOREM8_SIZE] = "Lorem i";
+const char lorem16[LOREM16_SIZE] = "Lorem ipsum dol";
+const char lorem1024[LOREM1024_SIZE] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec non dolor tincidunt, vehicula erat non, pulvinar nisl. Suspendisse gravida commodo hendrerit. Sed ex magna, aliquet malesuada lectus ut, porttitor tincidunt ante. Nulla facilisi. Morbi nec scelerisque risus. Sed a gravida sapien. Cras sed neque bibendum, dapibus lectus sed, porta nulla. Morbi tristique velit lacus, at luctus turpis mollis sed. Nam quis sapien eu magna cursus venenatis. Phasellus et vestibulum urna, non pellentesque ex. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam pretium aliquam porta.\
+Morbi magna metus, commodo in fermentum id, mattis pretium mauris. Donec sed rhoncus justo. Duis fringilla sem quis velit dignissim bibendum. Sed porta efficitur ipsum, in dignissim magna molestie eu. Sed elementum maximus risus. Quisque cursus urna lectus, sit amet fringilla purus tempor eu. Praesent tincidunt dolor sit amet dolor vulputate, et molestie tellus euismod. Proin suscipit dictum amet.";
+
+const char lorem4096[LOREM4096_SIZE] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus congue semper ipsum, ac convallis magna rhoncus sit amet. Donec pellentesque maximus convallis. Mauris ut egestas sem. Maecenas efficitur suscipit auctor. Nunc malesuada laoreet porttitor. Donec gravida tortor nisi, in mattis lectus porta ut. Integer vehicula eros et tellus placerat, nec fermentum justo aliquet.\
+Maecenas metus massa, ultrices et ultricies sed, imperdiet nec dolor. Nam eget massa eros. Proin vitae laoreet metus, at scelerisque massa. Nullam convallis dolor id nisl iaculis, a gravida risus pretium. Proin non nunc eget nibh fermentum dignissim. Nullam tristique, odio eget rutrum sagittis, tortor purus cursus nunc, nec iaculis quam nunc ac metus. Cras ut tortor a eros porta vehicula non at lectus. Aliquam volutpat quis nisi ut mattis. Curabitur semper vehicula ultrices. Aenean cursus laoreet venenatis. Aenean vulputate, nisl id facilisis fringilla, neque velit posuere libero, et viverra tortor felis vitae urna. Sed in congue nunc. Fusce molestie tempor pharetra. Cras sodales pulvinar nunc non sollicitudin.\
+Maecenas vehicula metus ac tristique ultricies. Suspendisse potenti. Pellentesque suscipit egestas augue, sed dictum orci. Pellentesque eu lorem ultricies, vestibulum est in, bibendum turpis. Proin placerat tincidunt metus, eget volutpat dolor. Pellentesque varius leo eget velit lobortis, sit amet congue orci bibendum. Aliquam vitae posuere lorem. Donec sed convallis diam. Quisque aliquam interdum purus, eu ornare ex ullamcorper iaculis. In sit amet nisl eu nisl ultricies dapibus. Aenean finibus efficitur elit ut sodales. Nam sit amet auctor sem, eu iaculis nunc. Vivamus mattis arcu a viverra faucibus. In dignissim, nisi sit amet consectetur tempus, lorem dui fringilla augue, sit amet lacinia lectus sapien efficitur odio.\
+Nullam et egestas enim. Nam sit amet mi malesuada, dapibus felis quis, viverra mauris. Ut quis enim eu neque porta vehicula. Etiam ullamcorper vitae turpis vehicula blandit. Maecenas blandit tristique semper. Aliquam at sagittis enim. Donec quis molestie urna. Duis ut urna blandit, pellentesque magna ultrices, dignissim mi. Morbi fermentum ex massa, ut facilisis est tincidunt vel. Nam sed erat in lacus molestie mattis quis ut leo. Phasellus tempus elit urna, eget sagittis purus volutpat sed. Suspendisse aliquam, sem vel gravida lobortis, tortor orci ornare nisi, sed mollis ligula sem nec risus. In a ex nibh. Praesent odio est, molestie sed vestibulum id, varius sit amet lectus. Donec vel diam efficitur, tristique ligula a, aliquet felis. Nullam sit amet neque tellus.\
+Phasellus aliquet non libero non aliquet. Aliquam efficitur ultrices tortor vitae lobortis. Pellentesque sed dolor quis nisl faucibus eleifend vitae ultrices est. Integer et libero quis nisl sollicitudin volutpat sit amet a quam. Vivamus commodo dolor augue, volutpat dapibus odio dapibus et. Nulla sed congue nisl. Duis nunc sem, condimentum nec neque ac, blandit blandit quam. Integer tincidunt ipsum nec risus viverra mollis. In porta porttitor mattis. Nulla ac eleifend nibh. Vivamus suscipit at nunc ac interdum. In fermentum fringilla odio.\
+Sed nec erat eget mauris varius pulvinar. Ut fermentum ante non erat elementum, vitae tempor velit blandit. Curabitur turpis tellus, sodales sit amet mattis nec, volutpat ac magna. Nulla quam orci, rutrum sit amet imperdiet ut, iaculis in nisl. Donec semper vitae tellus nec bibendum. Nam pharetra hendrerit sapien quis rutrum. Morbi tincidunt justo ut sodales ullamcorper. Suspendisse eget pellentesque nulla, non placerat purus. Donec placerat id turpis in interdum. Curabitur lobortis risus et placerat commodo. Morbi pulvinar eros leo, scelerisque rutrum arcu pretium at. Quisque eget diam dui. Quisque bibendum luctus arcu quis semper. Nullam erat lacus, lacinia sit amet neque aliquam, lacinia maximus lorem.\
+Nunc ac purus vel sem laoreet interdum quis eget ligula. Aenean id nisl ut quam vehicula pretium sed sit amet urna. Aenean diam lorem, vehicula et sapien nec, pellentesque consectetur libero. Cras fringilla nibh eu libero nullam.";
diff --git a/src/yaca/lorem.h b/src/yaca/lorem.h
new file mode 100644 (file)
index 0000000..8d1ad45
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ *  Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Krzysztof Jackiewicz <k.jackiewicz@samsung.com>
+ *
+ *  Licensed 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
+ */
+
+/**
+ * @file lorem.h
+ * @brief
+ */
+
+#ifndef LOREM_H
+#define LOREM_H
+
+#include <stddef.h>
+
+/**
+ * Test strings, sizes include null-termination
+ */
+extern const char lorem8[];
+extern const char lorem16[];
+extern const char lorem1024[];
+extern const char lorem4096[];
+
+/**
+ * Sizes of test strings
+ */
+#define LOREM8_SIZE ((size_t)8)
+#define LOREM16_SIZE ((size_t)16)
+#define LOREM1024_SIZE ((size_t)1024)
+#define LOREM4096_SIZE ((size_t)4096)
+
+#endif
diff --git a/src/yaca/yaca-test-stress.cpp b/src/yaca/yaca-test-stress.cpp
new file mode 100644 (file)
index 0000000..5ef0a6e
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ *  Copyright (c) 2000 - 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Licensed 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
+ */
+/*
+ * @file       yaca-test-stress.cpp
+ * @author     Krzysztof Jackiewicz (k.jackiewicz@samsung.com)
+ * @version    1.0
+ */
+
+#include <thread>
+#include <random>
+#include <chrono>
+
+#include <unistd.h>
+
+#include <yaca_crypto.h>
+#include <yaca_key.h>
+#include <yaca_seal.h>
+
+#include "dpl/test/test_runner_child.h"
+#include "yaca-test-common.h"
+
+#include "lorem.h"
+
+void thread_fn()
+{
+    auto sym_key = null_key();
+    auto iv = null_key();
+
+    size_t enc_size;
+    size_t block_len;
+    size_t output_len;
+    size_t out_size;
+    size_t rem;
+
+    for (size_t i = 0; i < 50; i++) {
+        auto key_priv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+        auto key_pub = extract_public_key(key_priv);
+
+        auto ctx = seal_init(key_pub, YACA_ENCRYPT_AES, YACA_BCM_CBC, YACA_KEY_LENGTH_256BIT, sym_key, iv);
+
+        YACA_SUCCESS(yaca_context_get_output_length(ctx.get(), LOREM4096_SIZE, &output_len));
+
+        YACA_SUCCESS(yaca_context_get_output_length(ctx.get(), 0, &block_len));
+
+        enc_size = output_len + block_len;
+
+        auto enc = create_buffer(enc_size);
+
+        out_size = enc_size;
+        YACA_SUCCESS(yaca_seal_update(ctx.get(), lorem4096, LOREM4096_SIZE, enc.get(), &out_size));
+
+        rem = enc_size - out_size;
+        YACA_SUCCESS(yaca_seal_finalize(ctx.get(), enc.get() + out_size, &rem));
+    }
+}
+
+void random_sleep(size_t miliseconds)
+{
+    std::default_random_engine gen;
+    std::uniform_int_distribution<size_t> dist(0, miliseconds);
+    int duration = dist(gen);
+
+    std::this_thread::sleep_for(std::chrono::milliseconds(duration));
+}
+
+void thread_test(size_t cnt, void (*fn)())
+{
+    std::thread* threads[cnt];
+    for (size_t i = 0; i < cnt; i++)
+        threads[i] = new std::thread(fn);
+
+    for (size_t i = 0; i < cnt; i++) {
+        threads[i]->join();
+        delete threads[i];
+    }
+}
+
+// TODO: Make a separate binary for stress tests? They may take a long time to complete.
+RUNNER_TEST_GROUP_INIT(T8000_YACA_STRESS);
+
+/* Properly initialize and deinitialize threads */
+RUNNER_CHILD_TEST(T8000_yaca_stress_threads, YacaTest)
+{
+    thread_test(10, []{
+            random_sleep(3000);
+            YACA_SUCCESS(yaca_initialize());
+            thread_fn();
+            YACA_SUCCESS(yaca_cleanup());
+    });
+}
+
+/* No initialization in threads except for main one */
+RUNNER_CHILD_TEST(T8010_yaca_stress_threads_no_init, YacaTest)
+{
+    thread_test(10, []{
+            random_sleep(3000);
+            thread_fn();
+            YACA_SUCCESS(yaca_cleanup());
+    });
+}
+
+/* No cleanup in threads except for main one. May cause memory leaks. */
+RUNNER_CHILD_TEST(T8020_yaca_stress_threads_no_final, YacaTest)
+{
+    thread_test(10, []{
+            random_sleep(3000);
+            YACA_SUCCESS(yaca_initialize());
+            thread_fn();
+    });
+}
+
+/* No initialization & cleanup in threads except for main one. May cause memory leaks. */
+RUNNER_CHILD_TEST(T8030_yaca_stress_threads_no_init_no_final, YacaTest)
+{
+    thread_test(10, []{
+            random_sleep(3000);
+            thread_fn();
+    });
+}
+
+/* Single initialization in main thread. May cause memory leaks. */
+RUNNER_CHILD_TEST(T8040_yaca_stress_threads_init_only)
+{
+    YACA_SUCCESS(yaca_initialize());
+    thread_test(10, []{
+            random_sleep(3000);
+            thread_fn();
+    });
+}
+
+/* Initialization in threads other than main. May cause memory leaks. */
+RUNNER_CHILD_TEST(T8050_yaca_stress_threads_init_thread_only)
+{
+    thread_test(10, []{
+            random_sleep(3000);
+            YACA_SUCCESS(yaca_initialize());
+            thread_fn();
+    });
+}