/* -*- mode: C; c-basic-offset: 4 -*- */
#ident "$Id$"
#ident "Copyright (c) 2010 Tokutek Inc.  All rights reserved."

#include "test.h"
#include "includes.h"
#include "../brttypes.h"
#include "../txn.h"

/* 
 * a test of the txn filenums to ignore utilities:
 *  - toku_txn_ignore_create()
 *  - toku_txn_ignore_free()
 *  - toku_txn_ignore_add()
 *  - toku_txn_ignore_delete()
 *  - toku_txn_ignore_contains()
 */

int
test_main(int argc, const char *argv[]) {
    default_parse_args(argc, argv);

    TOKUTXN txn = (TOKUTXN) toku_malloc(sizeof(struct tokutxn));

    int r;

    r = toku_txn_ignore_init(txn);             CKERR(r);
    
    FILENUM f1 = {1};
    FILENUM f2 = {2};
    FILENUM f3 = {3};
    FILENUM f4 = {4};
    FILENUM f5 = {5};
    FILENUM f6 = {6};
    FILENUM f7 = {7};
    FILENUM f8 = {8};
    FILENUM f9 = {9};

    r = toku_txn_ignore_add(txn, f1);          CKERR(r);
    r = toku_txn_ignore_add(txn, f3);          CKERR(r);
    r = toku_txn_ignore_add(txn, f5);          CKERR(r);
    r = toku_txn_ignore_add(txn, f7);          CKERR(r);
    r = toku_txn_ignore_add(txn, f9);          CKERR(r);
    r = toku_txn_ignore_remove(txn, f3);       CKERR(r);
    r = toku_txn_ignore_remove(txn, f2);       assert( r == ENOENT );

    r = toku_txn_ignore_contains(txn, f1);     CKERR(r);
    r = toku_txn_ignore_contains(txn, f2);     assert( r == ENOENT );
    r = toku_txn_ignore_contains(txn, f3);     assert( r == ENOENT );
    r = toku_txn_ignore_contains(txn, f4);     assert( r == ENOENT );
    r = toku_txn_ignore_contains(txn, f5);     CKERR(r);
    r = toku_txn_ignore_contains(txn, f6);     assert( r == ENOENT );
    r = toku_txn_ignore_contains(txn, f7);     CKERR(r);
    r = toku_txn_ignore_contains(txn, f8);     assert( r == ENOENT );
    r = toku_txn_ignore_contains(txn, f9);     CKERR(r);

    assert(txn->ignore_errors.fns_allocated == 8);
    assert(txn->ignore_errors.filenums.num == 4);


    r = toku_txn_ignore_add(txn, f2);          CKERR(r);
    r = toku_txn_ignore_add(txn, f3);          CKERR(r);
    r = toku_txn_ignore_add(txn, f4);          CKERR(r);
    r = toku_txn_ignore_add(txn, f6);          CKERR(r);
    r = toku_txn_ignore_add(txn, f8);          CKERR(r);

    TXN_IGNORE txni = &(txn->ignore_errors);  // test using code similar to that in txn.c
    assert(txni->fns_allocated == 16);
    assert(txni->filenums.num == 9);

    // check that dups are ignored
    for (int i=0;i<10;i++) {
        r = toku_txn_ignore_add(txn, f2);          CKERR(r);
    }
    assert(txn->ignore_errors.fns_allocated == 16);
    assert(txn->ignore_errors.filenums.num == 9);

    toku_txn_ignore_free(txn);

    toku_free(txn);

    return 0;
}
