forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			132 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* Any copyright is dedicated to the Public Domain.
 | |
| https://creativecommons.org/publicdomain/zero/1.0/ */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| const { PreferencesBackupResource } = ChromeUtils.importESModule(
 | |
|   "resource:///modules/backup/PreferencesBackupResource.sys.mjs"
 | |
| );
 | |
| 
 | |
| /**
 | |
|  * Test that the measure method correctly collects the disk-sizes of things that
 | |
|  * the PreferencesBackupResource is meant to back up.
 | |
|  */
 | |
| add_task(async function test_measure() {
 | |
|   Services.fog.testResetFOG();
 | |
| 
 | |
|   const EXPECTED_PREFERENCES_KILOBYTES_SIZE = 415;
 | |
|   const tempDir = await IOUtils.createUniqueDirectory(
 | |
|     PathUtils.tempDir,
 | |
|     "PreferencesBackupResource-measure-test"
 | |
|   );
 | |
|   const mockFiles = [
 | |
|     { path: "prefs.js", sizeInKB: 20 },
 | |
|     { path: "xulstore.json", sizeInKB: 1 },
 | |
|     { path: "permissions.sqlite", sizeInKB: 100 },
 | |
|     { path: "content-prefs.sqlite", sizeInKB: 260 },
 | |
|     { path: "containers.json", sizeInKB: 1 },
 | |
|     { path: "handlers.json", sizeInKB: 1 },
 | |
|     { path: "search.json.mozlz4", sizeInKB: 1 },
 | |
|     { path: "user.js", sizeInKB: 2 },
 | |
|     { path: ["chrome", "userChrome.css"], sizeInKB: 5 },
 | |
|     { path: ["chrome", "userContent.css"], sizeInKB: 5 },
 | |
|     { path: ["chrome", "css", "mockStyles.css"], sizeInKB: 5 },
 | |
|   ];
 | |
| 
 | |
|   await createTestFiles(tempDir, mockFiles);
 | |
| 
 | |
|   let preferencesBackupResource = new PreferencesBackupResource();
 | |
| 
 | |
|   await preferencesBackupResource.measure(tempDir);
 | |
| 
 | |
|   let measurement = Glean.browserBackup.preferencesSize.testGetValue();
 | |
|   let scalars = TelemetryTestUtils.getProcessScalars("parent", false, false);
 | |
| 
 | |
|   TelemetryTestUtils.assertScalar(
 | |
|     scalars,
 | |
|     "browser.backup.preferences_size",
 | |
|     measurement,
 | |
|     "Glean and telemetry measurements for preferences data should be equal"
 | |
|   );
 | |
|   Assert.equal(
 | |
|     measurement,
 | |
|     EXPECTED_PREFERENCES_KILOBYTES_SIZE,
 | |
|     "Should have collected the correct glean measurement for preferences files"
 | |
|   );
 | |
| 
 | |
|   await maybeRemovePath(tempDir);
 | |
| });
 | |
| 
 | |
| /**
 | |
|  * Test that the backup method correctly copies items from the profile directory
 | |
|  * into the staging directory.
 | |
|  */
 | |
| add_task(async function test_backup() {
 | |
|   let sandbox = sinon.createSandbox();
 | |
| 
 | |
|   let preferencesBackupResource = new PreferencesBackupResource();
 | |
|   let sourcePath = await IOUtils.createUniqueDirectory(
 | |
|     PathUtils.tempDir,
 | |
|     "PreferencesBackupResource-source-test"
 | |
|   );
 | |
|   let stagingPath = await IOUtils.createUniqueDirectory(
 | |
|     PathUtils.tempDir,
 | |
|     "PreferencesBackupResource-staging-test"
 | |
|   );
 | |
| 
 | |
|   const simpleCopyFiles = [
 | |
|     { path: "xulstore.json" },
 | |
|     { path: "containers.json" },
 | |
|     { path: "handlers.json" },
 | |
|     { path: "search.json.mozlz4" },
 | |
|     { path: "user.js" },
 | |
|     { path: ["chrome", "userChrome.css"] },
 | |
|     { path: ["chrome", "userContent.css"] },
 | |
|     { path: ["chrome", "childFolder", "someOtherStylesheet.css"] },
 | |
|   ];
 | |
|   await createTestFiles(sourcePath, simpleCopyFiles);
 | |
| 
 | |
|   // We have no need to test that Sqlite.sys.mjs's backup method is working -
 | |
|   // this is something that is tested in Sqlite's own tests. We can just make
 | |
|   // sure that it's being called using sinon. Unfortunately, we cannot do the
 | |
|   // same thing with IOUtils.copy, as its methods are not stubbable.
 | |
|   let fakeConnection = {
 | |
|     backup: sandbox.stub().resolves(true),
 | |
|     close: sandbox.stub().resolves(true),
 | |
|   };
 | |
|   sandbox.stub(Sqlite, "openConnection").returns(fakeConnection);
 | |
| 
 | |
|   await preferencesBackupResource.backup(stagingPath, sourcePath);
 | |
| 
 | |
|   await assertFilesExist(stagingPath, simpleCopyFiles);
 | |
| 
 | |
|   // Next, we'll make sure that the Sqlite connection had `backup` called on it
 | |
|   // with the right arguments.
 | |
|   Assert.ok(
 | |
|     fakeConnection.backup.calledTwice,
 | |
|     "Called backup the expected number of times for all connections"
 | |
|   );
 | |
|   Assert.ok(
 | |
|     fakeConnection.backup.firstCall.calledWith(
 | |
|       PathUtils.join(stagingPath, "permissions.sqlite")
 | |
|     ),
 | |
|     "Called backup on the permissions.sqlite Sqlite connection"
 | |
|   );
 | |
|   Assert.ok(
 | |
|     fakeConnection.backup.secondCall.calledWith(
 | |
|       PathUtils.join(stagingPath, "content-prefs.sqlite")
 | |
|     ),
 | |
|     "Called backup on the content-prefs.sqlite Sqlite connection"
 | |
|   );
 | |
| 
 | |
|   // And we'll make sure that preferences were properly written out.
 | |
|   Assert.ok(
 | |
|     await IOUtils.exists(PathUtils.join(stagingPath, "prefs.js")),
 | |
|     "prefs.js should exist in the staging folder"
 | |
|   );
 | |
| 
 | |
|   await maybeRemovePath(stagingPath);
 | |
|   await maybeRemovePath(sourcePath);
 | |
| 
 | |
|   sandbox.restore();
 | |
| });
 | 
