storage/test/unit/test_statement_wrapper_automatically.js

Tue, 06 Jan 2015 21:39:09 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 06 Jan 2015 21:39:09 +0100
branch
TOR_BUG_9701
changeset 8
97036ab72558
permissions
-rw-r--r--

Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
     2    vim:set ts=2 sw=2 sts=2 et:
     3  * This Source Code Form is subject to the terms of the Mozilla Public
     4  * License, v. 2.0. If a copy of the MPL was not distributed with this
     5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     7 // This file tests the functions of mozIStorageStatementWrapper
     9 function setup()
    10 {
    11   getOpenedDatabase().createTable("test", "id INTEGER PRIMARY KEY, val NONE," +
    12                                           "alt_val NONE");
    13 }
    15 /**
    16  * A convenience wrapper for do_check_eq.  Calls do_check_eq on aActualVal
    17  * and aReturnedVal, with one caveat.
    18  *
    19  * Date objects are converted before parameter binding to PRTime's (microsecs
    20  * since epoch).  They are not reconverted when retrieved from the database.
    21  * This function abstracts away this reconversion so that you can pass in,
    22  * for example:
    23  *
    24  *   checkVal(new Date(), aReturnedVal)                    // this
    25  *   checkVal(new Date().valueOf() * 1000.0, aReturnedVal) // instead of this
    26  *
    27  * Should any other types require conversion in the future, their conversions
    28  * may also be abstracted away here.
    29  *
    30  * @param aActualVal
    31  *        the value inserted into the database
    32  * @param aReturnedVal
    33  *        the value retrieved from the database
    34  */
    35 function checkVal(aActualVal, aReturnedVal)
    36 {
    37   if (aActualVal instanceof Date) aActualVal = aActualVal.valueOf() * 1000.0;
    38   do_check_eq(aActualVal, aReturnedVal);
    39 }
    41 /**
    42  * Removes all rows from our test table.
    43  */
    44 function clearTable()
    45 {
    46   var stmt = createStatement("DELETE FROM test");
    47   stmt.execute();
    48   stmt.finalize();
    49   ensureNumRows(0);
    50 }
    52 /**
    53  * Ensures that the number of rows in our test table is equal to aNumRows.
    54  * Calls do_check_eq on aNumRows and the value retrieved by SELECT'ing COUNT(*).
    55  *
    56  * @param aNumRows
    57  *        the number of rows our test table should contain
    58  */
    59 function ensureNumRows(aNumRows)
    60 {
    61   var stmt = createStatement("SELECT COUNT(*) AS number FROM test");
    62   do_check_true(stmt.step());
    63   do_check_eq(aNumRows, stmt.row.number);
    64   stmt.reset();
    65   stmt.finalize();
    66 }
    68 /**
    69  * Inserts aVal into our test table and checks that insertion was successful by
    70  * retrieving the newly inserted value from the database and comparing it
    71  * against aVal.  aVal is bound to a single parameter.
    72  *
    73  * @param aVal
    74  *        value to insert into our test table and check
    75  */
    76 function insertAndCheckSingleParam(aVal)
    77 {
    78   clearTable();
    80   var stmt = createStatement("INSERT INTO test (val) VALUES (:val)");
    81   stmt.params.val = aVal;
    82   stmt.execute();
    83   stmt.finalize();
    85   ensureNumRows(1);
    87   stmt = createStatement("SELECT val FROM test WHERE id = 1");
    88   do_check_true(stmt.step());
    89   checkVal(aVal, stmt.row.val);
    90   stmt.reset();
    91   stmt.finalize();
    92 }
    94 /**
    95  * Inserts aVal into our test table and checks that insertion was successful by
    96  * retrieving the newly inserted value from the database and comparing it
    97  * against aVal.  aVal is bound to two separate parameters, both of which are
    98  * checked against aVal.
    99  *
   100  * @param aVal
   101  *        value to insert into our test table and check
   102  */
   103 function insertAndCheckMultipleParams(aVal)
   104 {
   105   clearTable();
   107   var stmt = createStatement("INSERT INTO test (val, alt_val) " +
   108                              "VALUES (:val, :val)");
   109   stmt.params.val = aVal;
   110   stmt.execute();
   111   stmt.finalize();
   113   ensureNumRows(1);
   115   stmt = createStatement("SELECT val, alt_val FROM test WHERE id = 1");
   116   do_check_true(stmt.step());
   117   checkVal(aVal, stmt.row.val);
   118   checkVal(aVal, stmt.row.alt_val);
   119   stmt.reset();
   120   stmt.finalize();
   121 }
   123 /**
   124  * A convenience function that prints out a description of aVal using
   125  * aVal.toString and aVal.toSource.  Output is useful when the test fails.
   126  *
   127  * @param aVal
   128  *        a value inserted or to be inserted into our test table
   129  */
   130 function printValDesc(aVal)
   131 {
   132   try
   133   {
   134     var toSource = aVal.toSource();
   135   }
   136   catch (exc)
   137   {
   138     toSource = "";
   139   }
   140   print("Testing value: toString=" + aVal +
   141         (toSource ? " toSource=" + toSource : ""));
   142 }
   144 function run_test()
   145 {
   146   setup();
   148   // function JSValStorageStatementBinder in
   149   // storage/src/mozStorageStatementParams.cpp tells us that the following types
   150   // and only the following types are valid as statement parameters:
   151   var vals = [
   152     1337,       // int
   153     3.1337,     // double
   154     "foo",      // string
   155     true,       // boolean
   156     null,       // null
   157     new Date(), // Date object
   158   ];
   160   vals.forEach(function (val)
   161   {
   162     printValDesc(val);
   163     print("Single parameter");
   164     insertAndCheckSingleParam(val);
   165     print("Multiple parameters");
   166     insertAndCheckMultipleParams(val)
   167   });
   169   cleanup();
   170 }

mercurial