//
// Copyright © 2019 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//

#include <armnn/Types.hpp>

#include <common/include/LabelsAndEventClasses.hpp>

#include <set>
#include <doctest/doctest.h>
#include <fmt/format.h>
#include <thread>

using namespace armnn::profiling;

TEST_SUITE("ProfilingGuidTests")
{
TEST_CASE("GuidTest")
{
    ProfilingGuid guid0(0);
    ProfilingGuid guid1(1);
    ProfilingGuid guid2(1);

    CHECK(guid0 != guid1);
    CHECK(guid1 == guid2);
    CHECK(guid0 < guid1);
    CHECK(guid0 <= guid1);
    CHECK(guid1 <= guid2);
    CHECK(guid1 > guid0);
    CHECK(guid1 >= guid0);
    CHECK(guid1 >= guid2);
}

TEST_CASE("StaticGuidTest")
{
    ProfilingStaticGuid guid0(0);
    ProfilingStaticGuid guid1(1);
    ProfilingStaticGuid guid2(1);

    CHECK(guid0 != guid1);
    CHECK(guid1 == guid2);
    CHECK(guid0 < guid1);
    CHECK(guid0 <= guid1);
    CHECK(guid1 <= guid2);
    CHECK(guid1 > guid0);
    CHECK(guid1 >= guid0);
    CHECK(guid1 >= guid2);
}

TEST_CASE("DynamicGuidTest")
{
    ProfilingDynamicGuid guid0(0);
    ProfilingDynamicGuid guid1(1);
    ProfilingDynamicGuid guid2(1);

    CHECK(guid0 != guid1);
    CHECK(guid1 == guid2);
    CHECK(guid0 < guid1);
    CHECK(guid0 <= guid1);
    CHECK(guid1 <= guid2);
    CHECK(guid1 > guid0);
    CHECK(guid1 >= guid0);
    CHECK(guid1 >= guid2);
}

void CheckStaticGuid(uint64_t guid, uint64_t expectedGuid)
{
    CHECK(guid == expectedGuid);
    CHECK(guid >= MIN_STATIC_GUID);
}

void CheckDynamicGuid(uint64_t guid, uint64_t expectedGuid)
{
    CHECK(guid == expectedGuid);
    CHECK(guid < MIN_STATIC_GUID);
}

TEST_CASE("StaticGuidGeneratorCollisionTest")
{
    ProfilingGuidGenerator generator;
    std::set<uint64_t> guids;
    for ( int i = 0; i < 100000; ++i )
    {
        std::stringstream ss;
        ss << i;
        std::string str = ss.str();
        ProfilingStaticGuid guid = generator.GenerateStaticId(str.c_str());
        if (guids.find(guid) != guids.end())
        {
            // If we're running on a 32bit system it is more likely to get a GUID clash over 1 million executions.
            // We can generally detect this when the GUID turns out to be MIN_STATIC_GUID. Output a warning
            // message rather than error in this case.
            if (guid == ProfilingGuid(armnn::profiling::MIN_STATIC_GUID))
            {
                WARN("MIN_STATIC_GUID returned more than once from GenerateStaticId.");
            } 
            else
            {
                FAIL(fmt::format("GUID collision occurred: {} -> {}", str, guid));
            }
            break;
        }
        guids.insert(guid);
    }
}

TEST_CASE("StaticGuidGeneratorTest")
{
    ProfilingGuidGenerator generator;

    ProfilingStaticGuid staticGuid0 = generator.GenerateStaticId("name");
    CheckStaticGuid(staticGuid0, LabelsAndEventClasses::NAME_GUID);
    CHECK(staticGuid0 != generator.GenerateStaticId("Name"));

    ProfilingStaticGuid staticGuid1 = generator.GenerateStaticId("type");
    CheckStaticGuid(staticGuid1, LabelsAndEventClasses::TYPE_GUID);
    CHECK(staticGuid1 != generator.GenerateStaticId("Type"));

    ProfilingStaticGuid staticGuid2 = generator.GenerateStaticId("index");
    CheckStaticGuid(staticGuid2, LabelsAndEventClasses::INDEX_GUID);
    CHECK(staticGuid2 != generator.GenerateStaticId("Index"));
}

TEST_CASE("DynamicGuidGeneratorTest")
{
    ProfilingGuidGenerator generator;

    for (unsigned int i = 0; i < 100; ++i)
    {
        ProfilingDynamicGuid guid = generator.NextGuid();
        CheckDynamicGuid(guid, i);
    }
}

TEST_CASE("ProfilingGuidThreadTest")
{
    ProfilingGuidGenerator profilingGuidGenerator;

    auto guidGenerator = [&profilingGuidGenerator]()
    {
        for (int i = 0; i < 1000; ++i)
        {
            profilingGuidGenerator.NextGuid();
        }
    };

    std::thread t1(guidGenerator);
    std::thread t2(guidGenerator);
    std::thread t3(guidGenerator);

    t1.join();
    t2.join();
    t3.join();

    uint64_t guid = profilingGuidGenerator.NextGuid();
    CHECK(guid == 3000u);
}

}
