/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

#include "core/htrace.h"
#include "core/span_id.h"
#include "test/span_util.h"
#include "test/test.h"

#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static int test_span_id_round_trip(const char *str)
{
    struct htrace_span_id id;
    char err[512], str2[HTRACE_SPAN_ID_STRING_LENGTH + 1];
    size_t err_len = sizeof(err);

    err[0] = '\0';
    htrace_span_id_parse(&id, str, err, err_len);
    EXPECT_STR_EQ("", err);
    EXPECT_INT_EQ(1, htrace_span_id_to_str(&id, str2, sizeof(str2)));
    EXPECT_STR_EQ(str, str2);
    return 0;
}

static int test_span_id_compare(int isLess,
                                const char *sa, const char *sb)
{
    struct htrace_span_id a, b;
    char err[512];
    size_t err_len = sizeof(err);
    int cmp;

    err[0] = '\0';

    htrace_span_id_parse(&a, sa, err, err_len);
    EXPECT_STR_EQ("", err);

    htrace_span_id_parse(&b, sb, err, err_len);
    EXPECT_STR_EQ("", err);

    cmp = htrace_span_id_compare(&a, &b);
    if (isLess) {
        EXPECT_INT_GT(cmp, 0);
    } else {
        EXPECT_INT_ZERO(cmp);
    }
    cmp = htrace_span_id_compare(&b, &a);
    if (isLess) {
        EXPECT_INT_GT(0, cmp);
    } else {
        EXPECT_INT_ZERO(cmp);
    }
    return 0;
}

static int test_span_id_less(const char *sa, const char *sb)
{
    return test_span_id_compare(1, sa, sb);
}

static int test_span_id_eq(const char *sa, const char *sb)
{
    return test_span_id_compare(0, sa, sb);
}

int main(void)
{
    EXPECT_INT_ZERO(test_span_id_round_trip("0123456789abcdef0011223344556677"));
    EXPECT_INT_ZERO(test_span_id_round_trip("a919f3d62ce111e5b345feff819cdc9f"));
    EXPECT_INT_ZERO(test_span_id_round_trip("00000000000000000000000000000000"));
    EXPECT_INT_ZERO(test_span_id_round_trip("ba85631c2ce111e5b345feff819cdc9f"));
    EXPECT_INT_ZERO(test_span_id_round_trip("ffffffffffffffffffffffffffffffff"));
    EXPECT_INT_ZERO(test_span_id_round_trip("ba85631c2ce111e5b345feff819cdc9f"));

    EXPECT_INT_ZERO(test_span_id_less("a919f3d62ce111e5b345feff819cdc9e",
                                      "a919f3d62ce111e5b345feff819cdc9f"));
    EXPECT_INT_ZERO(test_span_id_eq("a919f3d62ce111e5b345feff819cdc9f",
                                    "a919f3d62ce111e5b345feff819cdc9f"));
    EXPECT_INT_ZERO(test_span_id_eq("ffffffff2ce111e5b345feff819cdc9f",
                                    "ffffffff2ce111e5b345feff819cdc9f"));
    EXPECT_INT_ZERO(test_span_id_less("1919f3d62ce111e5b345feff819cdc9f",
                                      "f919f3d62ce111e5b345feff81900000"));
    return EXIT_SUCCESS;
}

// vim: ts=4:sw=4:tw=79:et
