This is an automated email from the ASF dual-hosted git repository.

giorgio pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-milagro-crypto-c.git


The following commit(s) were added to refs/heads/master by this push:
     new 5218216        new file:   CMakeLists.txt      new file:   aes_test.c  
new file:   cmake/AddCmockaTest.cmake   new file:   cmake/Amcl.cmake    new 
file:   cmake/Cmocka.cmake  new file:   cmake/CodeCoverage.cmake    new file:   
crypto_context.c    new file:   include/aes_test.h  new file:   
include/crypto_context.h    new file:   test_main.c
5218216 is described below

commit 52182165ba977bbac7d760438a5811c03cbbde64
Author: Giorgio Zoppi <[email protected]>
AuthorDate: Thu Jun 13 21:32:27 2019 +0200

        new file:   CMakeLists.txt
        new file:   aes_test.c
        new file:   cmake/AddCmockaTest.cmake
        new file:   cmake/Amcl.cmake
        new file:   cmake/Cmocka.cmake
        new file:   cmake/CodeCoverage.cmake
        new file:   crypto_context.c
        new file:   include/aes_test.h
        new file:   include/crypto_context.h
        new file:   test_main.c
---
 cmocka_tests/CMakeLists.txt            |  66 +++++++++
 cmocka_tests/aes_test.c                |  92 +++++++++++++
 cmocka_tests/cmake/AddCmockaTest.cmake |  51 +++++++
 cmocka_tests/cmake/Amcl.cmake          |  45 +++++++
 cmocka_tests/cmake/Cmocka.cmake        |  47 +++++++
 cmocka_tests/cmake/CodeCoverage.cmake  | 237 +++++++++++++++++++++++++++++++++
 cmocka_tests/cmake_install.cmake       |  49 +++++++
 cmocka_tests/crypto_context.c          |  76 +++++++++++
 cmocka_tests/include/aes_test.h        |  26 ++++
 cmocka_tests/include/crypto_context.h  |  63 +++++++++
 cmocka_tests/test_main.c               |  19 +++
 11 files changed, 771 insertions(+)

diff --git a/cmocka_tests/CMakeLists.txt b/cmocka_tests/CMakeLists.txt
new file mode 100644
index 0000000..a4fc0db
--- /dev/null
+++ b/cmocka_tests/CMakeLists.txt
@@ -0,0 +1,66 @@
+# 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.1 FATAL_ERROR)
+get_filename_component(PROJECT_ROOT ${CMAKE_CURRENT_LIST_FILE} DIRECTORY)
+set(CMAKE_C_STANDARD 99)
+set(CMAKE_C_STANDARD_REQUIRED ON)
+set(CMAKE_MODULE_PATH "${PROJECT_ROOT}/cmake")
+include(${PROJECT_ROOT}/cmake/Cmocka.cmake)
+include(${PROJECT_ROOT}/cmake/AddCmockaTest.cmake)
+include(${PROJECT_ROOT}/cmake/Amcl.cmake)
+
+set(OPENSSL_USE_STATIC_LIBS TRUE)
+find_package(OpenSSL REQUIRED)
+
+function(ADD_CMOCKA_TEST_ENVIRONMENT _TARGET_NAME)
+    if (WIN32 OR CYGWIN OR MINGW)
+        file(TO_NATIVE_PATH "${cmocka-library_BINARY_DIR}" CMOCKA_DLL_PATH)
+
+        if (TARGET_SYSTEM_EMULATOR)
+            set(DLL_PATH_ENV "WINEPATH=${CMOCKA_DLL_PATH};$ENV{WINEPATH}")
+        else()
+            set(DLL_PATH_ENV "PATH=${CMOCKA_DLL_PATH};$ENV{PATH}")
+        endif()
+        #
+        # IMPORTANT NOTE: The set_tests_properties(), below, internally
+        # stores its name/value pairs with a semicolon delimiter.
+        # because of this we must protect the semicolons in the path
+        #
+        string(REPLACE ";" "\\;" DLL_PATH_ENV "${DLL_PATH_ENV}")
+
+        set_tests_properties(${_TARGET_NAME}
+                             PROPERTIES
+                                ENVIRONMENT
+                                    "${DLL_PATH_ENV}")
+    endif()
+endfunction()
+
+set_source_files_properties(aes_test.c crypto_context.c test_main.c
+                            PROPERTIES
+                            COMPILE_DEFINITIONS
+                            UNIT_TESTING=1)
+enable_testing()
+include_directories(${CMOCKA_INCLUDE_DIR} ${PROJECT_ROOT} include ../include)
+### The most simple test
+add_cmocka_test(aes_test
+                SOURCES crypto_context.c test_main.c aes_test.c
+                COMPILE_OPTIONS ${DEFAULT_C_COMPILE_FLAGS}
+                LINK_LIBRARIES ${CMOCKA_LIBRARY} ${AMCL_LIBRARY} 
OpenSSL::Crypto)
+add_cmocka_test_environment(aes_test)
+
+
diff --git a/cmocka_tests/aes_test.c b/cmocka_tests/aes_test.c
new file mode 100644
index 0000000..61f1910
--- /dev/null
+++ b/cmocka_tests/aes_test.c
@@ -0,0 +1,92 @@
+/**
+ *
+ * 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 <arch.h>
+#include <amcl.h>
+#include <setjmp.h> 
+#include <cmocka.h>
+#include <aes_test.h>
+#include <crypto_context.h>
+
+int aes_setup(void **state)
+{
+       crypto_context_t* context = calloc(1, sizeof(crypto_context_t));    
+       *state = context;
+       return 0;
+}
+
+int aes_teardown(void **state)
+{
+       crypto_context_t* context = *state;
+       free(context);
+       return 0;
+}
+
+void should_encrypt_aes_ecb_128_correctly(void **state)
+{
+       crypto_context_t *ctx = *state;
+       assert_non_null(ctx);
+       ctx->mode = encrypt
+}
+
+void should_fail_aes_ecb_128_with_invalidkey(void **state)
+{
+
+}
+
+void should_encrypt_aes_cbc_128_correctly(void **state)
+{
+}
+
+void should_encrypt_aes_ctr_128_correctly(void **state)
+{
+}
+
+void should_encrypt_aes_cfb_1_correctly(void **state)
+{
+}
+
+static void
+test_encryption_aes(struct crypto_context *context,
+                   char *plain_text, size_t plain_text_size)
+{
+       // arrange test
+       amcl_aes block_cipher;
+       uint8_t valid_aes_init;
+       int i = 0;
+       size_t block_size = get_block_size("aes",context->mode);
+       size_t n_blocks = plain_text_size / block_size;
+       valid_aes_init = AES_init(&block_cipher,
+                                 convert_mode(context->mode),
+                                 context->key_length,
+                                 context->key, context->init_vector);
+       // act & assert.
+       for (i = 0; i < n_blocks; i++) {
+               AES_encrypt(&block_cipher, &plain_text[i * block_size]);
+       }
+       octet ciphertext_octect =
+           { plain_text_size, plain_text_size, plain_text };
+       octet expected_ciphertext = { context->ciphertext_length,
+               context->ciphertext_length,
+               context->ciphertext
+       };
+       int ret = OCT_comp(&expected_ciphertext, &ciphertext_octect);
+       assert_int_equal(1, ret);
+
+}
diff --git a/cmocka_tests/cmake/AddCmockaTest.cmake 
b/cmocka_tests/cmake/AddCmockaTest.cmake
new file mode 100644
index 0000000..e02d48f
--- /dev/null
+++ b/cmocka_tests/cmake/AddCmockaTest.cmake
@@ -0,0 +1,51 @@
+
+
+function(ADD_CMOCKA_TEST _TARGET_NAME)
+
+    set(one_value_arguments
+    )
+
+    set(multi_value_arguments
+        SOURCES
+        COMPILE_OPTIONS
+        LINK_LIBRARIES
+        LINK_OPTIONS
+    )
+
+    cmake_parse_arguments(_add_cmocka_test
+        ""
+        "${one_value_arguments}"
+        "${multi_value_arguments}"
+        ${ARGN}
+    )
+
+    if (NOT DEFINED _add_cmocka_test_SOURCES)
+        message(FATAL_ERROR "No sources provided for target ${_TARGET_NAME}")
+    endif()
+
+    add_executable(${_TARGET_NAME} ${_add_cmocka_test_SOURCES})
+
+    if (DEFINED _add_cmocka_test_COMPILE_OPTIONS)
+        target_compile_options(${_TARGET_NAME}
+            PRIVATE ${_add_cmocka_test_COMPILE_OPTIONS}
+        )
+    endif()
+
+    if (DEFINED _add_cmocka_test_LINK_LIBRARIES)
+        target_link_libraries(${_TARGET_NAME}
+            PRIVATE ${_add_cmocka_test_LINK_LIBRARIES}
+        )
+    endif()
+
+    if (DEFINED _add_cmocka_test_LINK_OPTIONS)
+        set_target_properties(${_TARGET_NAME}
+            PROPERTIES LINK_FLAGS
+            ${_add_cmocka_test_LINK_OPTIONS}
+        )
+    endif()
+
+    add_test(${_TARGET_NAME}
+        ${TARGET_SYSTEM_EMULATOR} ${_TARGET_NAME}
+    )
+
+endfunction (ADD_CMOCKA_TEST)
diff --git a/cmocka_tests/cmake/Amcl.cmake b/cmocka_tests/cmake/Amcl.cmake
new file mode 100644
index 0000000..f600d8c
--- /dev/null
+++ b/cmocka_tests/cmake/Amcl.cmake
@@ -0,0 +1,45 @@
+IF(UNIX)
+    FIND_PATH(AMCL_INCLUDE_DIR amcl.h
+      "../include"
+      "${PROJECT_ROOT}/../include"
+      "${CMAKE_SOURCE_DIR}/../include"
+      NO_DEFAULT_PATH
+      )
+
+    SET(CMAKE_FIND_LIBRARY_PREFIXES "" "lib")
+    SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a" ".lib")
+    FIND_LIBRARY(AMCL_LIBRARY NAMES amcl_core PATHS
+      $ENV{LIB}
+      ../lib
+      /usr/lib/x86_64-linux-gnu
+      "$ENV{LIB_DIR}/lib"
+      "${CMAKE_SOURCE_DIR}/lib"
+      #mingw
+      c:/msys/local/lib
+      NO_DEFAULT_PATH
+      )
+ELSE()
+    FIND_PATH(AMCL_INCLUDE_DIR amcl.h
+      "${PROJECT_ROOT}/include"
+      "${PROJECT_ROOT}/../include"
+      )
+
+    FILE(GLOB AMCL_LIBRARY NAMES 
+        "${PROJECT_ROOT}/../lib/*amcl_core.lib"
+        "${CMAKE_SOURCE_DIR}/../lib/*amcl_core.so"
+        )
+ENDIF()
+
+
+IF (AMCL_INCLUDE_DIR AND AMCL_LIBRARY)
+    SET(AMCL_FOUND TRUE)
+ENDIF (AMCL_INCLUDE_DIR AND AMCL_LIBRARY)
+
+MESSAGE(STATUS "Apache Milagro Include: ${AMCL_INCLUDE_DIR}")
+
+
+IF (AMCL_FOUND)
+    MESSAGE(STATUS "Found Apache Milagro: ${AMCL_LIBRARY}")
+ELSE (AMCL_FOUND)
+        MESSAGE(FATAL_ERROR "Could not find Apache Milagro")
+ENDIF (AMCL_FOUND)
diff --git a/cmocka_tests/cmake/Cmocka.cmake b/cmocka_tests/cmake/Cmocka.cmake
new file mode 100644
index 0000000..d500796
--- /dev/null
+++ b/cmocka_tests/cmake/Cmocka.cmake
@@ -0,0 +1,47 @@
+
+IF(UNIX)
+    FIND_PATH(CMOCKA_INCLUDE_DIR cmocka.h
+      "$ENV{LIB_DIR}/include"
+      "/usr/include"
+      "/usr/include/cmockery"
+      "${CMAKE_SOURCE_DIR}/include"
+      "${CMAKE_SOURCE_DIR}/include/cmocka"
+      NO_DEFAULT_PATH
+      )
+
+    SET(CMAKE_FIND_LIBRARY_PREFIXES "" "lib")
+    SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a" ".lib")
+    FIND_LIBRARY(CMOCKA_LIBRARY NAMES cmocka PATHS
+      $ENV{LIB}
+      /usr/lib
+      /usr/lib/x86_64-linux-gnu
+      "$ENV{LIB_DIR}/lib"
+      "${CMAKE_SOURCE_DIR}/lib"
+      #mingw
+      c:/msys/local/lib
+      NO_DEFAULT_PATH
+      )
+ELSE()
+    FIND_PATH(CMOCKA_INCLUDE_DIR cmocka.h
+        "${PROJECT_ROOT}/include"
+      )
+
+    FILE(GLOB CMOCKA_LIBRARY NAMES
+        "${PROJECT_ROOT}/lib/cmocka*.lib"
+        "${PROJECT_ROOT}/lib/cmocka*.a"
+        )
+ENDIF()
+
+
+IF (CMOCKA_INCLUDE_DIR AND CMOCKA_LIBRARY)
+    SET(CMOCKA_FOUND TRUE)
+ENDIF (CMOCKA_INCLUDE_DIR AND CMOCKA_LIBRARY)
+
+MESSAGE(STATUS "CMocka Include: ${CMOCKA_INCLUDE_DIR}")
+
+
+IF (CMOCKA_FOUND)
+    MESSAGE(STATUS "Found CMocka: ${CMOCKA_LIBRARY}")
+ELSE (CMOCKA_FOUND)
+        MESSAGE(FATAL_ERROR "Could not find Cmocka")
+ENDIF (CMOCKA_FOUND)
diff --git a/cmocka_tests/cmake/CodeCoverage.cmake 
b/cmocka_tests/cmake/CodeCoverage.cmake
new file mode 100644
index 0000000..4d8bd43
--- /dev/null
+++ b/cmocka_tests/cmake/CodeCoverage.cmake
@@ -0,0 +1,237 @@
+include(CMakeParseArguments)
+ 
+ # Check prereqs
+ find_program( GCOV_PATH gcov )
+ find_program( LCOV_PATH  NAMES lcov lcov.bat lcov.exe lcov.perl)
+ find_program( GENHTML_PATH NAMES genhtml genhtml.perl genhtml.bat )
+ find_program( GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/scripts/test)
+ find_package (Python COMPONENTS Interpreter Development)
+ 
+ if(NOT GCOV_PATH)
+     message(FATAL_ERROR "gcov not found! Aborting...")
+ endif() # NOT GCOV_PATH
+ 
+ if("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang")
+     if("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS 3)
+         message(FATAL_ERROR "Clang version must be 3.0.0 or greater! 
Aborting...")
+     endif()
+ elseif(NOT CMAKE_COMPILER_IS_GNUCXX)
+     message(FATAL_ERROR "Compiler is not GNU gcc! Aborting...")
+ endif()
+ 
+ set(COVERAGE_COMPILER_FLAGS "-g --coverage -fprofile-arcs -ftest-coverage"
+     CACHE INTERNAL "")
+ 
+ set(CMAKE_CXX_FLAGS_COVERAGE
+     ${COVERAGE_COMPILER_FLAGS}
+     CACHE STRING "Flags used by the C++ compiler during coverage builds."
+     FORCE )
+ set(CMAKE_C_FLAGS_COVERAGE
+     ${COVERAGE_COMPILER_FLAGS}
+     CACHE STRING "Flags used by the C compiler during coverage builds."
+     FORCE )
+ set(CMAKE_EXE_LINKER_FLAGS_COVERAGE
+     ""
+     CACHE STRING "Flags used for linking binaries during coverage builds."
+     FORCE )
+ set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
+     ""
+     CACHE STRING "Flags used by the shared libraries linker during coverage 
builds."
+     FORCE )
+ mark_as_advanced(
+     CMAKE_CXX_FLAGS_COVERAGE
+     CMAKE_C_FLAGS_COVERAGE
+     CMAKE_EXE_LINKER_FLAGS_COVERAGE
+     CMAKE_SHARED_LINKER_FLAGS_COVERAGE )
+ 
+ if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
+     message(WARNING "Code coverage results with an optimised (non-Debug) 
build may be misleading")
+ endif() # NOT CMAKE_BUILD_TYPE STREQUAL "Debug"
+ 
+ if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
+     link_libraries(gcov)
+ else()
+     set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
+ endif()
+ 
+ # Defines a target for running and collection code coverage information
+ # Builds dependencies, runs the given executable and outputs reports.
+ # NOTE! The executable should always have a ZERO as exit code otherwise
+ # the coverage generation will not complete.
+ #
+ # SETUP_TARGET_FOR_COVERAGE_LCOV(
+ #     NAME testrunner_coverage                    # New target name
+ #     EXECUTABLE testrunner -j ${PROCESSOR_COUNT} # Executable in 
PROJECT_BINARY_DIR
+ #     DEPENDENCIES testrunner                     # Dependencies to build 
first
+ # )
+ function(SETUP_TARGET_FOR_COVERAGE_LCOV)
+ 
+     set(options NONE)
+     set(oneValueArgs NAME)
+     set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES LCOV_ARGS 
GENHTML_ARGS)
+     cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" 
"${multiValueArgs}" ${ARGN})
+ 
+     if(NOT LCOV_PATH)
+         message(FATAL_ERROR "lcov not found! Aborting...")
+     endif() # NOT LCOV_PATH
+ 
+     if(NOT GENHTML_PATH)
+         message(FATAL_ERROR "genhtml not found! Aborting...")
+     endif() # NOT GENHTML_PATH
+ 
+     # Setup target
+     add_custom_target(${Coverage_NAME}
+ 
+         # Cleanup lcov
+         COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} 
-directory . --zerocounters
+         # Create baseline to make sure untouched files show up in the report
+         COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} 
-c -i -d . -o ${Coverage_NAME}.base
+ 
+         # Run tests
+         COMMAND ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}
+ 
+         # Capturing lcov counters and generating report
+         COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} 
--directory . --capture --output-file ${Coverage_NAME}.info
+         # add baseline counters
+         COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} 
-a ${Coverage_NAME}.base -a ${Coverage_NAME}.info --output-file 
${Coverage_NAME}.total
+         COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} 
--remove ${Coverage_NAME}.total ${COVERAGE_LCOV_EXCLUDES} --output-file 
${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
+         COMMAND ${GENHTML_PATH} ${Coverage_GENHTML_ARGS} -o ${Coverage_NAME} 
${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
+         COMMAND ${CMAKE_COMMAND} -E remove ${Coverage_NAME}.base 
${Coverage_NAME}.total ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
+ 
+         WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
+         DEPENDS ${Coverage_DEPENDENCIES}
+         COMMENT "Resetting code coverage counters to zero.\nProcessing code 
coverage counters and generating report."
+     )
+ 
+     # Show where to find the lcov info report
+     add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
+         COMMAND ;
+         COMMENT "Lcov code coverage info report saved in 
${Coverage_NAME}.info."
+     )
+ 
+     # Show info where to find the report
+     add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
+         COMMAND ;
+         COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view 
the coverage report."
+     )
+ 
+ endfunction() # SETUP_TARGET_FOR_COVERAGE_LCOV
+ 
+ # Defines a target for running and collection code coverage information
+ # Builds dependencies, runs the given executable and outputs reports.
+ # NOTE! The executable should always have a ZERO as exit code otherwise
+ # the coverage generation will not complete.
+ #
+ # SETUP_TARGET_FOR_COVERAGE_GCOVR_XML(
+ #     NAME ctest_coverage                    # New target name
+ #     EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in 
PROJECT_BINARY_DIR
+ #     DEPENDENCIES executable_target         # Dependencies to build first
+ # )
+ function(SETUP_TARGET_FOR_COVERAGE_GCOVR_XML)
+ 
+     set(options NONE)
+     set(oneValueArgs NAME)
+     set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
+     cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" 
"${multiValueArgs}" ${ARGN})
+ 
+     if(NOT Python_FOUND)
+         message(FATAL_ERROR "python not found! Aborting...")
+     endif()
+ 
+     if(NOT GCOVR_PATH)
+         message(FATAL_ERROR "gcovr not found! Aborting...")
+     endif() # NOT GCOVR_PATH
+ 
+     # Combine excludes to several -e arguments
+     set(GCOVR_EXCLUDES "")
+     foreach(EXCLUDE ${COVERAGE_GCOVR_EXCLUDES})
+         string(REPLACE "*" "\\*" EXCLUDE_REPLACED ${EXCLUDE})
+         list(APPEND GCOVR_EXCLUDES "-e")
+         list(APPEND GCOVR_EXCLUDES "${EXCLUDE_REPLACED}")
+     endforeach()
+ 
+     add_custom_target(${Coverage_NAME}
+         # Run tests
+         ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}
+ 
+         # Running gcovr
+         COMMAND ${GCOVR_PATH} --xml
+             -r ${PROJECT_SOURCE_DIR} ${GCOVR_EXCLUDES}
+             --object-directory=${PROJECT_BINARY_DIR}
+             -o ${Coverage_NAME}.xml
+         WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
+         DEPENDS ${Coverage_DEPENDENCIES}
+         COMMENT "Running gcovr to produce Cobertura code coverage report."
+     )
+ 
+     # Show info where to find the report
+     add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
+         COMMAND ;
+         COMMENT "Cobertura code coverage report saved in 
${Coverage_NAME}.xml."
+     )
+ 
+ endfunction() # SETUP_TARGET_FOR_COVERAGE_GCOVR_XML
+ 
+ # Defines a target for running and collection code coverage information
+ # Builds dependencies, runs the given executable and outputs reports.
+ # NOTE! The executable should always have a ZERO as exit code otherwise
+ # the coverage generation will not complete.
+ #
+ # SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML(
+ #     NAME ctest_coverage                    # New target name
+ #     EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in 
PROJECT_BINARY_DIR
+ #     DEPENDENCIES executable_target         # Dependencies to build first
+ # )
+ function(SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML)
+ 
+     set(options NONE)
+     set(oneValueArgs NAME)
+     set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
+     cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" 
"${multiValueArgs}" ${ARGN})
+ 
+     if(NOT Python_FOUND)
+         message(FATAL_ERROR "python not found! Aborting...")
+     endif()
+ 
+     if(NOT GCOVR_PATH)
+         message(FATAL_ERROR "gcovr not found! Aborting...")
+     endif() # NOT GCOVR_PATH
+ 
+     # Combine excludes to several -e arguments
+     set(GCOVR_EXCLUDES "")
+     foreach(EXCLUDE ${COVERAGE_GCOVR_EXCLUDES})
+         string(REPLACE "*" "\\*" EXCLUDE_REPLACED ${EXCLUDE})
+         list(APPEND GCOVR_EXCLUDES "-e")
+         list(APPEND GCOVR_EXCLUDES "${EXCLUDE_REPLACED}")
+     endforeach()
+ 
+     add_custom_target(${Coverage_NAME}
+         # Run tests
+         ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}
+ 
+         # Create folder
+         COMMAND ${CMAKE_COMMAND} -E make_directory 
${PROJECT_BINARY_DIR}/${Coverage_NAME}
+ 
+         # Running gcovr
+         COMMAND ${Python_EXECUTABLE} ${GCOVR_PATH} --html --html-details
+             -r ${PROJECT_SOURCE_DIR} ${GCOVR_EXCLUDES}
+             --object-directory=${PROJECT_BINARY_DIR}
+             -o ${Coverage_NAME}/index.html
+         WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
+         DEPENDS ${Coverage_DEPENDENCIES}
+         COMMENT "Running gcovr to produce HTML code coverage report."
+     )
+ 
+     # Show info where to find the report
+     add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
+         COMMAND ;
+         COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view 
the coverage report."
+     )
+ 
+ endfunction() # SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML
+ 
+ function(APPEND_COVERAGE_COMPILER_FLAGS)
+     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}" 
PARENT_SCOPE)
+     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" 
PARENT_SCOPE)
+     message(STATUS "Appending code coverage compiler flags: 
${COVERAGE_COMPILER_FLAGS}")
+ endfunction() # APPEND_COVERAGE_COMPILER_FLAGS
diff --git a/cmocka_tests/cmake_install.cmake b/cmocka_tests/cmake_install.cmake
new file mode 100644
index 0000000..d4d94e8
--- /dev/null
+++ b/cmocka_tests/cmake_install.cmake
@@ -0,0 +1,49 @@
+# Install script for directory: 
/home/jozoppi/projects/incubator-milagro-crypto-c/unit_test
+
+# Set the install prefix
+if(NOT DEFINED CMAKE_INSTALL_PREFIX)
+  set(CMAKE_INSTALL_PREFIX "/usr/local")
+endif()
+string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
+
+# Set the install configuration name.
+if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
+  if(BUILD_TYPE)
+    string(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
+           CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
+  else()
+    set(CMAKE_INSTALL_CONFIG_NAME "")
+  endif()
+  message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
+endif()
+
+# Set the component getting installed.
+if(NOT CMAKE_INSTALL_COMPONENT)
+  if(COMPONENT)
+    message(STATUS "Install component: \"${COMPONENT}\"")
+    set(CMAKE_INSTALL_COMPONENT "${COMPONENT}")
+  else()
+    set(CMAKE_INSTALL_COMPONENT)
+  endif()
+endif()
+
+# Install shared libraries without execute permission?
+if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)
+  set(CMAKE_INSTALL_SO_NO_EXE "1")
+endif()
+
+# Is this installation the result of a crosscompile?
+if(NOT DEFINED CMAKE_CROSSCOMPILING)
+  set(CMAKE_CROSSCOMPILING "FALSE")
+endif()
+
+if(CMAKE_INSTALL_COMPONENT)
+  set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt")
+else()
+  set(CMAKE_INSTALL_MANIFEST "install_manifest.txt")
+endif()
+
+string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT
+       "${CMAKE_INSTALL_MANIFEST_FILES}")
+file(WRITE 
"/home/jozoppi/projects/incubator-milagro-crypto-c/unit_test/${CMAKE_INSTALL_MANIFEST}"
+     "${CMAKE_INSTALL_MANIFEST_CONTENT}")
diff --git a/cmocka_tests/crypto_context.c b/cmocka_tests/crypto_context.c
new file mode 100644
index 0000000..959d00d
--- /dev/null
+++ b/cmocka_tests/crypto_context.c
@@ -0,0 +1,76 @@
+/*
+* 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 <crypto_context.h>
+
+/* @brief  Create a new encryption context assigning the loader
+*  @param  encryption_mode  Mode of encryption (ECB, CBC, CFB, CTR)
+*  @param  loader           Init function to be used for parsing the vector 
file.
+*/
+crypto_context_t *new_context(encryption_mode mode,
+                             void (*loader) (crypto_context_t *))
+{
+       crypto_context_t *ctx = calloc(1, sizeof(struct crypto_context));
+       ctx->parse_vector_file = loader;
+       ctx->mode = mode;
+       return ctx;
+}
+
+/*
+* @brief Delete the memory for crypto context
+* @param ctx Context to be used.
+*/
+void delete_context(crypto_context_t * ctx)
+{
+       free(ctx->ciphertext);
+       free(ctx->key);
+       free(ctx->init_vector);
+}
+
+/*
+* @brief Convert the encryption mode to an integer;
+* @param mode encryption_mode Mode of encryption (ECB, CBC, CFB, CTR)
+*/
+int convert_mode(encryption_mode mode)
+{
+       return (int)mode;
+}
+
+/*
+ * @brief Compute the block_size foreach algorithm;
+ * @param algo   Block Cipher Algorithm name
+ * @param mode   Mode for encryption
+ */
+size_t get_block_size(char *algo, encryption_mode mode)
+{
+       if (!strcmp("aes", algo)) {
+               // we are aes
+               switch (mode) {
+               case cbc_mode:
+               case ecb_mode:
+               case ctr_mode:
+                       {
+                               return 16;
+                       }
+               case cfb_mode:
+                       {
+                               return 1;
+                       }
+               }
+       }
+       return 16;
+}
diff --git a/cmocka_tests/include/aes_test.h b/cmocka_tests/include/aes_test.h
new file mode 100644
index 0000000..42f156d
--- /dev/null
+++ b/cmocka_tests/include/aes_test.h
@@ -0,0 +1,26 @@
+/*
+* 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.
+ */
+#ifndef AES_TEST_H
+#define AES_TEST_H
+#include <string.h>
+#include <crypto_context.h>
+extern void parse_aes_vectorfile(struct crypto_context* context);
+extern void should_encrypt_aes_ecb_128_correctly(void** state);
+extern void should_encrypt_aes_cbc_128_correctly(void** state);
+extern void should_encrypt_aes_ctr_128_correctly(void** state);
+extern void should_encrypt_aes_cfb_1_correctly(void** state);
+#endif
diff --git a/cmocka_tests/include/crypto_context.h 
b/cmocka_tests/include/crypto_context.h
new file mode 100644
index 0000000..40ce528
--- /dev/null
+++ b/cmocka_tests/include/crypto_context.h
@@ -0,0 +1,63 @@
+/*
+* 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.
+ */
+#ifndef CRYPTO_CONTEXT
+#define CRYPTO_CONTEXT 
+#include <stdlib.h>
+#define CRYPTO_VEC_PATH_MAX 256
+typedef enum e_mode 
+{
+    ecb_mode,
+    cbc_mode,
+    cfb_mode,
+    ctr_mode
+} encryption_mode;
+typedef struct crypto_context
+{
+   char* ciphertext;                    /*<!-- Ciphertext to be compared */
+   size_t ciphertext_length;            /*<!-- Ciphertext lenght */
+   char filename[CRYPTO_VEC_PATH_MAX];  /*<!-- Path of the vector test 
filename */
+   char* key;                           /*<!-- Key to be used */
+   size_t key_length;                   /*<!-- Key length */
+   char* init_vector;                   /*<!-- IV */
+   size_t init_vector_length;           /*<!-- Vector length */
+   encryption_mode mode;                 /*<!-- Kind of encryption mode */
+   void (*parse_vector_file)(struct crypto_context* self); /*<!-- function for 
loading 
+                                                                  the file and 
init the structure */
+} crypto_context_t;
+
+/* @brief  Create a new encryption context assigning the loader
+*  @param  encryption_mode  Mode of encryption (ECB, CBC, CFB, CTR)
+*  @param  loader           Init function to be used for parsing the vector 
file.
+*/
+extern crypto_context_t* new_context(encryption_mode mode, void 
(*loader)(crypto_context_t*));
+/*
+* @brief Delete the memory for crypto context
+* @param ctx Context to be used.
+*/
+extern void delete_context(crypto_context_t* ctx);
+/*
+* @brief Convert the encryption mode to an integer;
+* @param mode encryption_mode Mode of encryption (ECB, CBC, CFB, CTR)
+*/
+extern int convert_mode(encryption_mode mode);
+/*
+ * @brief Compute the block_size foreach algorithm;
+ * @param algo   Block Cipher Algorithm name
+ * @param mode   Mode for encryption
+ */
+extern size_t get_block_size(char* algo, encryption_mode mode);
+#endif
diff --git a/cmocka_tests/test_main.c b/cmocka_tests/test_main.c
new file mode 100644
index 0000000..089f7d2
--- /dev/null
+++ b/cmocka_tests/test_main.c
@@ -0,0 +1,19 @@
+
+#include <aes_test.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <setjmp.h>
+#include <cmocka.h>
+
+
+int main(void)
+{
+       const struct CMUnitTest tests[] = {
+               cmocka_unit_test(should_encrypt_aes_ecb_128_correctly),
+               cmocka_unit_test(should_encrypt_aes_cbc_128_correctly),
+               cmocka_unit_test(should_encrypt_aes_ctr_128_correctly),
+               cmocka_unit_test(should_encrypt_aes_cfb_1_correctly)
+       };
+       return cmocka_run_group_tests(tests, NULL, NULL);
+}

Reply via email to