summaryrefslogtreecommitdiffstats
path: root/toolkit/components/places/tests/bookmarks/test_1016953-renaming-uncompressed.js
blob: 3f74430296134a1e5ccfe0b85b3824fe4bfe5e1b (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
114
115
116
117
118
119
/* Bug 1016953 - When a previous bookmark backup exists with the same hash
regardless of date, an automatic backup should attempt to either rename it to
today's date if the backup was for an old date or leave it alone if it was for
the same date. However if the file ext was json it will accidentally rename it
to jsonlz4 while keeping the json contents
*/

add_task(async function test_same_date_same_hash() {
  // If old file has been created on the same date and has the same hash
  // the file should be left alone
  let backupFolder = await PlacesBackups.getBackupFolder();
  // Save to profile dir to obtain hash and nodeCount to append to filename
  let tempPath = PathUtils.join(
    PathUtils.profileDir,
    "bug10169583_bookmarks.json"
  );
  let { count, hash } = await BookmarkJSONUtils.exportToFile(tempPath);

  // Save JSON file in backup folder with hash appended
  let dateObj = new Date();
  let filename =
    "bookmarks-" +
    PlacesBackups.toISODateString(dateObj) +
    "_" +
    count +
    "_" +
    hash +
    ".json";
  let backupFile = PathUtils.join(backupFolder, filename);
  await IOUtils.move(tempPath, backupFile);

  // Force a compressed backup which fallbacks to rename
  await PlacesBackups.create();
  let mostRecentBackupFile = await PlacesBackups.getMostRecentBackup();
  // check to ensure not renamed to jsonlz4
  Assert.equal(mostRecentBackupFile, backupFile);
  // inspect contents and check if valid json
  info("Check is valid JSON");
  // We initially wrote an uncompressed file, and although a backup was triggered
  // it did not rewrite the file, so this is uncompressed.
  await IOUtils.readJSON(mostRecentBackupFile);

  // Cleanup
  await IOUtils.remove(backupFile);
  await IOUtils.remove(tempPath);
  PlacesBackups._backupFiles = null; // To force re-cache of backupFiles
});

add_task(async function test_same_date_diff_hash() {
  // If the old file has been created on the same date, but has a different hash
  // the existing file should be overwritten with the newer compressed version
  let backupFolder = await PlacesBackups.getBackupFolder();
  let tempPath = PathUtils.join(
    PathUtils.profileDir,
    "bug10169583_bookmarks.json"
  );
  let { count } = await BookmarkJSONUtils.exportToFile(tempPath);
  let dateObj = new Date();
  let filename =
    "bookmarks-" +
    PlacesBackups.toISODateString(dateObj) +
    "_" +
    count +
    "_differentHash==.json";
  let backupFile = PathUtils.join(backupFolder, filename);
  await IOUtils.move(tempPath, backupFile);
  await PlacesBackups.create(); // Force compressed backup
  let mostRecentBackupFile = await PlacesBackups.getMostRecentBackup();

  // Decode lz4 compressed file to json and check if json is valid
  info("Check is valid JSON");
  await IOUtils.readJSON(mostRecentBackupFile, { decompress: true });

  // Cleanup
  await IOUtils.remove(mostRecentBackupFile);
  await IOUtils.remove(tempPath);
  PlacesBackups._backupFiles = null; // To force re-cache of backupFiles
});

add_task(async function test_diff_date_same_hash() {
  // If the old file has been created on an older day but has the same hash
  // it should be renamed with today's date without altering the contents.
  let backupFolder = await PlacesBackups.getBackupFolder();
  let tempPath = PathUtils.join(
    PathUtils.profileDir,
    "bug10169583_bookmarks.json"
  );
  let { count, hash } = await BookmarkJSONUtils.exportToFile(tempPath);
  let oldDate = new Date(2014, 1, 1);
  let curDate = new Date();
  let oldFilename =
    "bookmarks-" +
    PlacesBackups.toISODateString(oldDate) +
    "_" +
    count +
    "_" +
    hash +
    ".json";
  let newFilename =
    "bookmarks-" +
    PlacesBackups.toISODateString(curDate) +
    "_" +
    count +
    "_" +
    hash +
    ".json";
  let backupFile = PathUtils.join(backupFolder, oldFilename);
  let newBackupFile = PathUtils.join(backupFolder, newFilename);
  await IOUtils.move(tempPath, backupFile);

  // Ensure file has been renamed correctly
  await PlacesBackups.create();
  let mostRecentBackupFile = await PlacesBackups.getMostRecentBackup();
  Assert.equal(mostRecentBackupFile, newBackupFile);

  // Cleanup
  await IOUtils.remove(mostRecentBackupFile);
  await IOUtils.remove(tempPath);
});