Skip to content

Commit e90aeed

Browse files
author
Gonzalo Diaz
committed
Test coverage increased due new malloc() interceptor.
1 parent cfd011c commit e90aeed

5 files changed

Lines changed: 221 additions & 104 deletions

File tree

Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include <catch2/catch_test_macros.hpp>
22

3+
#include "../../../../tools/memory_injector.hpp"
34
#include <exercises/hackerrank/warmup/compare_triplets.h>
4-
#include <iostream>
55
#include <vector>
66

77
#include <filesystem>
@@ -11,34 +11,58 @@ using json = nlohmann::json;
1111

1212
TEST_CASE("compareTriplets JSON Test Cases",
1313
"[hackerrank] [jsontestcase] [warmup]") {
14-
std::filesystem::path cwd = std::filesystem::current_path();
15-
std::string path =
16-
cwd.string() +
17-
"/unit/lib/hackerrank/warmup/compare_triplets.testcases.json";
14+
#ifdef __linux__
15+
SECTION("compareTriplets: Failure handling during Out of Memory (OOM)") {
16+
MemoryInjector::enable_oom_fault();
1817

19-
INFO("compareTriplets JSON test cases FILE: " << path);
20-
21-
std::ifstream f(path);
22-
json data = json::parse(f);
23-
24-
for (auto testcase : data) {
25-
auto a_size = static_cast<int>(testcase["a"].size());
26-
std::vector<int> a_input_vector = testcase["a"];
18+
std::vector<int> a_input_vector = {1, 2, 3, 4};
19+
auto a_size = static_cast<int>(a_input_vector.size());
2720
const int *a_input_array = a_input_vector.data();
2821

29-
auto b_size = static_cast<int>(testcase["b"].size());
30-
std::vector<int> b_input_vector = testcase["b"];
22+
std::vector<int> b_input_vector = {4, 3, 2, 1};
23+
auto b_size = static_cast<int>(b_input_vector.size());
3124
const int *b_input_array = b_input_vector.data();
3225
int result_count;
3326

34-
int *result = HACKERRANK_WARMUP_compareTriplets(
35-
a_size, a_input_array, b_size, b_input_array, &result_count);
27+
REQUIRE(HACKERRANK_WARMUP_compareTriplets(a_size, a_input_array, b_size,
28+
b_input_array,
29+
&result_count) == nullptr);
30+
31+
// Clean up the state after finishing the test section
32+
MemoryInjector::disable_fault();
33+
}
34+
#endif
35+
36+
SECTION("compareTriplets: Normal memory allocation succeeds") {
37+
std::filesystem::path cwd = std::filesystem::current_path();
38+
std::string path =
39+
cwd.string() +
40+
"/unit/lib/hackerrank/warmup/compare_triplets.testcases.json";
41+
42+
INFO("compareTriplets JSON test cases FILE: " << path);
43+
44+
std::ifstream f(path);
45+
json data = json::parse(f);
46+
47+
for (auto testcase : data) {
48+
auto a_size = static_cast<int>(testcase["a"].size());
49+
std::vector<int> a_input_vector = testcase["a"];
50+
const int *a_input_array = a_input_vector.data();
51+
52+
auto b_size = static_cast<int>(testcase["b"].size());
53+
std::vector<int> b_input_vector = testcase["b"];
54+
const int *b_input_array = b_input_vector.data();
55+
int result_count;
56+
57+
int *result = HACKERRANK_WARMUP_compareTriplets(
58+
a_size, a_input_array, b_size, b_input_array, &result_count);
3659

37-
// Crear un vector a partir del array en C
38-
std::vector<int> result_as_vector(result, result + result_count);
60+
// Crear un vector a partir del array en C
61+
std::vector<int> result_as_vector(result, result + result_count);
3962

40-
CHECK(result_as_vector == testcase["expected"]);
63+
CHECK(result_as_vector == testcase["expected"]);
4164

42-
free(result);
65+
free(result);
66+
}
4367
}
4468
}
Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
#include <catch2/catch_test_macros.hpp>
22

3+
#include "../../../../tools/memory_injector.hpp"
34
#include <exercises/hackerrank/warmup/mini_max_sum.h>
4-
#include <iostream>
5-
#include <stdexcept>
65
#include <string>
76
#include <vector>
87

@@ -16,36 +15,53 @@ using json = nlohmann::json;
1615

1716
TEST_CASE("miniMaxSum JSON Test Cases",
1817
"[hackerrank] [jsontestcase] [warmup]") {
19-
std::filesystem::path cwd = std::filesystem::current_path();
20-
std::string path =
21-
cwd.string() + "/unit/lib/hackerrank/warmup/mini_max_sum.testcases.json";
18+
#ifdef __linux__
19+
SECTION("miniMaxSum: Failure handling during Out of Memory (OOM)") {
20+
MemoryInjector::enable_oom_fault();
2221

23-
INFO("miniMaxSum JSON test cases FILE: " << path);
22+
int input_size = 3;
23+
int input_array[] = {1, -2, 0};
2424

25-
std::ifstream f(path);
26-
json data = json::parse(f);
25+
HACKERRANK_WARMUP_miniMaxSum(input_size, input_array);
2726

28-
for (auto testcase : data) {
29-
auto input_size = static_cast<int>(testcase["input"].size());
30-
std::vector<int> input_vector = testcase["input"];
31-
const int *input_array = input_vector.data();
27+
// Clean up the state after finishing the test section
28+
MemoryInjector::disable_fault();
29+
}
30+
#endif
3231

33-
char *result =
34-
HACKERRANK_WARMUP_miniMaxSumCalculate(input_size, input_array);
35-
HACKERRANK_WARMUP_miniMaxSum(input_size, input_array);
32+
SECTION("miniMaxSum: Normal memory allocation succeeds") {
33+
std::filesystem::path cwd = std::filesystem::current_path();
34+
std::string path =
35+
cwd.string() +
36+
"/unit/lib/hackerrank/warmup/mini_max_sum.testcases.json";
37+
38+
INFO("miniMaxSum JSON test cases FILE: " << path);
39+
40+
std::ifstream f(path);
41+
json data = json::parse(f);
3642

37-
std::string result_as_string(result);
43+
for (auto testcase : data) {
44+
auto input_size = static_cast<int>(testcase["input"].size());
45+
std::vector<int> input_vector = testcase["input"];
46+
const int *input_array = input_vector.data();
3847

39-
free(result);
48+
char *result =
49+
HACKERRANK_WARMUP_miniMaxSumCalculate(input_size, input_array);
50+
HACKERRANK_WARMUP_miniMaxSum(input_size, input_array);
4051

41-
CHECK(result_as_string == testcase["expected"]);
52+
std::string result_as_string(result);
53+
54+
free(result);
55+
56+
CHECK(result_as_string == testcase["expected"]);
57+
}
4258
}
43-
}
4459

45-
TEST_CASE("miniMaxSum Edge Cases", "[hackerrank] [warmup]") {
46-
std::vector<int> empty({});
60+
SECTION("miniMaxSum Edge Cases", "[hackerrank] [warmup]") {
61+
std::vector<int> empty({});
4762

48-
const char *result = HACKERRANK_WARMUP_miniMaxSumCalculate(0, empty.data());
63+
const char *result = HACKERRANK_WARMUP_miniMaxSumCalculate(0, empty.data());
4964

50-
CHECK(result == nullptr);
65+
CHECK(result == nullptr);
66+
}
5167
}
Lines changed: 56 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#include <catch2/catch_test_macros.hpp>
22

3+
#include "../../../../tools/memory_injector.hpp"
34
#include <exercises/hackerrank/warmup/plus_minus.h>
4-
#include <iostream>
5-
#include <stdexcept>
5+
66
#include <vector>
77

88
#include <filesystem>
@@ -11,34 +11,67 @@
1111
using json = nlohmann::json;
1212

1313
TEST_CASE("plusMinus JSON Test Cases", "[hackerrank] [jsontestcase] [warmup]") {
14-
std::filesystem::path cwd = std::filesystem::current_path();
15-
std::string path =
16-
cwd.string() + "/unit/lib/hackerrank/warmup/plus_minus.testcases.json";
14+
#ifdef __linux__
15+
SECTION("Failure handling during Out of Memory (OOM)") {
16+
// MemoryInjector::enable_oom_fault();
1717

18-
INFO("plusMinus JSON test cases FILE: " << path);
18+
int input_size = 3;
19+
int input_array[] = {1, -2, 0};
1920

20-
std::ifstream f(path);
21-
json data = json::parse(f);
21+
MemoryInjector::fail_on_allocation_number(1);
22+
REQUIRE(HACKERRANK_WARMUP_plusMinusCalculate(input_size, input_array) ==
23+
nullptr);
2224

23-
for (auto testcase : data) {
24-
auto input_size = static_cast<int>(testcase["input"].size());
25-
std::vector<int> input_vector = testcase["input"];
26-
const int *input_array = input_vector.data();
25+
MemoryInjector::fail_on_allocation_number(2);
26+
REQUIRE(HACKERRANK_WARMUP_plusMinusCalculate(input_size, input_array) ==
27+
nullptr);
2728

28-
char **result =
29-
HACKERRANK_WARMUP_plusMinusCalculate(input_size, input_array);
29+
MemoryInjector::fail_on_allocation_number(3);
30+
REQUIRE(HACKERRANK_WARMUP_plusMinusCalculate(input_size, input_array) ==
31+
nullptr);
3032

31-
std::vector<std::string> result_as_vector;
33+
MemoryInjector::disable_fault();
34+
MemoryInjector::enable_oom_fault();
35+
REQUIRE_NOTHROW(HACKERRANK_WARMUP_plusMinus(input_size, input_array));
3236

33-
for (int i = 0; i < HACKERRANK_WARMUP_PLUSMINUS_LIMIT_ANSWERS; i++) {
34-
result_as_vector.emplace_back(result[i]);
35-
}
36-
HACKERRANK_WARMUP_freePlusMinus(result,
37-
HACKERRANK_WARMUP_PLUSMINUS_LIMIT_ANSWERS);
37+
// Clean up the state after finishing the test section
38+
MemoryInjector::disable_fault();
39+
}
40+
#endif
41+
42+
SECTION("Normal memory allocation succeeds") {
43+
// Reset the injector state before every section running
44+
// MemoryInjector::disable_fault();
45+
46+
std::filesystem::path cwd = std::filesystem::current_path();
47+
std::string path =
48+
cwd.string() + "/unit/lib/hackerrank/warmup/plus_minus.testcases.json";
49+
50+
INFO("plusMinus JSON test cases FILE: " << path);
3851

39-
CHECK(result_as_vector == testcase["expected"]);
52+
std::ifstream f(path);
53+
json data = json::parse(f);
4054

41-
// Just call void function, to collect coverage
42-
HACKERRANK_WARMUP_plusMinus(input_size, input_array);
55+
for (auto testcase : data) {
56+
auto input_size = static_cast<int>(testcase["input"].size());
57+
std::vector<int> input_vector = testcase["input"];
58+
const int *input_array = input_vector.data();
59+
60+
char **result =
61+
HACKERRANK_WARMUP_plusMinusCalculate(input_size, input_array);
62+
63+
std::vector<std::string> result_as_vector;
64+
65+
for (int i = 0; i < HACKERRANK_WARMUP_PLUSMINUS_LIMIT_ANSWERS; i++) {
66+
result_as_vector.emplace_back(result[i]);
67+
}
68+
HACKERRANK_WARMUP_freePlusMinus(
69+
result, HACKERRANK_WARMUP_PLUSMINUS_LIMIT_ANSWERS);
70+
71+
CHECK(result_as_vector == testcase["expected"]);
72+
73+
// Just call void function, to collect coverage
74+
HACKERRANK_WARMUP_plusMinus(input_size, input_array);
75+
}
4376
}
4477
}
Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,68 @@
1+
// 3rd party libs
12
#include <catch2/catch_test_macros.hpp>
23

4+
#include <nlohmann/json.hpp>
5+
6+
// local libs
7+
#if defined(__linux__)
8+
#include "../../../../tools/memory_injector.hpp"
9+
#endif
310
#include <exercises/hackerrank/warmup/staircase.h>
11+
12+
// std libs
413
#include <filesystem>
514
#include <fstream>
615
#include <nlohmann/json.hpp>
716
#include <vector>
817

918
using json = nlohmann::json;
1019

11-
TEST_CASE("staircase", "[warmup]") {
12-
std::filesystem::path cwd = std::filesystem::current_path();
13-
std::string path =
14-
cwd.string() + "/unit/lib/hackerrank/warmup/staircase.testcases.json";
20+
TEST_CASE("staircase JSON Test Cases", "[hackerrank] [jsontestcase] [warmup]") {
21+
#if defined(__linux__)
22+
SECTION("staircase: Failure handling during Out of Memory (OOM)") {
23+
int input = 4;
1524

16-
INFO("staircase JSON test cases FILE: " << path);
25+
MemoryInjector::enable_oom_fault();
26+
REQUIRE(HACKERRANK_WARMUP_staircaseCalculate(input) == nullptr);
27+
MemoryInjector::disable_fault();
1728

18-
std::ifstream f(path);
19-
json data = json::parse(f);
29+
MemoryInjector::fail_on_allocation_number(2);
30+
REQUIRE(HACKERRANK_WARMUP_staircaseCalculate(input) == nullptr);
31+
MemoryInjector::disable_fault();
2032

21-
for (auto testcase : data) {
22-
auto input = static_cast<int>(testcase["input"]);
33+
MemoryInjector::enable_oom_fault();
34+
REQUIRE_NOTHROW(HACKERRANK_WARMUP_staircase(input));
35+
MemoryInjector::disable_fault();
36+
}
37+
#endif
2338

24-
char **result = HACKERRANK_WARMUP_staircaseCalculate(input);
39+
SECTION("plusMinus: Normal memory allocation succeeds") {
40+
std::filesystem::path cwd = std::filesystem::current_path();
41+
std::string path =
42+
cwd.string() + "/unit/lib/hackerrank/warmup/staircase.testcases.json";
2543

26-
std::vector<std::string> result_as_vector;
44+
INFO("staircase JSON test cases FILE: " << path);
2745

28-
for (int i = 0; i < input; i++) {
29-
result_as_vector.emplace_back(result[i]);
30-
}
46+
std::ifstream f(path);
47+
json data = json::parse(f);
3148

32-
HACKERRANK_WARMUP_freeStaircase(result, input);
49+
for (auto testcase : data) {
50+
auto input = static_cast<int>(testcase["input"]);
3351

34-
CHECK(result_as_vector == testcase["expected"]);
52+
char **result = HACKERRANK_WARMUP_staircaseCalculate(input);
3553

36-
// Just call void function, to collect coverage
37-
HACKERRANK_WARMUP_staircase(input);
54+
std::vector<std::string> result_as_vector;
55+
56+
for (int i = 0; i < input; i++) {
57+
result_as_vector.emplace_back(result[i]);
58+
}
59+
60+
HACKERRANK_WARMUP_freeStaircase(result, input);
61+
62+
CHECK(result_as_vector == testcase["expected"]);
63+
64+
// Just call void function, to collect coverage
65+
HACKERRANK_WARMUP_staircase(input);
66+
}
3867
}
3968
}

0 commit comments

Comments
 (0)