<!DOCTYPE html>
<meta charset=utf-8>
<title>Writer starvation</title>
<link rel="author" href="mailto:odinho@opera.com" title="Odin Hørthe Omdal">
<meta name=timeout content=long>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=support.js></script>

<script>
    var db, read_request_count = 0, read_success_count = 0;
    var write_request_count = 0, write_success_count = 0;
    var RQ_COUNT = 25;

    var open_rq = createdb(async_test(undefined, {timeout: 20000}));
    open_rq.onupgradeneeded = function(e) {
        db = e.target.result;
        db.createObjectStore("s")
          .add("1", 1);
    }

    open_rq.onsuccess = function(e) {
        var i = 0, continue_reading = true;

        /* Pre-fill some read requests */
        for (i = 0; i < RQ_COUNT; i++)
        {
            read_request_count++;

            db.transaction("s")
              .objectStore("s")
              .get(1)
              .onsuccess = this.step_func(function(e) {
                    read_success_count++;
                    assert_equals(e.target.transaction.mode, "readonly");
                });
        }

        this.step(loop);

        function loop() {
            read_request_count++;

            db.transaction("s")
              .objectStore("s")
              .get(1)
              .onsuccess = this.step_func(function(e)
            {
                read_success_count++;
                assert_equals(e.target.transaction.mode, "readonly");

                if (read_success_count >= RQ_COUNT && write_request_count == 0)
                {
                    write_request_count++;

                    db.transaction("s", "readwrite")
                      .objectStore("s")
                      .add("written", read_request_count)
                      .onsuccess = this.step_func(function(e)
                    {
                        write_success_count++;
                        assert_equals(e.target.transaction.mode, "readwrite");
                        assert_equals(e.target.result, read_success_count,
                                       "write cb came before later read cb's")
                    });

                    /* Reads done after the write */
                    for (i = 0; i < 5; i++)
                    {
                        read_request_count++;

                        db.transaction("s")
                          .objectStore("s")
                          .get(1)
                          .onsuccess = this.step_func(function(e)
                        {
                            read_success_count++;
                        });
                    }
                }
            });

            if (read_success_count < RQ_COUNT + 5)
                setTimeout(this.step_func(loop), write_request_count ? 1000 : 100);
            else
                // This is merely a "nice" hack to run finish after the last request is done
                db.transaction("s")
                  .objectStore("s")
                  .count()
                  .onsuccess = this.step_func(function()
                {
                    setTimeout(this.step_func(finish), 100);
                });
        }
    }


function finish() {
    assert_equals(read_request_count, read_success_count, "read counts");
    assert_equals(write_request_count, write_success_count, "write counts");
    this.done();
}
</script>

<div id=log></div>
