Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Feature/tests #108

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ dsm
dsm_discover
dsm_lookup
dsm_inverse
all_tests
configure
.*/
build*/
Expand Down
14 changes: 14 additions & 0 deletions Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,20 @@ dsm_inverse_SOURCES = bin/inverse.c

dsm_lookup_SOURCES = bin/lookup.c

if TESTS
bin_PROGRAMS += all_tests
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the test scenario you're aiming for something like

  • ../configure --enable-tests
  • make
  • ./tests

Or is make check considered?

To be honest I don't have a strong opinion on wether make check should be used when it's not actually running the tests, but this means writing a test harness for cmocka IIUC


all_tests_SOURCES = $(libdsm_la_SOURCES) \
tests/all_tests.c \
tests/test_hmac.c \
tests/test_smb_utils.c \
tests/test_smb_buffer.c \
tests/test_netbios_name_encode.c

all_tests_CFLAGS = @CMOCKA_CFLAGS@
all_tests_LDADD = @CMOCKA_LIBS@ libcompat.la $(TASN1_LIBS) @LTLIBICONV@
endif

LDADD = libdsm.la

clean-local:
Expand Down
25 changes: 19 additions & 6 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,13 @@ AC_ARG_ENABLE([debug],
AS_HELP_STRING([--enable-debug], [Additional debugging features [default=no]])
)

AC_ARG_ENABLE([tests],
AS_HELP_STRING([--enable-tests], [Build unit tests [default=no]])
)

AM_CONDITIONAL([DEBUG], [test x"$enable_debug" == x"yes"])
AM_CONDITIONAL([PROGRAMS], [test x"$enable_programs" != x"no"])
AM_CONDITIONAL([TESTS], [test x"$enable_tests" != x"no"])
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doesn't this imply default=yes ?


LT_INIT

Expand All @@ -55,10 +60,18 @@ AC_CONFIG_MACRO_DIR([m4])

dnl Check for pthreads
AX_PTHREAD(,[
AC_CHECK_LIB(pthreadGC2,pthread_join,[
AC_SUBST(PTHREAD_LIBS,"-lpthreadGC2")
AC_SUBST(PTHREAD_CFLAGS,"-DPTW32_STATIC_LIB"])
])
AC_CHECK_LIB(pthreadGC2,pthread_join,[
AC_SUBST(PTHREAD_LIBS,"-lpthreadGC2")
AC_SUBST(PTHREAD_CFLAGS,"-DPTW32_STATIC_LIB"])
])
])

##############################
## Checks for cmocka test framework
AS_IF([test x"$enable_tests" = x"yes"], [
PKG_CHECK_MODULES([CMOCKA], [cmocka])
AC_SUBST([CMOCKA_CFLAGS])
AC_SUBST([CMOCKA_LIBS])
])

##############################
Expand Down Expand Up @@ -110,8 +123,8 @@ AC_CHECK_FUNCS([pipe _pipe getifaddrs])
AC_CHECK_HEADERS([bsd/string.h langinfo.h alloca.h sys/queue.h arpa/inet.h sys/socket.h ifaddrs.h])

## Configure random device path
AC_ARG_WITH([urandom],
[AS_HELP_STRING([--with-urandom=PATH],
AC_ARG_WITH([urandom],
[AS_HELP_STRING([--with-urandom=PATH],
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitpicking, but unrelated

[Configure the path of the random generation device used @<:@default=/dev/urandom@:>@ ])],
[], [with_urandom=/dev/urandom])
AC_DEFINE_UNQUOTED([URANDOM], ["$with_urandom"], [Path of the random number generation device])
Expand Down
34 changes: 34 additions & 0 deletions src/netbios_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,47 @@

#include "netbios_defs.h"

/**
* @internal
* @brief Encode the machine name part of a netbios name
*
* @param name The string to encode. Only the first 15 chars are used
* @param encoded_name This string will be filled with the encoded name. Must
* be 33 bytes long
* @param type In netbios, the name encodes the service type,
* like NETBIOS_FILESERVER
*/
void netbios_name_level1_encode(const char *name, char *encoded_name,
unsigned type);
/**
* @internal
* @brief Decode the machine part of a netbios name
*/
void netbios_name_level1_decode(const char *encoded_name, char *name);

// XXX: domain support is not implemented

/**
* @internal
* @brief Encode a netbios machine name.
*
* @param name The name of the machine. Only the first 15 bytes are used
* @param domain Not implemented yet
* @param type The type of service we're talking to. Like NETBIOS_FILESERVER or
* NETBIOS_WORKSTATION
*/
char *netbios_name_encode(const char *name, char *domain,
unsigned type);

/**
* @internal
* @brief Decode a netbios machine name.
*
* @param encoded_name The encoded name
* @param name A 16 bytes long string (including null byte). Will be filled
* with the decoded name
* @param domain Not Implemented yet
*/
int netbios_name_decode(const char *encoded_name,
char *name, char **domain);

Expand Down
8 changes: 7 additions & 1 deletion src/smb_buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,20 @@ typedef struct
} smb_buffer;

/**
* @brief Initialize a buffer structure. It'll contain nothing
* @brief Initialize a buffer structure with the provided data
*
* @param buf Pointer to a buffer to initialize
* @param data Pointer to a memory area to be assigned to the buffer. It'll be
* freed if you call smb_buffer_free
@ @param size Size in bytes of the memory pointed by data
*/
void smb_buffer_init(smb_buffer *buf, void *data, size_t size);

/**
* @brief Allocate a size long memory area and place it in the buffer structure
*
* @param buf Pointer to a buffer to initialize
* @param size Size in bytes of the memory area to allocate for this buffer.
*/
int smb_buffer_alloc(smb_buffer *buf, size_t size);

Expand Down
18 changes: 18 additions & 0 deletions tests/all_tests.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#include <stdarg.h>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitpick: Missing license header

#include <stddef.h>
#include <setjmp.h>
#include <cmocka.h>

#include "tests.h"

int main(void) {
const struct CMUnitTest tests[] = {
cmocka_unit_test(test_hmac_md5),
cmocka_unit_test(test_smb_utf16),
cmocka_unit_test(test_smb_buffer_init),
cmocka_unit_test(test_smb_buffer_alloc),
cmocka_unit_test(test_nb_encode),
};

return cmocka_run_group_tests(tests, NULL, NULL);
}
61 changes: 61 additions & 0 deletions tests/test_hmac.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*****************************************************************************
* __________________ _________ _____ _____ .__ ._.
* \______ \______ \ / _____/ / \ / _ \ |__| ____ | |
* | | _/| | \ \_____ \ / \ / \ / /_\ \| _/ __ \ | |
* | | \| ` \/ / Y \ / | | \ ___/ \|
* |______ /_______ /_______ \____|__ / /\ \____|__ |__|\___ | __
* \/ \/ \/ \/ )/ \/ \/ \/
*
* This file is part of liBDSM. Copyright © 2014-2017 VideoLabs SAS
*
* Author: Julien 'Lta' BALLET <[email protected]>
*
* liBDSM is released under LGPLv2.1 (or later) and is also available
* under a commercial license.
*****************************************************************************
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/

#include <string.h>

#include "tests.h"

#include "src/hmac_md5.h"
#include "src/smb_ntlm.h"

void test_hmac_md5(void **s)
{
(void)s;

const char key1[] = "12345678";
const char key2[] = "aaaabbbb";
const char msg1[] = "'Wut wut' is first message :)";
const char msg2[] = "A second awesome message !";
smb_ntlmh hash1, hash2;

// Hashing the same things should give the same result
HMAC_MD5(key1, strlen(key1), msg1, strlen(msg1), hash1);
HMAC_MD5(key1, strlen(key1), msg1, strlen(msg1), hash2);
assert_memory_equal(hash1, hash2, sizeof(hash1));

// Hashing different stuff gives different results
HMAC_MD5(key2, strlen(key2), msg2, strlen(msg2), hash2);
assert_memory_not_equal(hash1, hash2, sizeof(hash1));

// Test against a precomputed hmac
smb_ntlmh expected_hash1 = { 0xc7, 0x30, 0x7e, 0x75, 0x1b, 0x42, 0xb9, 0x37,
0xc8, 0x01, 0x22, 0xe2, 0x09, 0xda, 0x75, 0x0a };
assert_memory_equal(hash1, expected_hash1, sizeof(hash1));
}
59 changes: 59 additions & 0 deletions tests/test_netbios_name_encode.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*****************************************************************************
* __________________ _________ _____ _____ .__ ._.
* \______ \______ \ / _____/ / \ / _ \ |__| ____ | |
* | | _/| | \ \_____ \ / \ / \ / /_\ \| _/ __ \ | |
* | | \| ` \/ / Y \ / | | \ ___/ \|
* |______ /_______ /_______ \____|__ / /\ \____|__ |__|\___ | __
* \/ \/ \/ \/ )/ \/ \/ \/
*
* This file is part of liBDSM. Copyright © 2014-2017 VideoLabs SAS
*
* Author: Julien 'Lta' BALLET <[email protected]>
*
* liBDSM is released under LGPLv2.1 (or later) and is also available
* under a commercial license.
*****************************************************************************
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/

#include <string.h>
#include <stdlib.h>

#include "tests.h"

#include "src/netbios_utils.h"

void test_nb_encode(void **s)
{
(void) s; // Unused

const char *name1 = "Lta's Mainframe";
const char *name1_encoded = "EMFEEBCHFDCAENEBEJEOEGFCEBENEFCA";
const char *name1_decoded = "LTA'S MAINFRAME";
const char *name2 = "abcdefghijklmnopqrstuvwxyz";
const char *name2_decoded = "ABCDEFGHIJKLMNO";
char encoded[33], decoded[16];

// Simple
netbios_name_level1_encode(name1, (char *)encoded, NETBIOS_FILESERVER);
assert_string_equal(name1_encoded, encoded);
netbios_name_level1_decode((char *)encoded, (char *)decoded);
assert_string_equal(name1_decoded, decoded);

// Truncating at 15 chars
netbios_name_level1_encode(name2, (char *)encoded, NETBIOS_FILESERVER);
netbios_name_level1_decode((char *)encoded, (char *)decoded);
assert_string_equal(name2_decoded, decoded);
}
71 changes: 71 additions & 0 deletions tests/test_smb_buffer.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*****************************************************************************
* __________________ _________ _____ _____ .__ ._.
* \______ \______ \ / _____/ / \ / _ \ |__| ____ | |
* | | _/| | \ \_____ \ / \ / \ / /_\ \| _/ __ \ | |
* | | \| ` \/ / Y \ / | | \ ___/ \|
* |______ /_______ /_______ \____|__ / /\ \____|__ |__|\___ | __
* \/ \/ \/ \/ )/ \/ \/ \/
*
* This file is part of liBDSM. Copyright © 2014-2017 VideoLabs SAS
*
* Author: Julien 'Lta' BALLET <[email protected]>
*
* liBDSM is released under LGPLv2.1 (or later) and is also available
* under a commercial license.
*****************************************************************************
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/

#include <string.h>
#include <stdlib.h>

#include "tests.h"

#include "src/smb_buffer.h"

void test_smb_buffer_init(void **s)
{
(void) s; // Unused

void *data;
smb_buffer buf;

data = malloc(42);
smb_buffer_init(&buf, data, 42);
assert_ptr_equal(buf.data, data);
assert_true(buf.size == 42);

smb_buffer_free(&buf);
assert_null(buf.data);
assert_true(buf.size == 0);
}

void test_smb_buffer_alloc(void **s)
{
(void) s; // Unused

smb_buffer buf;

smb_buffer_alloc(&buf, 42);
assert_non_null(buf.data);
assert_true(buf.size == 42);

// Triggers a segfault is alloc is faulty
((char *)buf.data)[0] + 42;

smb_buffer_free(&buf);
assert_null(buf.data);
assert_true(buf.size == 0);
}
Loading