#include "CppUTest/TestHarness.h"
#include "CppUTest/CommandLineTestRunner.h"

#include "hci_dump.h"
#include "btstack_util.h"

static void hci_dump_embedded_stdout_log_packet(uint8_t packet_type, uint8_t in, uint8_t *packet, uint16_t len){
}
static void hci_dump_embedded_stdout_log_message(int log_level, const char * format, va_list argptr){
}
static void hci_dump_embedded_stdout_reset(void){}

static const hci_dump_t hci_dump_instance_without_reset = {
    // void (*reset)(void);
    NULL,
    // void (*log_packet)(uint8_t packet_type, uint8_t in, uint8_t *packet, uint16_t len);
    &hci_dump_embedded_stdout_log_packet,
    // void (*log_message)(int log_level, const char * format, va_list argptr);
    &hci_dump_embedded_stdout_log_message,
};

static const hci_dump_t hci_dump_instance_with_reset = {
        // void (*reset)(void);
        &hci_dump_embedded_stdout_reset,
        // void (*log_packet)(uint8_t packet_type, uint8_t in, uint8_t *packet, uint16_t len);
        &hci_dump_embedded_stdout_log_packet,
        // void (*log_message)(int log_level, const char * format, va_list argptr);
        &hci_dump_embedded_stdout_log_message,
};

TEST_GROUP(hci_dump){
        void setup(void){
        }
        void teardown(void){
        }
};

TEST(hci_dump, init){
    hci_dump_init(&hci_dump_instance_without_reset);
    hci_dump_set_max_packets(0);
    hci_dump_enable_packet_log(false);
}

TEST(hci_dump, log_level){
    hci_dump_init(&hci_dump_instance_without_reset);
    hci_dump_log(HCI_DUMP_LOG_LEVEL_DEBUG - 1, "");
    hci_dump_log(HCI_DUMP_LOG_LEVEL_ERROR + 1, "");
    hci_dump_enable_log_level(HCI_DUMP_LOG_LEVEL_DEBUG - 1, 0);
    hci_dump_enable_log_level(HCI_DUMP_LOG_LEVEL_ERROR + 1, 0);
    hci_dump_enable_log_level(HCI_DUMP_LOG_LEVEL_ERROR, 1);
}

TEST(hci_dump, log_not_enabled){
    hci_dump_init(&hci_dump_instance_without_reset);
    hci_dump_enable_packet_log(false);
    hci_dump_packet(0, 0, NULL, 0);
}

TEST(hci_dump, log_reset){
    hci_dump_init(&hci_dump_instance_without_reset);
    hci_dump_set_max_packets(1);
    hci_dump_packet(0, 0, NULL, 0);
    hci_dump_packet(0, 0, NULL, 0);
}

TEST(hci_dump, log_max_packets){
    hci_dump_init(&hci_dump_instance_with_reset);
    hci_dump_set_max_packets(1);
    hci_dump_packet(0, 0, NULL, 0);
    hci_dump_packet(0, 0, NULL, 0);
}

TEST(hci_dump, header_setup_packetlogger){
    uint8_t buffer[100];
    hci_dump_setup_header_packetlogger(buffer, 0, 0, HCI_COMMAND_DATA_PACKET, 0, 0);
    hci_dump_setup_header_packetlogger(buffer, 0, 0, HCI_ACL_DATA_PACKET, 0, 0);
    hci_dump_setup_header_packetlogger(buffer, 0, 0, HCI_SCO_DATA_PACKET, 0, 0);
    hci_dump_setup_header_packetlogger(buffer, 0, 0, HCI_EVENT_PACKET, 0, 0);
    hci_dump_setup_header_packetlogger(buffer, 0, 0, HCI_COMMAND_DATA_PACKET, 0, 0);
    hci_dump_setup_header_packetlogger(buffer, 0, 0, LOG_MESSAGE_PACKET, 0, 0);
    hci_dump_setup_header_packetlogger(buffer, 0, 0, 0x77, 0, 0);
}

TEST(hci_dump, header_setup_bluez){
    uint8_t buffer[100];
    hci_dump_setup_header_bluez(buffer, 0, 0, HCI_COMMAND_DATA_PACKET, 0, 0);
    hci_dump_setup_header_bluez(buffer, 0, 0, HCI_ACL_DATA_PACKET, 0, 0);
    hci_dump_setup_header_bluez(buffer, 0, 0, HCI_SCO_DATA_PACKET, 0, 0);
    hci_dump_setup_header_bluez(buffer, 0, 0, HCI_EVENT_PACKET, 0, 0);
    hci_dump_setup_header_bluez(buffer, 0, 0, HCI_COMMAND_DATA_PACKET, 0, 0);
    hci_dump_setup_header_bluez(buffer, 0, 0, LOG_MESSAGE_PACKET, 0, 0);
    hci_dump_setup_header_bluez(buffer, 0, 0, 0x77, 0, 0);
}

TEST(hci_dump, header_setup_btsnoop){
    uint8_t buffer[100];
    hci_dump_setup_header_btsnoop(buffer, 0, 0, 0, HCI_COMMAND_DATA_PACKET, 0, 0);
    hci_dump_setup_header_btsnoop(buffer, 0, 0, 0, HCI_ACL_DATA_PACKET, 0, 0);
    hci_dump_setup_header_btsnoop(buffer, 0, 0, 0, HCI_ACL_DATA_PACKET, 1, 0);
    hci_dump_setup_header_btsnoop(buffer, 0, 0, 0, HCI_SCO_DATA_PACKET, 0, 0);
    hci_dump_setup_header_btsnoop(buffer, 0, 0, 0, HCI_EVENT_PACKET, 0, 0);
    hci_dump_setup_header_btsnoop(buffer, 0, 0, 0, HCI_COMMAND_DATA_PACKET, 0, 0);
    hci_dump_setup_header_btsnoop(buffer, 0, 0, 0, LOG_MESSAGE_PACKET, 0, 0);
    hci_dump_setup_header_btsnoop(buffer, 0, 0, 0, 0x77, 0, 0);
}

int main (int argc, const char * argv[]){
    return CommandLineTestRunner::RunAllTests(argc, argv);
}