

#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;
    }

    
    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 = ossl_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;
}

