48e27400d23e2586530cf943524e50c74d79a915Tony Bamford/**
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford * The contents of this file are subject to the terms of the Common Development and
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford * Distribution License (the License). You may not use this file except in compliance with the
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford * License.
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford *
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford * specific language governing permission and limitations under the License.
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford *
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford * When distributing Covered Software, include this CDDL Header Notice in each file and include
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford * Header, with the fields enclosed by brackets [] replaced by your own identifying
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford * information: "Portions copyright [year] [name of copyright owner]".
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford *
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford * Copyright 2015 ForgeRock AS.
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford */
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford#include <stdio.h>
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford#include <string.h>
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford#include <stdlib.h>
4c6011bfcf29cd75d6af86f192d709221f4d5d3aMareks Malnacs#include <setjmp.h>
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford
49a10b9b220f316a19b54ef6885f87936f30791cMareks Malnacs#include "platform.h"
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford#include "am.h"
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford#include "log.h"
4c6011bfcf29cd75d6af86f192d709221f4d5d3aMareks Malnacs#include "cmocka.h"
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford
8a4b0b791bf38ef8389a6501a586d8ab554e3711Mareks Malnacsvoid am_worker_pool_init_reset();
8a4b0b791bf38ef8389a6501a586d8ab554e3711Mareks Malnacsvoid am_net_init_ssl_reset();
8a4b0b791bf38ef8389a6501a586d8ab554e3711Mareks Malnacs
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford/**
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford * This is the simplest of tests to check we can log things without crashing.
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford *
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford * In fact, because of the way logging works (differently) in test mode than it does in "agent mode"
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford * all we're really doing here is to test that logging in test mode isn't broken. This may or may not
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford * bear any relation to whether logging works for the rest of the time.
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford */
ace14c3b6b92e98e9ad8eec3201084c808f42d92Tony Bamfordvoid test_logging_in_unit_test_mode(void** state) {
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford static const char* text1 = "Now is the winter of our discontent,";
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford static const char* text2 = "Made glorious summer by this son of York";
4c6011bfcf29cd75d6af86f192d709221f4d5d3aMareks Malnacs
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford AM_LOG_INFO(0, "instance id is zero and no args");
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford AM_LOG_INFO(0, "instance id is zero and incorrect args", text1);
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford AM_LOG_INFO(0, "instance id is zero and more incorrect args", text1, text2);
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford /* we're testing this will not crash */
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford AM_LOG_INFO(0, NULL, text1, text2);
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford /* this will not appear, since the instance is greater than zero, but it should not crash either */
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford AM_LOG_ERROR(10, "%s %s", text1, text2);
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford AM_LOG_INFO(0, "%s %s", text1, text2);
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford AM_LOG_WARNING(0, "%s %s", text1, text2);
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford AM_LOG_ERROR(0, "%s %s", text1, text2);
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford AM_LOG_DEBUG(0, "%s %s", text1, text2);
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford AM_LOG_AUDIT(0, "%s %s", text1, text2);
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford AM_LOG_ALWAYS(0, "%s %s", text1, text2);
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford AM_LOG_ALWAYS(0, "Now %s the %s of our %s, %s summ%s of York",
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford "is",
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford "winter",
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford "discontent",
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford "Made glorious",
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford "er by this son");
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford
ace14c3b6b92e98e9ad8eec3201084c808f42d92Tony Bamford /* attempt to overflow the buffer, although this will be ultimately unsuccessful because the
ace14c3b6b92e98e9ad8eec3201084c808f42d92Tony Bamford * logging works differently in unit test mode than it does in "real life" mode.
ace14c3b6b92e98e9ad8eec3201084c808f42d92Tony Bamford */
ace14c3b6b92e98e9ad8eec3201084c808f42d92Tony Bamford AM_LOG_ALWAYS(0, "\n"
ace14c3b6b92e98e9ad8eec3201084c808f42d92Tony Bamford "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\n"
ace14c3b6b92e98e9ad8eec3201084c808f42d92Tony Bamford "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\n"
ace14c3b6b92e98e9ad8eec3201084c808f42d92Tony Bamford "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\n"
ace14c3b6b92e98e9ad8eec3201084c808f42d92Tony Bamford "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\n"
ace14c3b6b92e98e9ad8eec3201084c808f42d92Tony Bamford "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\n"
ace14c3b6b92e98e9ad8eec3201084c808f42d92Tony Bamford "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\n"
ace14c3b6b92e98e9ad8eec3201084c808f42d92Tony Bamford "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\n"
ace14c3b6b92e98e9ad8eec3201084c808f42d92Tony Bamford "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\n"
ace14c3b6b92e98e9ad8eec3201084c808f42d92Tony Bamford "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\n"
ace14c3b6b92e98e9ad8eec3201084c808f42d92Tony Bamford "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\n"
ace14c3b6b92e98e9ad8eec3201084c808f42d92Tony Bamford "ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ");
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford}
48e27400d23e2586530cf943524e50c74d79a915Tony Bamford
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford/*************************************************************************************/
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamfordchar log_file_name[20];
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamfordchar audit_file_name[20];
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford#define ONE_K 1024
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford#define ONE_MB 1024 * 1024
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford#define TEN_MB ONE_MB * 10
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford/**
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford * Set up everything (shared memory, etc.) so we can log, just as we would if we were
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford * really running (as opposed to running in test harness mode).
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford */
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamfordvoid logging_setup(int logging_level) {
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford // destroy the cache, if it exists
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford am_cache_destroy();
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford
5d0dcd9820c04ac52a150525298eaae50c8b3544Mareks Malnacs assert_int_equal(am_init(AM_DEFAULT_AGENT_ID, NULL), AM_SUCCESS);
b2fed4601a417f26ae930973f98084b83ab8447aTony Bamford
b2fed4601a417f26ae930973f98084b83ab8447aTony Bamford am_init_worker(AM_DEFAULT_AGENT_ID);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford sprintf(log_file_name, "log%d", rand() % 1000000);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford // Note that we need a valid audit file name, even though we never audit
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford sprintf(audit_file_name, "aud%d", rand() % 1000000);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford am_log_register_instance(getpid(),
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford log_file_name, logging_level, TEN_MB,
d7b5652af8467eb82f44a15a0e29b5efa3d77844Mareks Malnacs audit_file_name, AM_LOG_LEVEL_AUDIT, ONE_MB, NULL);
8a4b0b791bf38ef8389a6501a586d8ab554e3711Mareks Malnacs am_init_worker(AM_DEFAULT_AGENT_ID);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford}
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford/**
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford * Tear down everything after doing some logging.
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford */
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamfordvoid logging_teardown() {
8a4b0b791bf38ef8389a6501a586d8ab554e3711Mareks Malnacs am_log_shutdown(AM_DEFAULT_AGENT_ID);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford am_shutdown_worker();
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford am_cache_destroy();
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford am_worker_pool_init_reset();
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford am_net_init_ssl_reset();
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford unlink(log_file_name);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford unlink(audit_file_name);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford}
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford/**
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford * Validate that the specified file contains the specified string. Very limited. The
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford * string searched for must occur entirely on a line and not span lines (if it does, it
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford * won't be matched).
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford *
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford * @param log_file_name The log file name
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford * @param text The text string to search for
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford * @return 1 if present, 0 if not present
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford */
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamfordint validate_contains(const char* file_name, const char* text) {
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford FILE* fp;
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford int result = 0;
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford char line[10 * ONE_K];
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford if ((fp = fopen(file_name, "r")) != NULL) {
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford while (fgets(line, sizeof(line), fp) != NULL && result == 0) {
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford result = strstr(line, text) != NULL;
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford }
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford fclose(fp);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford } else {
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford fprintf(stderr, "Warning, failed to open log file %s\n", file_name);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford }
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford return result;
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford}
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford/*************************************************************************************/
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford/**
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford * Ensure that an impractically high log level we DO actually log text via AM_LOG_DEBUG.
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford */
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamfordvoid test_log_debug_at_debug_level(void** state) {
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford int result;
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford const char* message = "Message written at DEBUG level.";
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford srand(time(NULL));
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford logging_setup(AM_LOG_LEVEL_AUDIT_DENY);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford AM_LOG_DEBUG(getpid(), message);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford sleep(5);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford result = validate_contains(log_file_name, message);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford logging_teardown();
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford assert_int_equal(result, 1);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford}
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford/**
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford * Ensure that at warning log level we do NOT log something via AM_LOG_DEBUG.
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford */
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamfordvoid test_log_debug_not_at_warning_level(void** state) {
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford int result;
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford const char* message = "Message written at DEBUG level.";
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford logging_setup(AM_LOG_LEVEL_WARNING);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford AM_LOG_DEBUG(getpid(), message);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford sleep(5);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford result = validate_contains(log_file_name, message);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford logging_teardown();
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford assert_int_equal(result, 0);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford}
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford/**
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford * Ensure that at warning log level we DO log something via AM_LOG_WARNING.
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford */
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamfordvoid test_log_warning_at_warning_level(void** state) {
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford int result;
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford const char* message = "Message written at WARNING level.";
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford logging_setup(AM_LOG_LEVEL_WARNING);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford AM_LOG_WARNING(getpid(), message);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford sleep(5);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford result = validate_contains(log_file_name, message);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford logging_teardown();
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford assert_int_equal(result, 1);
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford}
297139fbfec59440a16d037008e9fc7330bfb408Tony Bamford