summaryrefslogtreecommitdiffstats
path: root/toolkit/components/places/tests/unit/test_origins_parsing.js
blob: 8372e9fb66062fa5708d9d48b230d44a0eeb11b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

// This test is a companion to test_origins.js.  It adds many URLs to the
// database and makes sure that their prefixes and hosts are correctly parsed.
// This test can take a while to run, which is why it's split out from
// test_origins.js.

"use strict";

add_task(async function parsing() {
  let prefixes = ["http://", "https://", "ftp://", "foo://", "bar:"];

  let userinfos = ["", "user:pass@", "user:pass:word@", "user:@"];

  let ports = ["", ":8888"];

  let paths = [
    "",

    "/",
    "/1",
    "/1/2",

    "?",
    "?1",
    "#",
    "#1",

    "/?",
    "/1?",
    "/?1",
    "/1?2",

    "/#",
    "/1#",
    "/#1",
    "/1#2",

    "/?#",
    "/1?#",
    "/?1#",
    "/?#1",
    "/1?2#",
    "/1?#2",
    "/?1#2",
  ];

  for (let userinfo of userinfos) {
    for (let port of ports) {
      for (let path of paths) {
        info(`Testing userinfo='${userinfo}' port='${port}' path='${path}'`);
        let expectedOrigins = prefixes.map(prefix => [
          prefix,
          "example.com" + port,
        ]);
        let uris = expectedOrigins.map(
          ([prefix, hostPort]) => prefix + userinfo + hostPort + path
        );

        await PlacesTestUtils.addVisits(uris.map(uri => ({ uri })));
        await checkDB(expectedOrigins);

        // Remove each URI, one at a time, and make sure the remaining origins
        // in the database are correct.
        for (let i = 0; i < uris.length; i++) {
          await PlacesUtils.history.remove(uris[i]);

          let uri = Services.io.newURI(uris[i]);
          if (uri.hasUserPass) {
            // The history cannot be deleted at a URL with a user path.
          } else {
            expectedOrigins = expectedOrigins.filter(
              ([prefix]) => !prefix.startsWith(uri.scheme + ":")
            );
          }
          await checkDB(expectedOrigins);
        }
        await cleanUp();
      }
    }
  }
  await checkDB([]);
});

/**
 * Asserts that the moz_origins table is correct.
 *
 * @param expectedOrigins
 *        An array of expected origins.  Each origin in the array is itself an
 *        array that looks like this: [prefix, host]
 */
async function checkDB(expectedOrigins) {
  let db = await PlacesUtils.promiseDBConnection();
  let rows = await db.execute(`
    SELECT prefix, host
    FROM moz_origins
    ORDER BY id ASC
  `);
  let actualOrigins = rows.map(row => {
    let o = [];
    for (let c = 0; c < 2; c++) {
      o.push(row.getResultByIndex(c));
    }
    return o;
  });
  Assert.deepEqual(actualOrigins, expectedOrigins);
}

async function cleanUp() {
  await PlacesUtils.bookmarks.eraseEverything();
  await PlacesUtils.history.clear();
}