/*
 * Copyright 2021-2022 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the Apache License 2.0 (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

#include <string.h>
#include "apps.h"
#include "testutil.h"
#include "crypto/asn1.h"

#define binname "ca_internals_test"

char *default_config_file = NULL;

static int test_do_updatedb(void)
{
    CA_DB *db = NULL;
    time_t testdateutc;
    int rv;
    size_t argc = test_get_argument_count();
    BIO *bio_tmp;
    char *testdate;
    char *indexfile;
    int need64bit;
    int have64bit;

    if (argc != 4) {
        TEST_error("Usage: %s: do_updatedb dbfile testdate need64bit\n", binname);
        TEST_error("       testdate format: ASN1-String\n");
        return 0;
    }

    /*
     * if the test will only work with 64bit time_t and
     * the build only supports 32, assume the test as success
     */
    need64bit = (int)strtol(test_get_argument(3), NULL, 0);
    have64bit = sizeof(time_t) > sizeof(uint32_t);
    if (need64bit && !have64bit) {
        BIO_printf(bio_out, "skipping test (need64bit: %i, have64bit: %i)",
            need64bit, have64bit);
        return 1;
    }

    testdate = test_get_argument(2);
    testdateutc = asn1_string_to_time_t(testdate);
    if (TEST_time_t_lt(testdateutc, 0)) {
        return 0;
    }

    indexfile = test_get_argument(1);
    db = load_index(indexfile, NULL);
    if (TEST_ptr_null(db)) {
        return 0;
    }

    bio_tmp = bio_err;
    bio_err = bio_out;
    rv = do_updatedb(db, &testdateutc);
    bio_err = bio_tmp;

    if (rv > 0) {
        if (!TEST_true(save_index(indexfile, "new", db)))
            goto end;

        if (!TEST_true(rotate_index(indexfile, "new", "old")))
            goto end;
    }
end:
    free_index(db);
    return 1;
}

int setup_tests(void)
{
    char *command = test_get_argument(0);

    if (test_get_argument_count() < 1) {
        TEST_error("%s: no command specified for testing\n", binname);
        return 0;
    }

    if (strcmp(command, "do_updatedb") == 0)
        return test_do_updatedb();

    TEST_error("%s: command '%s' is not supported for testing\n", binname, command);
    return 0;
}

