labfy-investigation/tests/test_evidence_record.c
2026-07-18 19:18:51 +02:00

1098 lines
22 KiB
C

/******************************************************************************
* @file test_evidence_record.c
* @brief Tests du modèle EvidenceRecord.
******************************************************************************/
#include "models/evidence_record.h"
#include <glib.h>
#define TEST_EVIDENCE_IDENTIFIER \
"6e62b9af-2046-4efd-b3b9-29869f816951"
#define TEST_EVIDENCE_SHA256_LOWER \
"0123456789abcdef" \
"0123456789abcdef" \
"0123456789abcdef" \
"0123456789abcdef"
#define TEST_EVIDENCE_SHA256_UPPER \
"0123456789ABCDEF" \
"0123456789ABCDEF" \
"0123456789ABCDEF" \
"0123456789ABCDEF"
typedef struct
{
const char *identifier;
const char *original_name;
const char *internal_name;
const char *relative_path;
const char *type_identifier;
guint64 size_bytes;
const char *sha256;
const char *imported_at;
const char *collected_at;
const char *source;
const char *description;
EvidenceIntegrityStatus integrity_status;
} TestEvidenceRecordInput;
static TestEvidenceRecordInput test_evidence_record_valid_input(void)
{
return (TestEvidenceRecordInput)
{
.identifier = TEST_EVIDENCE_IDENTIFIER,
.original_name = "capture_originale.png",
.internal_name = "preuve_001.png",
.relative_path =
"01_Preuves_Originales/Captures_Ecran/preuve_001.png",
.type_identifier = "image",
.size_bytes = 4096,
.sha256 = TEST_EVIDENCE_SHA256_LOWER,
.imported_at = "2026-07-18T14:30:00Z",
.collected_at = "2026-07-17T20:15:30Z",
.source = "Conversation Instagram",
.description = "Capture originale reçue par la victime.",
.integrity_status = EVIDENCE_INTEGRITY_STATUS_VALID
};
}
static EvidenceRecord *test_evidence_record_create(
const TestEvidenceRecordInput *input,
GError **error
)
{
g_assert_nonnull(
input
);
return evidence_record_new(
input->identifier,
input->original_name,
input->internal_name,
input->relative_path,
input->type_identifier,
input->size_bytes,
input->sha256,
input->imported_at,
input->collected_at,
input->source,
input->description,
input->integrity_status,
error
);
}
static void test_evidence_record_assert_invalid(
const TestEvidenceRecordInput *input,
EvidenceRecordError expected_error
)
{
EvidenceRecord *evidence_record = NULL;
GError *error = NULL;
evidence_record =
test_evidence_record_create(
input,
&error
);
g_assert_null(
evidence_record
);
g_assert_error(
error,
EVIDENCE_RECORD_ERROR,
(gint) expected_error
);
g_assert_nonnull(
error->message
);
g_assert_cmpstr(
error->message,
!=,
""
);
g_clear_error(
&error
);
}
static void test_evidence_record_valid_full(void)
{
TestEvidenceRecordInput input =
test_evidence_record_valid_input();
EvidenceRecord *evidence_record = NULL;
GError *error = NULL;
evidence_record =
test_evidence_record_create(
&input,
&error
);
g_assert_no_error(
error
);
g_assert_nonnull(
evidence_record
);
g_assert_cmpstr(
evidence_record_get_identifier(
evidence_record
),
==,
TEST_EVIDENCE_IDENTIFIER
);
g_assert_cmpstr(
evidence_record_get_original_name(
evidence_record
),
==,
"capture_originale.png"
);
g_assert_cmpstr(
evidence_record_get_internal_name(
evidence_record
),
==,
"preuve_001.png"
);
g_assert_cmpstr(
evidence_record_get_relative_path(
evidence_record
),
==,
"01_Preuves_Originales/Captures_Ecran/preuve_001.png"
);
g_assert_cmpstr(
evidence_record_get_type_identifier(
evidence_record
),
==,
"image"
);
g_assert_cmpuint(
evidence_record_get_size_bytes(
evidence_record
),
==,
4096
);
g_assert_cmpstr(
evidence_record_get_sha256(
evidence_record
),
==,
TEST_EVIDENCE_SHA256_LOWER
);
g_assert_cmpstr(
evidence_record_get_imported_at(
evidence_record
),
==,
"2026-07-18T14:30:00Z"
);
g_assert_cmpstr(
evidence_record_get_collected_at(
evidence_record
),
==,
"2026-07-17T20:15:30Z"
);
g_assert_cmpstr(
evidence_record_get_source(
evidence_record
),
==,
"Conversation Instagram"
);
g_assert_cmpstr(
evidence_record_get_description(
evidence_record
),
==,
"Capture originale reçue par la victime."
);
g_assert_cmpint(
evidence_record_get_integrity_status(
evidence_record
),
==,
EVIDENCE_INTEGRITY_STATUS_VALID
);
evidence_record_free(
evidence_record
);
}
static void test_evidence_record_valid_optional_null(void)
{
TestEvidenceRecordInput input =
test_evidence_record_valid_input();
EvidenceRecord *evidence_record = NULL;
GError *error = NULL;
input.collected_at = NULL;
input.source = " ";
input.description = "\t";
evidence_record =
test_evidence_record_create(
&input,
&error
);
g_assert_no_error(
error
);
g_assert_nonnull(
evidence_record
);
g_assert_null(
evidence_record_get_collected_at(
evidence_record
)
);
g_assert_null(
evidence_record_get_source(
evidence_record
)
);
g_assert_null(
evidence_record_get_description(
evidence_record
)
);
evidence_record_free(
evidence_record
);
}
static void test_evidence_record_copies_strings(void)
{
char identifier[] =
TEST_EVIDENCE_IDENTIFIER;
char original_name[] =
"capture_originale.png";
char internal_name[] =
"preuve_001.png";
char relative_path[] =
"01_Preuves_Originales/Captures_Ecran/preuve_001.png";
char type_identifier[] =
"image";
char sha256[] =
TEST_EVIDENCE_SHA256_LOWER;
char imported_at[] =
"2026-07-18T14:30:00Z";
char collected_at[] =
"2026-07-17T20:15:30Z";
char source[] =
"Conversation Instagram";
char description[] =
"Capture originale";
TestEvidenceRecordInput input =
{
.identifier = identifier,
.original_name = original_name,
.internal_name = internal_name,
.relative_path = relative_path,
.type_identifier = type_identifier,
.size_bytes = 123,
.sha256 = sha256,
.imported_at = imported_at,
.collected_at = collected_at,
.source = source,
.description = description,
.integrity_status = EVIDENCE_INTEGRITY_STATUS_VALID
};
EvidenceRecord *evidence_record = NULL;
GError *error = NULL;
evidence_record =
test_evidence_record_create(
&input,
&error
);
g_assert_no_error(
error
);
g_assert_nonnull(
evidence_record
);
identifier[0] = 'X';
original_name[0] = 'X';
internal_name[0] = 'X';
relative_path[0] = 'X';
type_identifier[0] = 'X';
sha256[0] = 'f';
imported_at[0] = 'X';
collected_at[0] = 'X';
source[0] = 'X';
description[0] = 'X';
g_assert_cmpstr(
evidence_record_get_identifier(
evidence_record
),
==,
TEST_EVIDENCE_IDENTIFIER
);
g_assert_cmpstr(
evidence_record_get_original_name(
evidence_record
),
==,
"capture_originale.png"
);
g_assert_cmpstr(
evidence_record_get_internal_name(
evidence_record
),
==,
"preuve_001.png"
);
g_assert_cmpstr(
evidence_record_get_relative_path(
evidence_record
),
==,
"01_Preuves_Originales/Captures_Ecran/preuve_001.png"
);
g_assert_cmpstr(
evidence_record_get_type_identifier(
evidence_record
),
==,
"image"
);
g_assert_cmpstr(
evidence_record_get_sha256(
evidence_record
),
==,
TEST_EVIDENCE_SHA256_LOWER
);
g_assert_cmpstr(
evidence_record_get_imported_at(
evidence_record
),
==,
"2026-07-18T14:30:00Z"
);
g_assert_cmpstr(
evidence_record_get_collected_at(
evidence_record
),
==,
"2026-07-17T20:15:30Z"
);
g_assert_cmpstr(
evidence_record_get_source(
evidence_record
),
==,
"Conversation Instagram"
);
g_assert_cmpstr(
evidence_record_get_description(
evidence_record
),
==,
"Capture originale"
);
evidence_record_free(
evidence_record
);
}
static void test_evidence_record_trims_text(void)
{
TestEvidenceRecordInput input =
test_evidence_record_valid_input();
EvidenceRecord *evidence_record = NULL;
GError *error = NULL;
input.identifier =
" 6e62b9af-2046-4efd-b3b9-29869f816951 ";
input.original_name =
" capture.png ";
input.internal_name =
"\tpreuve.png\t";
input.relative_path =
" 01_Preuves_Originales/preuve.png ";
input.type_identifier =
" image ";
input.sha256 =
" 0123456789ABCDEF0123456789ABCDEF"
"0123456789ABCDEF0123456789ABCDEF ";
input.imported_at =
" 2026-07-18T14:30:00Z ";
input.collected_at =
"\t2026-07-17T20:15:30Z\t";
input.source =
" Téléchargement manuel ";
input.description =
" Capture principale ";
evidence_record =
test_evidence_record_create(
&input,
&error
);
g_assert_no_error(
error
);
g_assert_nonnull(
evidence_record
);
g_assert_cmpstr(
evidence_record_get_identifier(
evidence_record
),
==,
TEST_EVIDENCE_IDENTIFIER
);
g_assert_cmpstr(
evidence_record_get_original_name(
evidence_record
),
==,
"capture.png"
);
g_assert_cmpstr(
evidence_record_get_internal_name(
evidence_record
),
==,
"preuve.png"
);
g_assert_cmpstr(
evidence_record_get_relative_path(
evidence_record
),
==,
"01_Preuves_Originales/preuve.png"
);
g_assert_cmpstr(
evidence_record_get_type_identifier(
evidence_record
),
==,
"image"
);
g_assert_cmpstr(
evidence_record_get_sha256(
evidence_record
),
==,
TEST_EVIDENCE_SHA256_LOWER
);
g_assert_cmpstr(
evidence_record_get_source(
evidence_record
),
==,
"Téléchargement manuel"
);
g_assert_cmpstr(
evidence_record_get_description(
evidence_record
),
==,
"Capture principale"
);
evidence_record_free(
evidence_record
);
}
static void test_evidence_record_invalid_uuid(void)
{
TestEvidenceRecordInput input =
test_evidence_record_valid_input();
input.identifier =
"identifiant-invalide";
test_evidence_record_assert_invalid(
&input,
EVIDENCE_RECORD_ERROR_INVALID_IDENTIFIER
);
}
static void test_evidence_record_invalid_original_name(void)
{
TestEvidenceRecordInput input =
test_evidence_record_valid_input();
input.original_name =
"dossier/capture.png";
test_evidence_record_assert_invalid(
&input,
EVIDENCE_RECORD_ERROR_INVALID_NAME
);
}
static void test_evidence_record_invalid_internal_name(void)
{
TestEvidenceRecordInput input =
test_evidence_record_valid_input();
input.internal_name =
"..";
test_evidence_record_assert_invalid(
&input,
EVIDENCE_RECORD_ERROR_INVALID_NAME
);
}
static void test_evidence_record_absolute_path(void)
{
TestEvidenceRecordInput input =
test_evidence_record_valid_input();
input.relative_path =
"/tmp/preuve.png";
test_evidence_record_assert_invalid(
&input,
EVIDENCE_RECORD_ERROR_INVALID_PATH
);
}
static void test_evidence_record_parent_component(void)
{
TestEvidenceRecordInput input =
test_evidence_record_valid_input();
input.relative_path =
"01_Preuves_Originales/../preuve.png";
test_evidence_record_assert_invalid(
&input,
EVIDENCE_RECORD_ERROR_INVALID_PATH
);
}
static void test_evidence_record_relative_path(void)
{
TestEvidenceRecordInput input =
test_evidence_record_valid_input();
EvidenceRecord *evidence_record = NULL;
GError *error = NULL;
input.relative_path =
"01_Preuves_Originales/Documents/preuve.pdf";
evidence_record =
test_evidence_record_create(
&input,
&error
);
g_assert_no_error(
error
);
g_assert_nonnull(
evidence_record
);
g_assert_cmpstr(
evidence_record_get_relative_path(
evidence_record
),
==,
"01_Preuves_Originales/Documents/preuve.pdf"
);
evidence_record_free(
evidence_record
);
}
static void test_evidence_record_empty_type(void)
{
TestEvidenceRecordInput input =
test_evidence_record_valid_input();
input.type_identifier =
" ";
test_evidence_record_assert_invalid(
&input,
EVIDENCE_RECORD_ERROR_INVALID_TYPE
);
}
static void test_evidence_record_short_sha256(void)
{
TestEvidenceRecordInput input =
test_evidence_record_valid_input();
input.sha256 =
"0123456789abcdef";
test_evidence_record_assert_invalid(
&input,
EVIDENCE_RECORD_ERROR_INVALID_SHA256
);
}
static void test_evidence_record_invalid_sha256_character(void)
{
TestEvidenceRecordInput input =
test_evidence_record_valid_input();
char invalid_sha256[] =
TEST_EVIDENCE_SHA256_LOWER;
invalid_sha256[63] = 'g';
input.sha256 =
invalid_sha256;
test_evidence_record_assert_invalid(
&input,
EVIDENCE_RECORD_ERROR_INVALID_SHA256
);
}
static void test_evidence_record_uppercase_sha256(void)
{
TestEvidenceRecordInput input =
test_evidence_record_valid_input();
EvidenceRecord *evidence_record = NULL;
GError *error = NULL;
input.sha256 =
TEST_EVIDENCE_SHA256_UPPER;
evidence_record =
test_evidence_record_create(
&input,
&error
);
g_assert_no_error(
error
);
g_assert_nonnull(
evidence_record
);
g_assert_cmpstr(
evidence_record_get_sha256(
evidence_record
),
==,
TEST_EVIDENCE_SHA256_LOWER
);
evidence_record_free(
evidence_record
);
}
static void test_evidence_record_invalid_imported_at(void)
{
TestEvidenceRecordInput input =
test_evidence_record_valid_input();
input.imported_at =
"2026-07-18 14:30:00Z";
test_evidence_record_assert_invalid(
&input,
EVIDENCE_RECORD_ERROR_INVALID_DATE
);
}
static void test_evidence_record_invalid_collected_at(void)
{
TestEvidenceRecordInput input =
test_evidence_record_valid_input();
input.collected_at =
"2026-02-30T14:30:00Z";
test_evidence_record_assert_invalid(
&input,
EVIDENCE_RECORD_ERROR_INVALID_DATE
);
}
static void test_evidence_record_invalid_status(void)
{
TestEvidenceRecordInput input =
test_evidence_record_valid_input();
input.integrity_status =
(EvidenceIntegrityStatus) 999;
test_evidence_record_assert_invalid(
&input,
EVIDENCE_RECORD_ERROR_INVALID_STATUS
);
}
static void test_evidence_record_zero_size(void)
{
TestEvidenceRecordInput input =
test_evidence_record_valid_input();
EvidenceRecord *evidence_record = NULL;
GError *error = NULL;
input.size_bytes = 0;
evidence_record =
test_evidence_record_create(
&input,
&error
);
g_assert_no_error(
error
);
g_assert_nonnull(
evidence_record
);
g_assert_cmpuint(
evidence_record_get_size_bytes(
evidence_record
),
==,
0
);
evidence_record_free(
evidence_record
);
}
static void test_evidence_record_null_accessors(void)
{
g_assert_null(
evidence_record_get_identifier(
NULL
)
);
g_assert_null(
evidence_record_get_original_name(
NULL
)
);
g_assert_null(
evidence_record_get_internal_name(
NULL
)
);
g_assert_null(
evidence_record_get_relative_path(
NULL
)
);
g_assert_null(
evidence_record_get_type_identifier(
NULL
)
);
g_assert_cmpuint(
evidence_record_get_size_bytes(
NULL
),
==,
0
);
g_assert_null(
evidence_record_get_sha256(
NULL
)
);
g_assert_null(
evidence_record_get_imported_at(
NULL
)
);
g_assert_null(
evidence_record_get_collected_at(
NULL
)
);
g_assert_null(
evidence_record_get_source(
NULL
)
);
g_assert_null(
evidence_record_get_description(
NULL
)
);
g_assert_cmpint(
evidence_record_get_integrity_status(
NULL
),
==,
EVIDENCE_INTEGRITY_STATUS_UNKNOWN
);
}
static void test_evidence_record_free_null(void)
{
evidence_record_free(
NULL
);
}
static void test_evidence_record_optional_error(void)
{
TestEvidenceRecordInput input =
test_evidence_record_valid_input();
EvidenceRecord *evidence_record = NULL;
input.identifier =
"uuid-invalide";
evidence_record =
test_evidence_record_create(
&input,
NULL
);
g_assert_null(
evidence_record
);
input =
test_evidence_record_valid_input();
evidence_record =
test_evidence_record_create(
&input,
NULL
);
g_assert_nonnull(
evidence_record
);
evidence_record_free(
evidence_record
);
}
int main(
int argc,
char **argv
)
{
g_test_init(
&argc,
&argv,
NULL
);
g_test_add_func(
"/evidence_record/valid_full",
test_evidence_record_valid_full
);
g_test_add_func(
"/evidence_record/valid_optional_null",
test_evidence_record_valid_optional_null
);
g_test_add_func(
"/evidence_record/copies_strings",
test_evidence_record_copies_strings
);
g_test_add_func(
"/evidence_record/trims_text",
test_evidence_record_trims_text
);
g_test_add_func(
"/evidence_record/invalid_uuid",
test_evidence_record_invalid_uuid
);
g_test_add_func(
"/evidence_record/invalid_original_name",
test_evidence_record_invalid_original_name
);
g_test_add_func(
"/evidence_record/invalid_internal_name",
test_evidence_record_invalid_internal_name
);
g_test_add_func(
"/evidence_record/absolute_path",
test_evidence_record_absolute_path
);
g_test_add_func(
"/evidence_record/parent_component",
test_evidence_record_parent_component
);
g_test_add_func(
"/evidence_record/relative_path",
test_evidence_record_relative_path
);
g_test_add_func(
"/evidence_record/empty_type",
test_evidence_record_empty_type
);
g_test_add_func(
"/evidence_record/short_sha256",
test_evidence_record_short_sha256
);
g_test_add_func(
"/evidence_record/invalid_sha256_character",
test_evidence_record_invalid_sha256_character
);
g_test_add_func(
"/evidence_record/uppercase_sha256",
test_evidence_record_uppercase_sha256
);
g_test_add_func(
"/evidence_record/invalid_imported_at",
test_evidence_record_invalid_imported_at
);
g_test_add_func(
"/evidence_record/invalid_collected_at",
test_evidence_record_invalid_collected_at
);
g_test_add_func(
"/evidence_record/invalid_status",
test_evidence_record_invalid_status
);
g_test_add_func(
"/evidence_record/zero_size",
test_evidence_record_zero_size
);
g_test_add_func(
"/evidence_record/null_accessors",
test_evidence_record_null_accessors
);
g_test_add_func(
"/evidence_record/free_null",
test_evidence_record_free_null
);
g_test_add_func(
"/evidence_record/optional_error",
test_evidence_record_optional_error
);
return g_test_run();
}