/*
 *
 *    Copyright (c) 2017 Nest Labs, Inc.
 *    All rights reserved.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

/**
 *    @file
 *      This file implements a unit test suite for the Weave
 *      Profile Support interfaces.
 *
 */

#include <stdint.h>

#include <Weave/Support/ProfileStringSupport.hpp>

#include <nlunit-test.h>

using namespace nl::Weave;

// Type Definitions

static const uint32_t kWeaveProfile_TestProfileStringSupport_1 = (0xFFF0 << 16 | 0xFEF0);
static const uint32_t kWeaveProfile_TestProfileStringSupport_2 = (0xFFF0 << 16 | 0xFEF1);
static const uint32_t kWeaveProfile_TestProfileStringSupport_3 = (0xFFF0 << 16 | 0xFEF2);

enum {
    kTestProfileStringSupport_1_MessageType_1 = 1,
    kTestProfileStringSupport_1_MessageType_2 = 2,

    kTestProfileStringSupport_2_MessageType_1 = 1,
    kTestProfileStringSupport_2_MessageType_2 = 2
};

// Forward Declarations

static const char * TestMessageStrFunct(uint32_t inProfileId, uint8_t inMsgType);
static const char * TestProfileStrFunct(uint32_t inProfileId);
static const char * TestStatusReportStrFunct(uint32_t inProfileId, uint16_t inStatusCode);

// Globals

static const struct Support::ProfileStringInfo sTestProfileStringInfo_1 = {
    kWeaveProfile_TestProfileStringSupport_1,
    TestMessageStrFunct,
    TestProfileStrFunct,
    TestStatusReportStrFunct
};

static struct Support::ProfileStringContext    sTestProfileStringContext_1  = {
    NULL,
    sTestProfileStringInfo_1
};

static const struct Support::ProfileStringInfo sTestProfileStringInfo_2 = {
    kWeaveProfile_TestProfileStringSupport_2,
    NULL,
    NULL,
    NULL
};

static struct Support::ProfileStringContext    sTestProfileStringContext_2  = {
    NULL,
    sTestProfileStringInfo_2
};

static const struct Support::ProfileStringInfo sTestProfileStringInfo_3 = {
    kWeaveProfile_TestProfileStringSupport_3,
    NULL,
    NULL,
    NULL
};

static struct Support::ProfileStringContext    sTestProfileStringContext_3  = {
    NULL,
    sTestProfileStringInfo_3
};

static struct Support::ProfileStringContext    sTestProfileStringContext_1_Alias  = {
    NULL,
    sTestProfileStringInfo_1
};

static struct Support::ProfileStringContext    sTestProfileStringContext_2_Alias  = {
    NULL,
    sTestProfileStringInfo_2
};

static struct Support::ProfileStringContext    sTestProfileStringContext_3_Alias  = {
    NULL,
    sTestProfileStringInfo_3
};

static const char * TestMessageStrFunct(uint32_t inProfileId, uint8_t inMsgType)
{
    return (NULL);
}

static const char * TestProfileStrFunct(uint32_t inProfileId)
{
    return (NULL);
}

static const char * TestStatusReportStrFunct(uint32_t inProfileId, uint16_t inStatusCode)
{
    return (NULL);
}

struct ProfileStringContextExtent
{
    Support::ProfileStringContext ** mObjects;
    size_t                           mCount;
};

struct ProfileStringRegisterParams
{
    ProfileStringContextExtent      mContexts;
    ProfileStringContextExtent      mAliases;
};

/**
 *  Test that unregister fails as expected with an empty registry.
 *
 */
static void CheckUnregisterEmpty(nlTestSuite *inSuite, void *inContext)
{
    WEAVE_ERROR status;

    // Try the three actual profiles

    status = Support::UnregisterProfileStringInfo(sTestProfileStringContext_1);
    NL_TEST_ASSERT(inSuite, status == WEAVE_ERROR_PROFILE_STRING_CONTEXT_NOT_REGISTERED);

    status = Support::UnregisterProfileStringInfo(sTestProfileStringContext_2);
    NL_TEST_ASSERT(inSuite, status == WEAVE_ERROR_PROFILE_STRING_CONTEXT_NOT_REGISTERED);

    status = Support::UnregisterProfileStringInfo(sTestProfileStringContext_3);
    NL_TEST_ASSERT(inSuite, status == WEAVE_ERROR_PROFILE_STRING_CONTEXT_NOT_REGISTERED);

    // Try the three profile aliases

    status = Support::UnregisterProfileStringInfo(sTestProfileStringContext_1_Alias);
    NL_TEST_ASSERT(inSuite, status == WEAVE_ERROR_PROFILE_STRING_CONTEXT_NOT_REGISTERED);

    status = Support::UnregisterProfileStringInfo(sTestProfileStringContext_2_Alias);
    NL_TEST_ASSERT(inSuite, status == WEAVE_ERROR_PROFILE_STRING_CONTEXT_NOT_REGISTERED);

    status = Support::UnregisterProfileStringInfo(sTestProfileStringContext_3_Alias);
    NL_TEST_ASSERT(inSuite, status == WEAVE_ERROR_PROFILE_STRING_CONTEXT_NOT_REGISTERED);
}

/**
 *  Test that find fails as expected on an empty registry.
 *
 */
static void CheckFindEmpty(nlTestSuite *inSuite, void *inContext)
{
    const Support::ProfileStringInfo *result;

    // Try the three actual profiles

    result = Support::FindProfileStringInfo(kWeaveProfile_TestProfileStringSupport_1);
    NL_TEST_ASSERT(inSuite, result == NULL);

    result = Support::FindProfileStringInfo(kWeaveProfile_TestProfileStringSupport_2);
    NL_TEST_ASSERT(inSuite, result == NULL);

    result = Support::FindProfileStringInfo(kWeaveProfile_TestProfileStringSupport_3);
    NL_TEST_ASSERT(inSuite, result == NULL);
}

/**
 *  Test that registration works as expected on an empty registry.
 *
 */
static void CheckRegisterEmpty(nlTestSuite *inSuite, void *inContext, ProfileStringRegisterParams &inParams)
{
    WEAVE_ERROR status;
    size_t i;

    // Register the profiles in the requested order.

    for (i = 0; i < inParams.mContexts.mCount; i++)
    {

        status = Support::RegisterProfileStringInfo(*inParams.mContexts.mObjects[i]);
        NL_TEST_ASSERT(inSuite, status == WEAVE_NO_ERROR);
    }

    // Verify that registering them again fails.

    for (i = 0; i < inParams.mContexts.mCount; i++)
    {

        status = Support::RegisterProfileStringInfo(*inParams.mContexts.mObjects[i]);
        NL_TEST_ASSERT(inSuite, status == WEAVE_ERROR_PROFILE_STRING_CONTEXT_ALREADY_REGISTERED);
    }

    // Verify that registering their aliases also fails.

    for (i = 0; i < inParams.mAliases.mCount; i++)
    {
        status = Support::RegisterProfileStringInfo(*inParams.mAliases.mObjects[i]);
        NL_TEST_ASSERT(inSuite, status == WEAVE_ERROR_PROFILE_STRING_CONTEXT_ALREADY_REGISTERED);
    }

    // Verify that ordering is profile identifier ascending order

    NL_TEST_ASSERT(inSuite, sTestProfileStringContext_1.mNext == &sTestProfileStringContext_2);
    NL_TEST_ASSERT(inSuite, sTestProfileStringContext_2.mNext == &sTestProfileStringContext_3);
    NL_TEST_ASSERT(inSuite, sTestProfileStringContext_3.mNext == NULL);
}

/**
 *  Test that registration works as expected on an empty registry with
 *  profiles in the order 1-2-3.
 *
 */
static void CheckRegisterEmpty_123(nlTestSuite *inSuite, void *inContext)
{
    Support::ProfileStringContext * contexts[3] = {
        &sTestProfileStringContext_1,
        &sTestProfileStringContext_2,
        &sTestProfileStringContext_3
    };
    Support::ProfileStringContext * aliases[3] = {
        &sTestProfileStringContext_1_Alias,
        &sTestProfileStringContext_2_Alias,
        &sTestProfileStringContext_3_Alias
    };
    ProfileStringRegisterParams params = {
        { contexts, sizeof (contexts) / sizeof (contexts[0]) },
        { aliases,  sizeof (aliases) / sizeof (aliases[0]) },
    };

    CheckRegisterEmpty(inSuite, inContext, params);
}

/**
 *  Test that registration works as expected on an empty registry with
 *  profiles in the order 1-3-2.
 *
 */
static void CheckRegisterEmpty_132(nlTestSuite *inSuite, void *inContext)
{
    Support::ProfileStringContext * contexts[3] = {
        &sTestProfileStringContext_1,
        &sTestProfileStringContext_3,
        &sTestProfileStringContext_2
    };
    Support::ProfileStringContext * aliases[3] = {
        &sTestProfileStringContext_1_Alias,
        &sTestProfileStringContext_3_Alias,
        &sTestProfileStringContext_2_Alias
    };
    ProfileStringRegisterParams params = {
        { contexts, sizeof (contexts) / sizeof (contexts[0]) },
        { aliases,  sizeof (aliases) / sizeof (aliases[0]) },
    };

    CheckRegisterEmpty(inSuite, inContext, params);
}

/**
 *  Test that registration works as expected on an empty registry with
 *  profiles in the order 2-1-3.
 *
 */
static void CheckRegisterEmpty_213(nlTestSuite *inSuite, void *inContext)
{
    Support::ProfileStringContext * contexts[3] = {
        &sTestProfileStringContext_2,
        &sTestProfileStringContext_1,
        &sTestProfileStringContext_3
    };
    Support::ProfileStringContext * aliases[3] = {
        &sTestProfileStringContext_2_Alias,
        &sTestProfileStringContext_1_Alias,
        &sTestProfileStringContext_3_Alias
    };
    ProfileStringRegisterParams params = {
        { contexts, sizeof (contexts) / sizeof (contexts[0]) },
        { aliases,  sizeof (aliases) / sizeof (aliases[0]) },
    };

    CheckRegisterEmpty(inSuite, inContext, params);
}

/**
 *  Test that registration works as expected on an empty registry with
 *  profiles in the order 2-3-1.
 *
 */
static void CheckRegisterEmpty_231(nlTestSuite *inSuite, void *inContext)
{
    Support::ProfileStringContext * contexts[3] = {
        &sTestProfileStringContext_2,
        &sTestProfileStringContext_3,
        &sTestProfileStringContext_1
    };
    Support::ProfileStringContext * aliases[3] = {
        &sTestProfileStringContext_2_Alias,
        &sTestProfileStringContext_3_Alias,
        &sTestProfileStringContext_1_Alias
    };
    ProfileStringRegisterParams params = {
        { contexts, sizeof (contexts) / sizeof (contexts[0]) },
        { aliases,  sizeof (aliases) / sizeof (aliases[0]) },
    };

    CheckRegisterEmpty(inSuite, inContext, params);
}

/**
 *  Test that registration works as expected on an empty registry with
 *  profiles in the order 3-1-2.
 *
 */
static void CheckRegisterEmpty_312(nlTestSuite *inSuite, void *inContext)
{
    Support::ProfileStringContext * contexts[3] = {
        &sTestProfileStringContext_3,
        &sTestProfileStringContext_2,
        &sTestProfileStringContext_1
    };
    Support::ProfileStringContext * aliases[3] = {
        &sTestProfileStringContext_3_Alias,
        &sTestProfileStringContext_2_Alias,
        &sTestProfileStringContext_1_Alias
    };
    ProfileStringRegisterParams params = {
        { contexts, sizeof (contexts) / sizeof (contexts[0]) },
        { aliases,  sizeof (aliases) / sizeof (aliases[0]) },
    };

    CheckRegisterEmpty(inSuite, inContext, params);
}

/**
 *  Test that registration works as expected on an empty registry with
 *  profiles in the order 3-2-1.
 *
 */
static void CheckRegisterEmpty_321(nlTestSuite *inSuite, void *inContext)
{
    Support::ProfileStringContext * contexts[3] = {
        &sTestProfileStringContext_3,
        &sTestProfileStringContext_2,
        &sTestProfileStringContext_1
    };
    Support::ProfileStringContext * aliases[3] = {
        &sTestProfileStringContext_3_Alias,
        &sTestProfileStringContext_2_Alias,
        &sTestProfileStringContext_1_Alias
    };
    ProfileStringRegisterParams params = {
        { contexts, sizeof (contexts) / sizeof (contexts[0]) },
        { aliases,  sizeof (aliases) / sizeof (aliases[0]) },
    };

    CheckRegisterEmpty(inSuite, inContext, params);
}

/**
 *  Test that, assuming a prior registration, that find and unregister
 *  work as expected.
 *
 */
static void CheckFindAndUnregister(nlTestSuite *inSuite, void *inContext)
{
    WEAVE_ERROR status;
    const Support::ProfileStringInfo *result;

    // Verify that the three profiles that have been added are present.

    result = Support::FindProfileStringInfo(kWeaveProfile_TestProfileStringSupport_1);
    NL_TEST_ASSERT(inSuite, result != NULL);
    NL_TEST_ASSERT(inSuite, result == &sTestProfileStringInfo_1);

    result = Support::FindProfileStringInfo(kWeaveProfile_TestProfileStringSupport_2);
    NL_TEST_ASSERT(inSuite, result != NULL);
    NL_TEST_ASSERT(inSuite, result == &sTestProfileStringInfo_2);

    result = Support::FindProfileStringInfo(kWeaveProfile_TestProfileStringSupport_3);
    NL_TEST_ASSERT(inSuite, result != NULL);
    NL_TEST_ASSERT(inSuite, result == &sTestProfileStringInfo_3);

    // Remove one of the three profiles and cofirm, via find, that it is
    // gone.

    status = Support::UnregisterProfileStringInfo(sTestProfileStringContext_2);
    NL_TEST_ASSERT(inSuite, status == WEAVE_NO_ERROR);

    result = Support::FindProfileStringInfo(kWeaveProfile_TestProfileStringSupport_2);
    NL_TEST_ASSERT(inSuite, result == NULL);

    // Confirm, via unregister, that it is gone.

    status = Support::UnregisterProfileStringInfo(sTestProfileStringContext_2);
    NL_TEST_ASSERT(inSuite, status == WEAVE_ERROR_PROFILE_STRING_CONTEXT_NOT_REGISTERED);

    // Remove the second of the three profiles and cofirm, via find,
    // that it is gone.

    status = Support::UnregisterProfileStringInfo(sTestProfileStringContext_1);
    NL_TEST_ASSERT(inSuite, status == WEAVE_NO_ERROR);

    result = Support::FindProfileStringInfo(kWeaveProfile_TestProfileStringSupport_1);
    NL_TEST_ASSERT(inSuite, result == NULL);

    // Confirm, via unregister, that it is gone.

    status = Support::UnregisterProfileStringInfo(sTestProfileStringContext_1);
    NL_TEST_ASSERT(inSuite, status == WEAVE_ERROR_PROFILE_STRING_CONTEXT_NOT_REGISTERED);

    // Remove the third of the three profiles and cofirm, via find,
    // that it is gone.

    status = Support::UnregisterProfileStringInfo(sTestProfileStringContext_3);
    NL_TEST_ASSERT(inSuite, status == WEAVE_NO_ERROR);

    result = Support::FindProfileStringInfo(kWeaveProfile_TestProfileStringSupport_3);
    NL_TEST_ASSERT(inSuite, result == NULL);

    // Confirm, via unregister, that it is gone.

    status = Support::UnregisterProfileStringInfo(sTestProfileStringContext_3);
    NL_TEST_ASSERT(inSuite, status == WEAVE_ERROR_PROFILE_STRING_CONTEXT_NOT_REGISTERED);
}

/**
 *  Test that unregister works as expected when using an alias as the
 *  match target.
 *
 */
static void CheckUnregisterWithAlias(nlTestSuite *inSuite, void *inContext)
{
    WEAVE_ERROR status;
    const Support::ProfileStringInfo *result;

    // Register the three profiles. Intentionally add (3) first and
    // then (2), to exercise sorted insert.

    status = Support::RegisterProfileStringInfo(sTestProfileStringContext_1);
    NL_TEST_ASSERT(inSuite, status == WEAVE_NO_ERROR);

    status = Support::RegisterProfileStringInfo(sTestProfileStringContext_3);
    NL_TEST_ASSERT(inSuite, status == WEAVE_NO_ERROR);

    status = Support::RegisterProfileStringInfo(sTestProfileStringContext_2);
    NL_TEST_ASSERT(inSuite, status == WEAVE_NO_ERROR);

    // Verify that the three profiles that have been added are present.

    result = Support::FindProfileStringInfo(kWeaveProfile_TestProfileStringSupport_1);
    NL_TEST_ASSERT(inSuite, result != NULL);
    NL_TEST_ASSERT(inSuite, result == &sTestProfileStringInfo_1);

    result = Support::FindProfileStringInfo(kWeaveProfile_TestProfileStringSupport_2);
    NL_TEST_ASSERT(inSuite, result != NULL);
    NL_TEST_ASSERT(inSuite, result == &sTestProfileStringInfo_2);

    result = Support::FindProfileStringInfo(kWeaveProfile_TestProfileStringSupport_3);
    NL_TEST_ASSERT(inSuite, result != NULL);
    NL_TEST_ASSERT(inSuite, result == &sTestProfileStringInfo_3);

    // Remove one of the three profiles and cofirm, via find, that it is
    // gone.

    status = Support::UnregisterProfileStringInfo(sTestProfileStringContext_2_Alias);
    NL_TEST_ASSERT(inSuite, status == WEAVE_NO_ERROR);

    result = Support::FindProfileStringInfo(kWeaveProfile_TestProfileStringSupport_2);
    NL_TEST_ASSERT(inSuite, result == NULL);

    // Confirm, via unregister, that it is gone.

    status = Support::UnregisterProfileStringInfo(sTestProfileStringContext_2_Alias);
    NL_TEST_ASSERT(inSuite, status == WEAVE_ERROR_PROFILE_STRING_CONTEXT_NOT_REGISTERED);

    // Remove the second of the three profiles and cofirm, via find,
    // that it is gone.

    status = Support::UnregisterProfileStringInfo(sTestProfileStringContext_1_Alias);
    NL_TEST_ASSERT(inSuite, status == WEAVE_NO_ERROR);

    result = Support::FindProfileStringInfo(kWeaveProfile_TestProfileStringSupport_1);
    NL_TEST_ASSERT(inSuite, result == NULL);

    // Confirm, via unregister, that it is gone.

    status = Support::UnregisterProfileStringInfo(sTestProfileStringContext_1_Alias);
    NL_TEST_ASSERT(inSuite, status == WEAVE_ERROR_PROFILE_STRING_CONTEXT_NOT_REGISTERED);

    // Remove the third of the three profiles and cofirm, via find,
    // that it is gone.

    status = Support::UnregisterProfileStringInfo(sTestProfileStringContext_3_Alias);
    NL_TEST_ASSERT(inSuite, status == WEAVE_NO_ERROR);

    result = Support::FindProfileStringInfo(kWeaveProfile_TestProfileStringSupport_3);
    NL_TEST_ASSERT(inSuite, result == NULL);

    // Confirm, via unregister, that it is gone.

    status = Support::UnregisterProfileStringInfo(sTestProfileStringContext_3_Alias);
    NL_TEST_ASSERT(inSuite, status == WEAVE_ERROR_PROFILE_STRING_CONTEXT_NOT_REGISTERED);
}

static const nlTest sTests[] = {
    NL_TEST_DEF("unregister (empty)",     CheckUnregisterEmpty),
    NL_TEST_DEF("find (empty)",           CheckFindEmpty),
    NL_TEST_DEF("register 1-2-3 (empty)", CheckRegisterEmpty_123),
    NL_TEST_DEF("find and unregister",    CheckFindAndUnregister),
    NL_TEST_DEF("register 1-3-2 (empty)", CheckRegisterEmpty_132),
    NL_TEST_DEF("find and unregister",    CheckFindAndUnregister),
    NL_TEST_DEF("register 2-1-3 (empty)", CheckRegisterEmpty_213),
    NL_TEST_DEF("find and unregister",    CheckFindAndUnregister),
    NL_TEST_DEF("register 2-3-1 (empty)", CheckRegisterEmpty_231),
    NL_TEST_DEF("find and unregister",    CheckFindAndUnregister),
    NL_TEST_DEF("register 3-1-2 (empty)", CheckRegisterEmpty_312),
    NL_TEST_DEF("find and unregister",    CheckFindAndUnregister),
    NL_TEST_DEF("register 3-2-1 (empty)", CheckRegisterEmpty_321),
    NL_TEST_DEF("find and unregister",    CheckFindAndUnregister),
    NL_TEST_DEF("unregister with alias",  CheckUnregisterWithAlias),
    NL_TEST_SENTINEL()
};

int main(void)
{
    nlTestSuite theSuite = {
        "weave-profile-string-support",
        &sTests[0]
    };

    nl_test_set_output_style(OUTPUT_CSV);

    nlTestRunner(&theSuite, NULL);

    return nlTestRunnerStats(&theSuite);
}
