description("This tests indexes are left in appropriate states after aborted transactions.");

indexedDBTest(prepareDatabase);


function done()
{
    finishJSTest();
}

function log(message)
{
    debug(message);
}

function checkKey(index, key)
{
    var request1 = index.get(key);
    var request2 = index.getKey(key);

    request1.onsuccess = function() {
        debug("get \"" + key + "\" result is: " + request1.result);
        for (n in request1.result)
            debug(n + " is " + request1.result[n]);
    }
    request2.onsuccess = function() {
        debug("getKey \"" + key + "\" result is: " + request2.result);
        for (n in request2.result)
            debug(n + " is " + request2.result[n]);
    } 
}

function checkIndex(index)
{
    checkKey(index, "good");
    checkKey(index, "bad");
    checkKey(index, "multiEntry");
    checkKey(index, "test");
    
    var request = index.count();
    request.onsuccess = function() {
        debug("count result is: " + request.result);
        debug("");
    }
}

var database;

function prepareDatabase(event)
{
    debug("Initial upgrade needed: Old version - " + event.oldVersion + " New version - " + event.newVersion);

    var versionTransaction = event.target.transaction;
    database = event.target.result;
    var objectStore = database.createObjectStore("TestObjectStore");
    var index1 = objectStore.createIndex("TestIndex1", "bar");
    var index2 = objectStore.createIndex("TestIndex2", "baz");
    var index3 = objectStore.createIndex("TestIndex3", "bar", { multiEntry: true });

    objectStore.put({ bar: "good", baz: "bad" }, 1);
    objectStore.put({ bar: [ "multiEntry", "test" ]}, 2);
    
    checkIndex(index1);
    checkIndex(index2);
    checkIndex(index3);

    versionTransaction.onabort = function(event) {
        debug("Initial upgrade versionchange transaction unexpected abort");
        done();
    }

    versionTransaction.oncomplete = function(event) {
        debug("Initial upgrade versionchange transaction complete");
        continueTest1();
    }

    versionTransaction.onerror = function(event) {
        debug("Initial upgrade versionchange transaction unexpected error" + event);
        done();
    }
}

function continueTest1()
{   
    var transaction = database.transaction("TestObjectStore", "readwrite");
    var objectStore = transaction.objectStore("TestObjectStore");
    var index1 = objectStore.index("TestIndex1");
    var index2 = objectStore.index("TestIndex2");
    var index3 = objectStore.index("TestIndex3");
    
    objectStore.delete(1).onsuccess = function() {
       debug("Deleted key 1 from objectstore");
       debug("");
    }

    checkIndex(index1);
    checkIndex(index2);
    checkIndex(index3);

    objectStore.clear().onsuccess = function() {
       debug("Cleared objectstore");
       debug("");
    }
    
    checkIndex(index1);
    checkIndex(index2);
    checkIndex(index3);
    
    objectStore.get(0).onsuccess = function() {
        debug("All done. Moving on to final part");
        transaction.abort();
    }
    
    transaction.onabort = function(event) {
        debug("readwrite transaction aborted");
        continueTest2();
    }

    transaction.oncomplete = function(event) {
        debug("readwrite transaction unexpected complete");
        done();
    }

    transaction.onerror = function(event) {
        debug("readwrite transaction unexpected error");
        done();
    }
}

function continueTest2()
{   
    var transaction = database.transaction("TestObjectStore", "readonly");
    var objectStore = transaction.objectStore("TestObjectStore");
    var index1 = objectStore.index("TestIndex1");
    var index2 = objectStore.index("TestIndex2");
    var index3 = objectStore.index("TestIndex3");
    
    checkIndex(index1);
    checkIndex(index2);
    checkIndex(index3);
    
    transaction.onabort = function(event) {
        debug("readwrite transaction unexpected abort");
        done();
    }

    transaction.oncomplete = function(event) {
        debug("readwrite transaction complete");
        done();
    }

    transaction.onerror = function(event) {
        debug("readwrite transaction unexpected error");
        done();
    }
}


