tor-browser

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

test_http_sfv.js (17551B)


      1 "use strict";
      2 
      3 const gService = Cc["@mozilla.org/http-sfv-service;1"].getService(
      4  Ci.nsISFVService
      5 );
      6 
      7 add_task(async function test_sfv_bare_item() {
      8  // tests bare item
      9  let item_int = gService.newInteger(19);
     10  Assert.equal(item_int.value, 19, "check bare item value");
     11 
     12  let item_bool = gService.newBool(true);
     13  Assert.equal(item_bool.value, true, "check bare item value");
     14  item_bool.value = false;
     15  Assert.equal(item_bool.value, false, "check bare item value");
     16 
     17  let item_float = gService.newDecimal(145.45);
     18  Assert.equal(item_float.value, 145.45);
     19 
     20  let item_str = gService.newString("some_string");
     21  Assert.equal(item_str.value, "some_string", "check bare item value");
     22 
     23  let item_byte_seq = gService.newByteSequence("aGVsbG8=");
     24  Assert.equal(item_byte_seq.value, "aGVsbG8=", "check bare item value");
     25 
     26  let item_token = gService.newToken("*a");
     27  Assert.equal(item_token.value, "*a", "check bare item value");
     28 });
     29 
     30 add_task(async function test_sfv_params() {
     31  // test params
     32  let params = gService.newParameters();
     33  let bool_param = gService.newBool(false);
     34  let int_param = gService.newInteger(15);
     35  let decimal_param = gService.newDecimal(15.45);
     36 
     37  params.set("bool_param", bool_param);
     38  params.set("int_param", int_param);
     39  params.set("decimal_param", decimal_param);
     40 
     41  Assert.throws(
     42    () => {
     43      params.get("some_param");
     44    },
     45    /NS_ERROR_UNEXPECTED/,
     46    "must throw exception as key does not exist in parameters"
     47  );
     48  Assert.equal(
     49    params.get("bool_param").QueryInterface(Ci.nsISFVBool).value,
     50    false,
     51    "get parameter by key and check its value"
     52  );
     53  Assert.equal(
     54    params.get("int_param").QueryInterface(Ci.nsISFVInteger).value,
     55    15,
     56    "get parameter by key and check its value"
     57  );
     58  Assert.equal(
     59    params.get("decimal_param").QueryInterface(Ci.nsISFVDecimal).value,
     60    15.45,
     61    "get parameter by key and check its value"
     62  );
     63  Assert.deepEqual(
     64    params.keys(),
     65    ["bool_param", "int_param", "decimal_param"],
     66    "check that parameters contain all the expected keys"
     67  );
     68 
     69  params.delete("int_param");
     70  Assert.deepEqual(
     71    params.keys(),
     72    ["bool_param", "decimal_param"],
     73    "check that parameter has been deleted"
     74  );
     75 
     76  Assert.throws(
     77    () => {
     78      params.delete("some_param");
     79    },
     80    /NS_ERROR_UNEXPECTED/,
     81    "must throw exception upon attempt to delete by non-existing key"
     82  );
     83 });
     84 
     85 add_task(async function test_sfv_inner_list() {
     86  // create primitives for inner list
     87  let item1_params = gService.newParameters();
     88  item1_params.set("param_1", gService.newToken("*smth"));
     89  let item1 = gService.newItem(gService.newDecimal(172.145865), item1_params);
     90 
     91  let item2_params = gService.newParameters();
     92  item2_params.set("param_1", gService.newBool(true));
     93  item2_params.set("param_2", gService.newInteger(145454));
     94  let item2 = gService.newItem(
     95    gService.newByteSequence("weather"),
     96    item2_params
     97  );
     98 
     99  // create inner list
    100  let inner_list_params = gService.newParameters();
    101  inner_list_params.set("inner_param", gService.newByteSequence("tests"));
    102  let inner_list = gService.newInnerList([item1, item2], inner_list_params);
    103 
    104  // check inner list members & params
    105  let inner_list_members = inner_list.QueryInterface(Ci.nsISFVInnerList).items;
    106  let inner_list_parameters = inner_list
    107    .QueryInterface(Ci.nsISFVInnerList)
    108    .params.QueryInterface(Ci.nsISFVParams);
    109  Assert.equal(inner_list_members.length, 2, "check inner list length");
    110 
    111  let inner_item1 = inner_list_members[0].QueryInterface(Ci.nsISFVItem);
    112  Assert.equal(
    113    inner_item1.value.QueryInterface(Ci.nsISFVDecimal).value,
    114    172.145865,
    115    "check inner list member value"
    116  );
    117 
    118  let inner_item2 = inner_list_members[1].QueryInterface(Ci.nsISFVItem);
    119  Assert.equal(
    120    inner_item2.value.QueryInterface(Ci.nsISFVByteSeq).value,
    121    "weather",
    122    "check inner list member value"
    123  );
    124 
    125  Assert.equal(
    126    inner_list_parameters.get("inner_param").QueryInterface(Ci.nsISFVByteSeq)
    127      .value,
    128    "tests",
    129    "get inner list parameter by key and check its value"
    130  );
    131 });
    132 
    133 add_task(async function test_sfv_item() {
    134  // create parameters for item
    135  let params = gService.newParameters();
    136  let param1 = gService.newBool(false);
    137  let param2 = gService.newString("str_value");
    138  let param3 = gService.newBool(true);
    139  params.set("param_1", param1);
    140  params.set("param_2", param2);
    141  params.set("param_3", param3);
    142 
    143  // create item field
    144  let item = gService.newItem(gService.newToken("*abc"), params);
    145 
    146  Assert.equal(
    147    item.value.QueryInterface(Ci.nsISFVToken).value,
    148    "*abc",
    149    "check items's value"
    150  );
    151  Assert.equal(
    152    item.params.get("param_1").QueryInterface(Ci.nsISFVBool).value,
    153    false,
    154    "get item parameter by key and check its value"
    155  );
    156  Assert.equal(
    157    item.params.get("param_2").QueryInterface(Ci.nsISFVString).value,
    158    "str_value",
    159    "get item parameter by key and check its value"
    160  );
    161  Assert.equal(
    162    item.params.get("param_3").QueryInterface(Ci.nsISFVBool).value,
    163    true,
    164    "get item parameter by key and check its value"
    165  );
    166 
    167  // check item field serialization
    168  let serialized = item.serialize();
    169  Assert.equal(
    170    serialized,
    171    `*abc;param_1=?0;param_2="str_value";param_3`,
    172    "serialized output must match expected one"
    173  );
    174 });
    175 
    176 add_task(async function test_sfv_list() {
    177  // create primitives for List
    178  let item1_params = gService.newParameters();
    179  item1_params.set("param_1", gService.newToken("*smth"));
    180  let item1 = gService.newItem(gService.newDecimal(145454.14568), item1_params);
    181 
    182  let item2_params = gService.newParameters();
    183  item2_params.set("param_1", gService.newBool(true));
    184  let item2 = gService.newItem(
    185    gService.newByteSequence("weather"),
    186    item2_params
    187  );
    188 
    189  let inner_list = gService.newInnerList(
    190    [item1, item2],
    191    gService.newParameters()
    192  );
    193 
    194  // create list field
    195  let list = gService.newList([item1, inner_list]);
    196 
    197  // check list's members
    198  let list_members = list.members;
    199  Assert.equal(list_members.length, 2, "check list length");
    200 
    201  // check list's member of item type
    202  let member1 = list_members[0].QueryInterface(Ci.nsISFVItem);
    203  Assert.equal(
    204    member1.value.QueryInterface(Ci.nsISFVDecimal).value,
    205    145454.14568,
    206    "check list member's value"
    207  );
    208  let member1_parameters = member1.params;
    209  Assert.equal(
    210    member1_parameters.get("param_1").QueryInterface(Ci.nsISFVToken).value,
    211    "*smth",
    212    "get list member's parameter by key and check its value"
    213  );
    214 
    215  // check list's member of inner list type
    216  let inner_list_members = list_members[1].QueryInterface(
    217    Ci.nsISFVInnerList
    218  ).items;
    219  Assert.equal(inner_list_members.length, 2, "check inner list length");
    220 
    221  let inner_item1 = inner_list_members[0].QueryInterface(Ci.nsISFVItem);
    222  Assert.equal(
    223    inner_item1.value.QueryInterface(Ci.nsISFVDecimal).value,
    224    145454.14568,
    225    "check inner list member's value"
    226  );
    227 
    228  let inner_item2 = inner_list_members[1].QueryInterface(Ci.nsISFVItem);
    229  Assert.equal(
    230    inner_item2.value.QueryInterface(Ci.nsISFVByteSeq).value,
    231    "weather",
    232    "check inner list member's value"
    233  );
    234 
    235  // check inner list member's params
    236  list_members[1]
    237    .QueryInterface(Ci.nsISFVInnerList)
    238    .params.QueryInterface(Ci.nsISFVParams);
    239 
    240  // check serialization of list field
    241  let expected_serialized =
    242    "145454.146;param_1=*smth, (145454.146;param_1=*smth :d2VhdGhlcg==:;param_1)";
    243  let actual_serialized = list.serialize();
    244  Assert.equal(
    245    actual_serialized,
    246    expected_serialized,
    247    "serialized output must match expected one"
    248  );
    249 });
    250 
    251 add_task(async function test_sfv_dictionary() {
    252  // create primitives for dictionary field
    253 
    254  // dict member1
    255  let params1 = gService.newParameters();
    256  params1.set("mp_1", gService.newBool(true));
    257  params1.set("mp_2", gService.newDecimal(68.758602));
    258  let member1 = gService.newItem(gService.newString("member_1"), params1);
    259 
    260  // dict member2
    261  let params2 = gService.newParameters();
    262  let inner_item1 = gService.newItem(
    263    gService.newString("inner_item_1"),
    264    gService.newParameters()
    265  );
    266  let inner_item2 = gService.newItem(
    267    gService.newToken("tok"),
    268    gService.newParameters()
    269  );
    270  let member2 = gService.newInnerList([inner_item1, inner_item2], params2);
    271 
    272  // dict member3
    273  let params_3 = gService.newParameters();
    274  params_3.set("mp_1", gService.newInteger(6586));
    275  let member3 = gService.newItem(gService.newString("member_3"), params_3);
    276 
    277  // create dictionary field
    278  let dict = gService.newDictionary();
    279  dict.set("key_1", member1);
    280  dict.set("key_2", member2);
    281  dict.set("key_3", member3);
    282 
    283  // check dictionary keys
    284  let expected = ["key_1", "key_2", "key_3"];
    285  Assert.deepEqual(
    286    expected,
    287    dict.keys(),
    288    "check dictionary contains all the expected keys"
    289  );
    290 
    291  // check dictionary members
    292  Assert.throws(
    293    () => {
    294      dict.get("key_4");
    295    },
    296    /NS_ERROR_UNEXPECTED/,
    297    "must throw exception as key does not exist in dictionary"
    298  );
    299 
    300  // let dict_member1 = dict.get("key_1").QueryInterface(Ci.nsISFVItem);
    301  let dict_member2 = dict.get("key_2").QueryInterface(Ci.nsISFVInnerList);
    302  let dict_member3 = dict.get("key_3").QueryInterface(Ci.nsISFVItem);
    303 
    304  // Assert.equal(
    305  //   dict_member1.value.QueryInterface(Ci.nsISFVString).value,
    306  //   "member_1",
    307  //   "check dictionary member's value"
    308  // );
    309  // Assert.equal(
    310  //   dict_member1.params.get("mp_1").QueryInterface(Ci.nsISFVBool).value,
    311  //   true,
    312  //   "get dictionary member's parameter by key and check its value"
    313  // );
    314  // Assert.equal(
    315  //   dict_member1.params.get("mp_2").QueryInterface(Ci.nsISFVDecimal).value,
    316  //   "68.758602",
    317  //   "get dictionary member's parameter by key and check its value"
    318  // );
    319 
    320  let dict_member2_items = dict_member2.QueryInterface(
    321    Ci.nsISFVInnerList
    322  ).items;
    323  let dict_member2_params = dict_member2
    324    .QueryInterface(Ci.nsISFVInnerList)
    325    .params.QueryInterface(Ci.nsISFVParams);
    326  Assert.equal(
    327    dict_member2_items[0]
    328      .QueryInterface(Ci.nsISFVItem)
    329      .value.QueryInterface(Ci.nsISFVString).value,
    330    "inner_item_1",
    331    "get dictionary member of inner list type, and check inner list member's value"
    332  );
    333  Assert.equal(
    334    dict_member2_items[1]
    335      .QueryInterface(Ci.nsISFVItem)
    336      .value.QueryInterface(Ci.nsISFVToken).value,
    337    "tok",
    338    "get dictionary member of inner list type, and check inner list member's value"
    339  );
    340  Assert.throws(
    341    () => {
    342      dict_member2_params.get("some_param");
    343    },
    344    /NS_ERROR_UNEXPECTED/,
    345    "must throw exception as dict member's parameters are empty"
    346  );
    347 
    348  Assert.equal(
    349    dict_member3.value.QueryInterface(Ci.nsISFVString).value,
    350    "member_3",
    351    "check dictionary member's value"
    352  );
    353  Assert.equal(
    354    dict_member3.params.get("mp_1").QueryInterface(Ci.nsISFVInteger).value,
    355    6586,
    356    "get dictionary member's parameter by key and check its value"
    357  );
    358 
    359  // check serialization of Dictionary field
    360  let expected_serialized = `key_1="member_1";mp_1;mp_2=68.759, key_2=("inner_item_1" tok), key_3="member_3";mp_1=6586`;
    361  let actual_serialized = dict.serialize();
    362  Assert.equal(
    363    actual_serialized,
    364    expected_serialized,
    365    "serialized output must match expected one"
    366  );
    367 
    368  // check deleting dict member
    369  dict.delete("key_2");
    370  Assert.deepEqual(
    371    dict.keys(),
    372    ["key_1", "key_3"],
    373    "check that dictionary member has been deleted"
    374  );
    375 
    376  Assert.throws(
    377    () => {
    378      dict.delete("some_key");
    379    },
    380    /NS_ERROR_UNEXPECTED/,
    381    "must throw exception upon attempt to delete by non-existing key"
    382  );
    383 });
    384 
    385 add_task(async function test_sfv_item_parsing() {
    386  Assert.ok(gService.parseItem(`"str"`), "input must be parsed into Item");
    387  Assert.ok(gService.parseItem("12.35;a "), "input must be parsed into Item");
    388  Assert.ok(gService.parseItem("12.35;  a "), "input must be parsed into Item");
    389  Assert.ok(gService.parseItem("12.35    "), "input must be parsed into Item");
    390 
    391  Assert.throws(
    392    () => {
    393      gService.parseItem("12.35;\ta ");
    394    },
    395    /NS_ERROR_FAILURE/,
    396    "item parsing must fail: invalid parameters delimiter"
    397  );
    398 
    399  Assert.throws(
    400    () => {
    401      gService.parseItem("125666.3565648855455");
    402    },
    403    /NS_ERROR_FAILURE/,
    404    "item parsing must fail: decimal too long"
    405  );
    406 });
    407 
    408 add_task(async function test_sfv_list_parsing() {
    409  Assert.ok(
    410    gService.parseList(
    411      "(?1;param_1=*smth   :d2VhdGhlcg==:;param_1;param_2=145454);inner_param=:d2VpcmR0ZXN0cw==:"
    412    ),
    413    "input must be parsed into List"
    414  );
    415  Assert.ok("a, (b c)", "input must be parsed into List");
    416 
    417  Assert.throws(() => {
    418    gService.parseList("?tok", "list parsing must fail");
    419  }, /NS_ERROR_FAILURE/);
    420 
    421  Assert.throws(() => {
    422    gService.parseList(
    423      "a, (b, c)",
    424      "list parsing must fail: invalid delimiter within inner list"
    425    );
    426  }, /NS_ERROR_FAILURE/);
    427 
    428  Assert.throws(
    429    () => {
    430      gService.parseList("a, b c");
    431    },
    432    /NS_ERROR_FAILURE/,
    433    "list parsing must fail: invalid delimiter"
    434  );
    435 });
    436 
    437 add_task(async function test_sfv_dict_parsing() {
    438  Assert.ok(
    439    gService.parseDictionary(`abc=123;a=1;b=2, def=456, ghi=789;q=9;r="+w"`),
    440    "input must be parsed into Dictionary"
    441  );
    442  Assert.ok(
    443    gService.parseDictionary("a=1\t,\t\t\t   c=*"),
    444    "input must be parsed into Dictionary"
    445  );
    446  Assert.ok(
    447    gService.parseDictionary("a=1\t,\tc=*    \t\t"),
    448    "input must be parsed into Dictionary"
    449  );
    450 
    451  Assert.throws(
    452    () => {
    453      gService.parseDictionary("a=1\t,\tc=*,");
    454    },
    455    /NS_ERROR_FAILURE/,
    456    "dictionary parsing must fail: trailing comma"
    457  );
    458 
    459  Assert.throws(
    460    () => {
    461      gService.parseDictionary("a=1 c=*");
    462    },
    463    /NS_ERROR_FAILURE/,
    464    "dictionary parsing must fail: invalid delimiter"
    465  );
    466 
    467  Assert.throws(
    468    () => {
    469      gService.parseDictionary("INVALID_key=1, c=*");
    470    },
    471    /NS_ERROR_FAILURE/,
    472    "dictionary parsing must fail: invalid key format, can't be in uppercase"
    473  );
    474 });
    475 
    476 add_task(async function test_sfv_list_parse_serialize() {
    477  let list_field = gService.parseList("1  ,  42, (42 43)");
    478  Assert.equal(
    479    list_field.serialize(),
    480    "1, 42, (42 43)",
    481    "serialized output must match expected one"
    482  );
    483 
    484  // create new inner list with parameters
    485  function params() {
    486    let inner_list_params = gService.newParameters();
    487    inner_list_params.set("key1", gService.newString("value1"));
    488    inner_list_params.set("key2", gService.newBool(true));
    489    inner_list_params.set("key3", gService.newBool(false));
    490    return inner_list_params;
    491  }
    492 
    493  function changeMembers() {
    494    // set one of list members to inner list and check it's serialized as expected
    495    let members = list_field.members;
    496    members[1] = gService.newInnerList(
    497      [
    498        gService.newItem(
    499          gService.newDecimal(-1865.75653),
    500          gService.newParameters()
    501        ),
    502        gService.newItem(gService.newToken("token"), gService.newParameters()),
    503        gService.newItem(
    504          gService.newString(`no"yes`),
    505          gService.newParameters()
    506        ),
    507      ],
    508      params()
    509    );
    510    return members;
    511  }
    512 
    513  list_field.members = changeMembers();
    514 
    515  Assert.equal(
    516    list_field.serialize(),
    517    `1, (-1865.757 token "no\\"yes");key1="value1";key2;key3=?0, (42 43)`,
    518    "update list member and check list is serialized as expected"
    519  );
    520 });
    521 
    522 add_task(async function test_sfv_dict_parse_serialize() {
    523  let dict_field = gService.parseDictionary(
    524    "a=1,     b; foo=*, \tc=3, \t     \tabc=123;a=1;b=2\t"
    525  );
    526  Assert.equal(
    527    dict_field.serialize(),
    528    "a=1, b;foo=*, c=3, abc=123;a=1;b=2",
    529    "serialized output must match expected one"
    530  );
    531 
    532  // set new value for existing dict's key
    533  dict_field.set(
    534    "a",
    535    gService.newItem(gService.newInteger(165), gService.newParameters())
    536  );
    537 
    538  // add new member to dict
    539  dict_field.set(
    540    "key",
    541    gService.newItem(gService.newDecimal(45.0), gService.newParameters())
    542  );
    543 
    544  // check dict is serialized properly after the above changes
    545  Assert.equal(
    546    dict_field.serialize(),
    547    "a=165, b;foo=*, c=3, abc=123;a=1;b=2, key=45.0",
    548    "update dictionary members and dictionary list is serialized as expected"
    549  );
    550 });
    551 
    552 add_task(async function test_sfv_list_parse_more() {
    553  // check parsing of multiline header of List type
    554  let list_field = gService.parseList("(12 abc), 12.456\t\t   ");
    555  list_field.parseMore("11, 15, tok");
    556  Assert.equal(
    557    list_field.serialize(),
    558    "(12 abc), 12.456, 11, 15, tok",
    559    "multi-line field value parsed and serialized successfully"
    560  );
    561 
    562  // should fail parsing one more line
    563  Assert.throws(
    564    () => {
    565      list_field.parseMore("(tk\t1)");
    566    },
    567    /NS_ERROR_FAILURE/,
    568    "line parsing must fail: invalid delimiter in inner list"
    569  );
    570  Assert.equal(
    571    list_field.serialize(),
    572    "(12 abc), 12.456, 11, 15, tok",
    573    "parsed value must not change if parsing one more line of header fails"
    574  );
    575 });
    576 
    577 add_task(async function test_sfv_dict_parse_more() {
    578  // check parsing of multiline header of Dictionary type
    579  let dict_field = gService.parseDictionary("");
    580  dict_field.parseMore("key2=?0, key3=?1, key4=itm");
    581  dict_field.parseMore("key1,    key5=11, key4=45");
    582 
    583  Assert.equal(
    584    dict_field.serialize(),
    585    "key2=?0, key3, key4=45, key1, key5=11",
    586    "multi-line field value parsed and serialized successfully"
    587  );
    588 
    589  // should fail parsing one more line
    590  Assert.throws(
    591    () => {
    592      dict_field.parseMore("c=12, _k=13");
    593    },
    594    /NS_ERROR_FAILURE/,
    595    "line parsing must fail: invalid key format"
    596  );
    597 });