tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

test_multientry.js (7222B)


      1 /**
      2 * Any copyright is dedicated to the Public Domain.
      3 * http://creativecommons.org/publicdomain/zero/1.0/
      4 */
      5 
      6 /* exported testGenerator */
      7 var testGenerator = testSteps();
      8 
      9 function* testSteps() {
     10  // Test object stores
     11 
     12  let name = this.window ? window.location.pathname : "Splendid Test";
     13  let openRequest = indexedDB.open(name, 1);
     14  openRequest.onerror = errorHandler;
     15  openRequest.onupgradeneeded = grabEventAndContinueHandler;
     16  openRequest.onsuccess = unexpectedSuccessHandler;
     17  let event = yield undefined;
     18  let db = event.target.result;
     19  db.onerror = errorHandler;
     20  let tests = [
     21    { add: { x: 1, id: 1 }, indexes: [{ v: 1, k: 1 }] },
     22    {
     23      add: { x: [2, 3], id: 2 },
     24      indexes: [
     25        { v: 1, k: 1 },
     26        { v: 2, k: 2 },
     27        { v: 3, k: 2 },
     28      ],
     29    },
     30    {
     31      put: { x: [2, 4], id: 1 },
     32      indexes: [
     33        { v: 2, k: 1 },
     34        { v: 2, k: 2 },
     35        { v: 3, k: 2 },
     36        { v: 4, k: 1 },
     37      ],
     38    },
     39    {
     40      add: { x: [5, 6, 5, -2, 3], id: 3 },
     41      indexes: [
     42        { v: -2, k: 3 },
     43        { v: 2, k: 1 },
     44        { v: 2, k: 2 },
     45        { v: 3, k: 2 },
     46        { v: 3, k: 3 },
     47        { v: 4, k: 1 },
     48        { v: 5, k: 3 },
     49        { v: 6, k: 3 },
     50      ],
     51    },
     52    { delete: IDBKeyRange.bound(1, 3), indexes: [] },
     53    {
     54      put: { x: ["food", {}, false, undefined, /x/, [73, false]], id: 2 },
     55      indexes: [{ v: "food", k: 2 }],
     56    },
     57    {
     58      add: { x: [{}, /x/, -12, "food", null, [false], undefined], id: 3 },
     59      indexes: [
     60        { v: -12, k: 3 },
     61        { v: "food", k: 2 },
     62        { v: "food", k: 3 },
     63      ],
     64    },
     65    {
     66      put: { x: [], id: 2 },
     67      indexes: [
     68        { v: -12, k: 3 },
     69        { v: "food", k: 3 },
     70      ],
     71    },
     72    { put: { x: { y: 3 }, id: 3 }, indexes: [] },
     73    { add: { x: false, id: 7 }, indexes: [] },
     74    { delete: IDBKeyRange.lowerBound(0), indexes: [] },
     75  ];
     76 
     77  let store = db.createObjectStore("mystore", { keyPath: "id" });
     78  let index = store.createIndex("myindex", "x", { multiEntry: true });
     79  is(index.multiEntry, true, "index created with multiEntry");
     80 
     81  let i;
     82  for (i = 0; i < tests.length; ++i) {
     83    let test = tests[i];
     84    let testName = " for " + JSON.stringify(test);
     85    let req;
     86    if (test.add) {
     87      req = store.add(test.add);
     88    } else if (test.put) {
     89      req = store.put(test.put);
     90    } else if (test.delete) {
     91      req = store.delete(test.delete);
     92    } else {
     93      ok(false, "borked test");
     94    }
     95    req.onsuccess = grabEventAndContinueHandler;
     96    yield undefined;
     97 
     98    req = index.openKeyCursor();
     99    req.onsuccess = grabEventAndContinueHandler;
    100    for (let j = 0; j < test.indexes.length; ++j) {
    101      yield undefined;
    102      is(
    103        req.result.key,
    104        test.indexes[j].v,
    105        "found expected index key at index " + j + testName
    106      );
    107      is(
    108        req.result.primaryKey,
    109        test.indexes[j].k,
    110        "found expected index primary key at index " + j + testName
    111      );
    112      req.result.continue();
    113    }
    114    yield undefined;
    115    ok(req.result == null, "exhausted indexes");
    116 
    117    let tempIndex = store.createIndex("temp index", "x", { multiEntry: true });
    118    req = tempIndex.openKeyCursor();
    119    req.onsuccess = grabEventAndContinueHandler;
    120    for (let j = 0; j < test.indexes.length; ++j) {
    121      yield undefined;
    122      is(
    123        req.result.key,
    124        test.indexes[j].v,
    125        "found expected temp index key at index " + j + testName
    126      );
    127      is(
    128        req.result.primaryKey,
    129        test.indexes[j].k,
    130        "found expected temp index primary key at index " + j + testName
    131      );
    132      req.result.continue();
    133    }
    134    yield undefined;
    135    ok(req.result == null, "exhausted temp index");
    136    store.deleteIndex("temp index");
    137  }
    138 
    139  // Unique indexes
    140  tests = [
    141    { add: { x: 1, id: 1 }, indexes: [{ v: 1, k: 1 }] },
    142    {
    143      add: { x: [2, 3], id: 2 },
    144      indexes: [
    145        { v: 1, k: 1 },
    146        { v: 2, k: 2 },
    147        { v: 3, k: 2 },
    148      ],
    149    },
    150    { put: { x: [2, 4], id: 3 }, fail: true },
    151    {
    152      put: { x: [1, 4], id: 1 },
    153      indexes: [
    154        { v: 1, k: 1 },
    155        { v: 2, k: 2 },
    156        { v: 3, k: 2 },
    157        { v: 4, k: 1 },
    158      ],
    159    },
    160    {
    161      add: { x: [5, 0, 5, 5, 5], id: 3 },
    162      indexes: [
    163        { v: 0, k: 3 },
    164        { v: 1, k: 1 },
    165        { v: 2, k: 2 },
    166        { v: 3, k: 2 },
    167        { v: 4, k: 1 },
    168        { v: 5, k: 3 },
    169      ],
    170    },
    171    {
    172      delete: IDBKeyRange.bound(1, 2),
    173      indexes: [
    174        { v: 0, k: 3 },
    175        { v: 5, k: 3 },
    176      ],
    177    },
    178    { add: { x: [0, 6], id: 8 }, fail: true },
    179    { add: { x: 5, id: 8 }, fail: true },
    180    { put: { x: 0, id: 8 }, fail: true },
    181  ];
    182 
    183  store.deleteIndex("myindex");
    184  index = store.createIndex("myindex", "x", { multiEntry: true, unique: true });
    185  is(index.multiEntry, true, "index created with multiEntry");
    186 
    187  let indexes;
    188  for (i = 0; i < tests.length; ++i) {
    189    let test = tests[i];
    190    let testName = " for " + JSON.stringify(test);
    191    let req;
    192    if (test.add) {
    193      req = store.add(test.add);
    194    } else if (test.put) {
    195      req = store.put(test.put);
    196    } else if (test.delete) {
    197      req = store.delete(test.delete);
    198    } else {
    199      ok(false, "borked test");
    200    }
    201 
    202    if (!test.fail) {
    203      req.onsuccess = grabEventAndContinueHandler;
    204      yield undefined;
    205      indexes = test.indexes;
    206    } else {
    207      req.onsuccess = unexpectedSuccessHandler;
    208      req.onerror = grabEventAndContinueHandler;
    209      ok(true, "waiting for error");
    210      let e = yield undefined;
    211      ok(true, "got error: " + e.type);
    212      e.preventDefault();
    213      e.stopPropagation();
    214    }
    215 
    216    req = index.openKeyCursor();
    217    req.onsuccess = grabEventAndContinueHandler;
    218    for (let j = 0; j < indexes.length; ++j) {
    219      yield undefined;
    220      is(
    221        req.result.key,
    222        indexes[j].v,
    223        "found expected index key at index " + j + testName
    224      );
    225      is(
    226        req.result.primaryKey,
    227        indexes[j].k,
    228        "found expected index primary key at index " + j + testName
    229      );
    230      req.result.continue();
    231    }
    232    yield undefined;
    233    ok(req.result == null, "exhausted indexes");
    234 
    235    let tempIndex = store.createIndex("temp index", "x", {
    236      multiEntry: true,
    237      unique: true,
    238    });
    239    req = tempIndex.openKeyCursor();
    240    req.onsuccess = grabEventAndContinueHandler;
    241    for (let j = 0; j < indexes.length; ++j) {
    242      yield undefined;
    243      is(
    244        req.result.key,
    245        indexes[j].v,
    246        "found expected temp index key at index " + j + testName
    247      );
    248      is(
    249        req.result.primaryKey,
    250        indexes[j].k,
    251        "found expected temp index primary key at index " + j + testName
    252      );
    253      req.result.continue();
    254    }
    255    yield undefined;
    256    ok(req.result == null, "exhausted temp index");
    257    store.deleteIndex("temp index");
    258  }
    259 
    260  openRequest.onsuccess = grabEventAndContinueHandler;
    261  yield undefined;
    262 
    263  let trans = db.transaction(["mystore"], "readwrite");
    264  store = trans.objectStore("mystore");
    265  index = store.index("myindex");
    266  is(index.multiEntry, true, "index still is multiEntry");
    267  trans.oncomplete = grabEventAndContinueHandler;
    268  yield undefined;
    269 
    270  finishTest();
    271 }