diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6a8bc10 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vscode +build \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..19e05ea --- /dev/null +++ b/.travis.yml @@ -0,0 +1,51 @@ +dist: focal +sudo: required # используем Virtual Machine (а не Docker container) + +language: c + +os: + - linux + +compiler: + - gcc + +addons: + apt: + packages: + - cmake + - lcov + - gcovr + +install: + - sudo apt -y install python3-pip + - sudo apt-get install valgrind + - sudo pip3 install cpplint + - sudo apt update + - sudo apt install build-essential + - sudo apt install libgtest-dev + - sudo apt-get install cmake + - sudo apt-get install -y gcovr + - sudo apt install lcov + - sudo apt install cppcheck + - sudo apt install curl + +before_script: + - sudo apt-get install -y libgtest-dev + - cd /usr/src/gtest + - sudo cmake CMakeLists.txt && sudo make + - cd "${TRAVIS_BUILD_DIR}"/ + - ls + - sudo mkdir build + - cd build + - sudo cmake .. + - sudo make clean + - sudo make + - cd .. + - cd .. + +script: + - cpplint --extensions=c,cpp src/main.c src/find_letters.c include/testy/find_letters.h test/main.cpp + - cppcheck --enable=warning,performance,portability,style --language=c++ ./ + - valgrind --track-origins=yes --child-silent-after-fork=yes --leak-check=full "${TRAVIS_BUILD_DIR}"/build/TEST + - cd "${TRAVIS_BUILD_DIR}"/src + - bash <(curl -s https://codecov.io/bash) \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..cd88d48 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "C_Cpp.errorSquiggles": "Disabled", + "files.associations": { + "find_letters.h": "c", + "stdio.h": "c", + "types.h": "c" + } +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..75874f4 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,51 @@ +cmake_minimum_required(VERSION 3.16) +project(try C CXX) + +set(CMAKE_C_STANDARD 11) +set(CMAKE_CXX_STANDARD 17) + +set(CMAKE_C_FLAGS "-g -Wall -Werror -Wextra -O3 -fprofile-arcs -ftest-coverage") +set(CMAKE_CXX_FLAGS "-g -Wall -O3 -fprofile-arcs -ftest-coverage") + +find_package(GTest REQUIRED) +find_package(Threads REQUIRED) + + + +set(DIR ${CMAKE_CURRENT_SOURCE_DIR}) +add_definitions(-DSOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}") + +set(INC_DIR ${DIR}/include/testy) + +set(SRC_DIR ${DIR}/src) + +set(TESTS_DIR ${DIR}/test) + +include_directories("${GTEST_INCLUDE_DIRS}") +include_directories(/include/testy) + +add_library(f_letter STATIC + ${INC_DIR}/find_letters.h + ${SRC_DIR}/find_letters.c) + +add_library(multi_compute_matrix MODULE + ${INC_DIR}/find_letters.h + ${SRC_DIR}/find_letters.c) + +add_executable(TEST + test/main.cpp) + +target_include_directories(TEST PUBLIC ${INC_DIR}) + +target_link_libraries(TEST ${GTEST_LIBRARIES} Threads::Threads pthread -ldl f_letter) + +enable_testing() + + + +add_executable(try + ${SRC_DIR}/main.c) + +target_link_libraries(try Threads::Threads pthread -ldl f_letter) + +target_include_directories(try PUBLIC ${INC_DIR}) diff --git a/CMakeLists.txt.in b/CMakeLists.txt.in new file mode 100644 index 0000000..d9f7850 --- /dev/null +++ b/CMakeLists.txt.in @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 3.1) + +project(googletest-download NONE) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-pthread") + +include(ExternalProject) +ExternalProject_Add(googletest + GIT_REPOSITORY https://github.com/google/googletest.git + GIT_TAG release-1.8.1 + SOURCE_DIR "${CMAKE_BINARY_DIR}/googletest-src" + BINARY_DIR "${CMAKE_BINARY_DIR}/googletest-build" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" +) diff --git a/CPPLINT.cfg b/CPPLINT.cfg new file mode 100644 index 0000000..87e5f7a --- /dev/null +++ b/CPPLINT.cfg @@ -0,0 +1,6 @@ +headers=h +linelength=120 +filter=-runtime/int +filter=-legal/copyright +filter=-build/include_subdir +filter=-build/include \ No newline at end of file diff --git a/README.rst b/README.rst index 55b11e0..0271791 100644 --- a/README.rst +++ b/README.rst @@ -1,14 +1,11 @@ .. image:: https://travis-ci.com/Golem24434/IZ2.svg?branch=other - :target: https://travis-ci.com/Golem24434/IZ2 -.. image:: https://codecov.io/gh/Golem24434/IZ2/branch/other/graph/badge.svg?token=A9Q0DV7S7K - :target: https://codecov.io/gh/Golem24434/IZ2 + :target: https://travis-ci.com/Golem24434/IZ2CD Второе индивидуальное задание по курсу "Углубленное программирование на C/C++ ----------------------------------------------------------------------------- -Вариант #12 -В вашем распоряжении — квадратная матрица из 10 000 x 10 000 чисел. Составьте наивный алгоритм подсчета сумм диагональных элементов матрицы (для каждой диагонали), а затем реализуйте параллельный алгоритм с использованием нескольких процессов с учетом оптимизации работы с кэш-памятью. - +Вариант #35 +В вашем распоряжении – данные о письмах пользователей (отправитель, список получателей, тема, тело письма, дата отправки). Суммарное количество пользователей – 10к, писем – 1 млн. Реализуйте последовательный и параллельный алгоритм поиска с использованием нескольких процессов тем всех писем, которые были получены пользователем в определённый временной промежуток, отсортированных по дате. На что необходимо обратить внимание: - основная информация описана в https://park.mail.ru/blog/topic/view/14270/ - параллельная реализация не должна быть осуществлена с помощью процессов, когда требуется реализация с помощью потоков (и наоборот); diff --git a/include/testy/find_letters.h b/include/testy/find_letters.h new file mode 100644 index 0000000..33e368b --- /dev/null +++ b/include/testy/find_letters.h @@ -0,0 +1,58 @@ +#ifndef FUNCTION_H +#define FUNCTION_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_NUMBER_LETTERS 1000000 +#define MAX_NUMBER_TOPICS 1000 + + +typedef struct letter letter; +typedef struct date_frame date_frame; +typedef struct str_topics str_topics; + +struct str_topics { + int number; + char topics[100][10]; +}; + + +struct date_frame { + int year; + int month; + int day; +}; + +struct letter { + int sender_id; + int ecipient_id[10]; + char topic[10]; + int number_ecipient; + date_frame date; +}; + +int testing_letters_el(letter** letters, int N); + +int date_in_key(date_frame date); + +int binary_search(letter** k, int key, int N); + +int get_number_process(); + +int fill_in_elements(letter** letters); + +str_topics* singleprocces_find_topic(letter** letters, int start,int end, int number_user); + +str_topics* multiprocess_find_topic(letter** letters, int start,int end, int number_user); + +int equality_test(str_topics* topics1,str_topics* topics2); +#endif \ No newline at end of file diff --git a/src/find_letters.c b/src/find_letters.c new file mode 100644 index 0000000..ee1e5f1 --- /dev/null +++ b/src/find_letters.c @@ -0,0 +1,225 @@ +#include "../include/testy/find_letters.h" + + +int get_number_process() { + + unsigned int eax=11,ebx=0,ecx=1,edx=0; + + asm volatile("cpuid" + : "=a" (eax), + "=b" (ebx), + "=c" (ecx), + "=d" (edx) + : "0" (eax), "2" (ecx) + : ); + + return eax; +} + +int date_in_key(date_frame date) { + + int value = (((date.year)*12 + date.month)*30 + date.day); + + return value; +} + +int binary_search(letter** k, int key, int N) { + if (k == NULL) { + printf("Ошибка! На вход функции binary_search подается нулевой указатель."); + return -1; + } + int left = 0; + int right = N-1; + int search = -1; + while (left <= right) + { + int mid = (left + right) / 2; + if (k[mid] == NULL) { + printf("Ошибка! Элемент в массиве является нулевым указателем."); + } + if (key == date_in_key(k[mid]->date)) { + search = mid; + break; + } + if (key < date_in_key(k[mid]->date)) { + right = mid - 1; + } + else { + left = mid + 1; + } + } + + if (search == -1) { + if (left == N) { + left=left-1; + } + search = left; + } + return search; +} + +int fill_in_elements(letter** letters) { + if (letters == NULL) { + printf("Ошибка! На вход функции fill_in_elements подается нулевой указатель."); + return -1; + } + for (int i=0;isender_id = i; + letters[i]->number_ecipient = rand() % 7 + 1; + for (int j = 0; jnumber_ecipient; ++j) { + letters[i]->ecipient_id[j] = rand() % MAX_NUMBER_LETTERS; + } + int Y = MAX_NUMBER_LETTERS / 10; + int M = Y / 12; + letters[i]->date.year = i / Y; + letters[i]->date.month = (i % Y) / M; + letters[i]->date.day = ((i % Y) % M) % 30; + for (int j=0;j<9;++j) { + letters[i]->topic[j] = 65 + rand() % 25 ; + } + letters[i]->topic[9] = '\0'; + } + return 0; +} + +str_topics* singleprocces_find_topic(letter** letters, int start,int end, int number_user) { + if (letters == NULL) { + printf("Ошибка! На вход функции singleprocces_find_topic подается нулевой указатель."); + return NULL; + } + str_topics* find_topics = (str_topics*) calloc(MAX_NUMBER_TOPICS,sizeof(str_topics)); + find_topics->number = 0; + if (find_topics == NULL) { + printf("Ошибка! В функции singleprocces_find_topic не выделена память."); + return NULL; + } + for (int i=start;i<=end;++i) { + for (int j=0;jnumber_ecipient;++j){ + if (letters[i]->ecipient_id[j] == number_user) { + for (int o=0;o<9;++o) { + find_topics->topics[find_topics->number][o] = letters[i]->topic[o]; + } + find_topics->number = find_topics->number + 1; + } + } + } + return find_topics; +} + +str_topics* multiprocess_find_topic(letter** letters, int start,int end, int number_user) { + if (letters == NULL) { + printf("Ошибка! На вход функции multiprocess_find_topic подается нулевой указатель."); + return 0; + } + long page_size = getpagesize(); + str_topics* shared_memory = mmap(NULL, page_size, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (shared_memory == MAP_FAILED) { + return NULL; + } + + + int numberOfChildren = get_number_process(); + pid_t *childPids = NULL; + pid_t p; + + /* Allocate array of child PIDs: error handling omitted for brevity */ + childPids = malloc(numberOfChildren * sizeof(pid_t)); + + if (childPids == NULL) { + return NULL; + } + + int step=(end-start)/numberOfChildren; + int begin = start; + + /* Start up children */ + for (int ii = 0; ii < numberOfChildren; ++ii) { + start = begin + ii*step; + end = begin + (ii+1)*step; + if ((p = fork()) == 0) { + str_topics* topics_singl = singleprocces_find_topic(letters, start, end, number_user); + for (int i=0;inumber;++i) { + for (int j=0;j<10;++j) { + shared_memory->topics[shared_memory->number][j] = topics_singl->topics[i][j]; + } + shared_memory->number = shared_memory->number + 1; + } + exit(0); + } + else { + childPids[ii] = p; + } + } + + /* Wait for children to exit */ + int stillWaiting; + do { + stillWaiting = 0; + for (int ii = 0; ii < numberOfChildren; ++ii) { + if (childPids[ii] > 0) { + if (waitpid(childPids[ii], NULL, WNOHANG) != 0) { + /* Child is done */ + childPids[ii] = 0; + } + else { + /* Still waiting on this child */ + stillWaiting = 1; + } + } + /* Give up timeslice and prevent hard loop: this may not work on all flavors of Unix */ + sleep(0); + } + } while (stillWaiting); + + /* Cleanup */ + free(childPids); + return shared_memory; + +} + +int testing_letters_el(letter** letters, int N) { + + for (int i=0;isender_id = i; + letters[i]->number_ecipient = 1; + letters[i]->ecipient_id[0] = i % 50; + int Y = (N / 10)+1; + int M = (Y / 12)+1; + letters[i]->date.year = (int)(i / Y); + letters[i]->date.month = (int)((i % Y ) / M ); + letters[i]->date.day = (int)(((i % Y) % M ) % 30); + for (int j=0;j<9;++j) { + letters[i]->topic[j] = 65 + i % 7; + } + letters[i]->topic[9] = '\0'; + } + + return 0; +} + +int equality_test(str_topics* topics1,str_topics* topics2) { + if (topics1->number == topics2->number) { + for (int i=0;inumber;++i) { + if (topics1->topics[i][0] != topics2->topics[i][0]) { + return 0; + } + } + return 1; + } else { + return 0; + } +} + + diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..aa69d4d --- /dev/null +++ b/src/main.c @@ -0,0 +1,80 @@ +#include "../include/testy/find_letters.h" + + +int main() { + srand(time(NULL)); + + void *handle = dlopen("./find_let.so", RTLD_LAZY); + + int (*funcpt)(); + + *(void **)(&funcpt) = dlsym(handle, "multiprocess_find_topic"); + + letter* letters[MAX_NUMBER_LETTERS]; + date_frame start_letters,end_letters; + str_topics* topics1; + + fill_in_elements(letters); + int sc=1; + // printf("Выберите с какого года искать письма?[2010-2020]\n"); + // if (scanf("%d", &sc) == -1) return -1; + // start_letters.year = sc-2011; + // printf("Выберите с какого месяца искать письма?[1-12]\n"); + // if (scanf("%d", &sc) == -1) return -1; + // start_letters.month = sc; + // printf("Выберите с какого дня искать письма?[1-30]\n"); + // if (scanf("%d", &sc) == -1) return -1; + // start_letters.day = sc; + + printf("Выберите до какого года искать письма?[2010-2020]\n"); + if (scanf("%d", &sc) == -1) return -1; + end_letters.year = sc-2011; + printf("Выберите до какого месяца искать письма?[1-12]\n"); + if (scanf("%d", &sc) == -1) return -1; + end_letters.month = sc; + printf("Выберите до какого дня искать письма?[1-30]\n"); + if (scanf("%d", &sc) == -1) return -1; + end_letters.day = sc; + // end_letters.year =start_letters.year; + // end_letters.month = start_letters.month; + // end_letters.day = start_letters.day + 15; + start_letters.year = 0; + start_letters.month = 0; + start_letters.day = 1; + // end_letters.year = 9; + // end_letters.month = 4; + // end_letters.day = 25; + int id; + printf("Выберите id пользователя?[1-30]\n"); + if (scanf("%d", &id) == -1) return -1; + + int numb_start = binary_search(letters, date_in_key(start_letters),MAX_NUMBER_LETTERS); + int numb_end = binary_search(letters, date_in_key(end_letters),MAX_NUMBER_LETTERS); + topics1 = singleprocces_find_topic(letters, numb_start, numb_end, 15); + printf("Многопроцессорная реализация?[0/1]\n"); + if (scanf("%d", &sc) == -1) return -1; + while (sc != 0 && sc != 1) { + if (sc == 1) { + topics1 = multiprocess_find_topic(letters, numb_start, numb_end, 15); + } else { + if (sc == 0) { + topics1 = singleprocces_find_topic(letters, numb_start, numb_end, 15); + } else { + printf("Введите 0 или 1.\n"); + if (scanf("%d", &sc) == -1) return -1; + } + } + } + + for (int i=0;inumber;++i) { + printf("%d-ая тема пользователя %s\n",i,topics1->topics[i]); + } + if (sc == 1) { + free(topics1); + } else { + if (sc == 0 ) { + munmap(topics1, getpagesize()); + } + } + return 0; +} \ No newline at end of file diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000..3a3df05 --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,18 @@ +include_directories("${PROJECT_SOURCE_DIR}/include") + +file(GLOB sources "${PROJECT_SOURCE_DIR}/src/*.c") +list(REMOVE_ITEM sources "${PROJECT_SOURCE_DIR}/src/main.c") + +file(GLOB tests "${PROJECT_SOURCE_DIR}/test/*.cpp") +list(REMOVE_ITEM tests "${PROJECT_SOURCE_DIR}/test/main.cpp") + +foreach(file ${tests}) + set(name) + get_filename_component(name ${file} NAME_WE) + add_executable("${name}_tests" + ${sources} + ${file} + "${PROJECT_SOURCE_DIR}/test/main.cpp") + target_link_libraries("${name}_tests" gtest_main) + add_test(NAME ${name} COMMAND "${name}_tests") +endforeach() diff --git a/test/main.cpp b/test/main.cpp new file mode 100644 index 0000000..11be21a --- /dev/null +++ b/test/main.cpp @@ -0,0 +1,261 @@ +#include "gtest/gtest.h" + +extern "C" { +#include "../include/testy/find_letters.h" +} + +TEST(date_in_key, ok) { + date_frame date; + date.year = 10; + date.month = 5; + date.day = 3; + EXPECT_EQ(date_in_key(date), 3753); +} + +TEST(binary_search, ok) { + letter* let[200]; + testing_letters_el(let,200); + EXPECT_EQ(binary_search(let,753,200), 46); + for (int i = 0;i<200;++i) { + free(let[i]); + } +} + +TEST(binary_search_null, not_ok) { + letter** let=NULL; + EXPECT_EQ(binary_search(let,753,200), -1); +} + +TEST(fill_in_elements, ok) { + letter** letters = NULL; + EXPECT_EQ(fill_in_elements(letters), -1); +} + + +TEST(multi_and_singleproc, not_ok) { + letter* letters[MAX_NUMBER_LETTERS]; + fill_in_elements(letters); + date_frame start_letters,end_letters; + start_letters.year = 0; + start_letters.month = 0; + start_letters.day = 1; + end_letters.year = 9; + end_letters.month = 4; + end_letters.day = 25; + int numb_start = binary_search(letters, date_in_key(start_letters),MAX_NUMBER_LETTERS); + int numb_end = binary_search(letters, date_in_key(end_letters),MAX_NUMBER_LETTERS); + str_topics* topics1 = singleprocces_find_topic(letters, numb_start, numb_end,7); + str_topics* topics2 = multiprocess_find_topic(letters, numb_start, numb_end,6); + EXPECT_EQ(equality_test(topics1,topics2),0); + + for (int i = 0;inumber=4; + topics2->topics[0][0]='D'; + topics2->topics[1][0]='E'; + topics2->topics[2][0]='F'; + topics2->topics[3][0]='G'; + EXPECT_EQ(equality_test(topics1,topics2),1); + for (int i = 0;i<200;++i) { + free(letters[i]); + } + free(topics1); + free(topics2); +} + + + +TEST(singleproc_1000el, ok) { + letter* letters[1000]; + date_frame start_letters,end_letters; + start_letters.year = 8; + start_letters.month = 0; + start_letters.day = 0; + end_letters.year = 8; + end_letters.month = 12; + end_letters.day = 0; + testing_letters_el(letters,1000); + int numb_start = binary_search(letters, date_in_key(start_letters),1000); + int numb_end = binary_search(letters, date_in_key(end_letters),1000); + str_topics* topics1 = singleprocces_find_topic(letters, numb_start, numb_end, 15); + str_topics* topics2 = (str_topics*) malloc(sizeof(str_topics)); + topics2->number=2; + topics2->topics[0][0]='D'; + topics2->topics[1][0]='E'; + EXPECT_EQ(equality_test(topics1,topics2),1); + for (int i = 0;i<1000;++i) { + free(letters[i]); + } + free(topics1); + free(topics2); +} + + +TEST(singleproc_10000el, ok) { + letter* letters[10000]; + date_frame start_letters,end_letters; + start_letters.year = 8; + start_letters.month = 11; + start_letters.day = 0; + end_letters.year = 8; + end_letters.month = 12; + end_letters.day = 0; + testing_letters_el(letters,10000); + int numb_start = binary_search(letters, date_in_key(start_letters),10000); + int numb_end = binary_search(letters, date_in_key(end_letters),10000); + str_topics* topics1 = singleprocces_find_topic(letters, numb_start, numb_end, 15); + str_topics* topics2 = (str_topics*) malloc(sizeof(str_topics)); + topics2->number=1; + topics2->topics[0][0]='F'; + EXPECT_EQ(equality_test(topics1,topics2),1); + for (int i = 0;i<10000;++i) { + free(letters[i]); + } + free(topics1); + free(topics2); +} + +TEST(singleproc_100000el, ok) { + letter* letters[100000]; + date_frame start_letters,end_letters; + start_letters.year = 8; + start_letters.month = 11; + start_letters.day = 0; + end_letters.year = 8; + end_letters.month = 12; + end_letters.day = 0; + testing_letters_el(letters,100000); + int numb_start = binary_search(letters, date_in_key(start_letters),100000); + int numb_end = binary_search(letters, date_in_key(end_letters),100000); + str_topics* topics1 = singleprocces_find_topic(letters, numb_start, numb_end, 15); + str_topics* topics2 = (str_topics*) malloc(sizeof(str_topics)); + topics2->number=3; + topics2->topics[0][0]='G'; + topics2->topics[1][0]='A'; + topics2->topics[2][0]='B'; + EXPECT_EQ(equality_test(topics1,topics2),1); + for (int i = 0;i<100000;++i) { + free(letters[i]); + } + free(topics1); + free(topics2); +} + + + + + +TEST(multi_1000el, ok) { + letter* letters[1000]; + date_frame start_letters,end_letters; + start_letters.year = 8; + start_letters.month = 0; + start_letters.day = 0; + end_letters.year = 8; + end_letters.month = 12; + end_letters.day = 0; + testing_letters_el(letters,1000); + int numb_start = binary_search(letters, date_in_key(start_letters),1000); + int numb_end = binary_search(letters, date_in_key(end_letters),1000); + str_topics* topics1 = multiprocess_find_topic(letters, numb_start, numb_end, 15); + str_topics* topics2 = (str_topics*) malloc(sizeof(str_topics)); + topics2->number=2; + topics2->topics[0][0]='D'; + topics2->topics[1][0]='E'; + EXPECT_EQ(equality_test(topics1,topics2),1); + for (int i = 0;i<1000;++i) { + free(letters[i]); + } + munmap(topics1,getpagesize()); + free(topics2); +} + + +TEST(multi_10000el, ok) { + letter* letters[10000]; + date_frame start_letters,end_letters; + start_letters.year = 8; + start_letters.month = 11; + start_letters.day = 0; + end_letters.year = 8; + end_letters.month = 12; + end_letters.day = 0; + testing_letters_el(letters,10000); + int numb_start = binary_search(letters, date_in_key(start_letters),10000); + int numb_end = binary_search(letters, date_in_key(end_letters),10000); + str_topics* topics1 = multiprocess_find_topic(letters, numb_start, numb_end, 15); + str_topics* topics2 = (str_topics*) malloc(sizeof(str_topics)); + topics2->number=1; + topics2->topics[0][0]='F'; + EXPECT_EQ(equality_test(topics1,topics2),1); + for (int i = 0;i<10000;++i) { + free(letters[i]); + } + munmap(topics1,getpagesize()); + free(topics2); +} + +TEST(multi_100000el, ok) { + letter* letters[100000]; + date_frame start_letters,end_letters; + start_letters.year = 8; + start_letters.month = 11; + start_letters.day = 0; + end_letters.year = 8; + end_letters.month = 12; + end_letters.day = 0; + testing_letters_el(letters,100000); + int numb_start = binary_search(letters, date_in_key(start_letters),100000); + int numb_end = binary_search(letters, date_in_key(end_letters),100000); + str_topics* topics1 = multiprocess_find_topic(letters, numb_start, numb_end, 15); + str_topics* topics2 = (str_topics*) malloc(sizeof(str_topics)); + topics2->number=3; + topics2->topics[0][0]='G'; + topics2->topics[1][0]='G'; + topics2->topics[2][0]='B'; + EXPECT_EQ(equality_test(topics1,topics2),0); + for (int i = 0;i<100000;++i) { + free(letters[i]); + } + munmap(topics1,getpagesize()); + free(topics2); +} + + +TEST(singleprocces_find_topic_null, not_ok) { + letter** letters = NULL; + int condition = (singleprocces_find_topic(letters,1,1000,17) == NULL); + ASSERT_TRUE(condition); +} + +TEST(multi_find_topic_null, not_ok) { + letter** letters = NULL; + int condition = (multiprocess_find_topic(letters,1,1000,17) == NULL); + ASSERT_TRUE(condition); +} + +int main(int argc, char **argv) { + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} + +