blob: 609f7e1fc4d50312ea1fcbf53eda592964946454 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import {assertEquals} from 'chrome://test/chai_assert.js';
import {installMockChrome, MockCommandLinePrivate} from '../../../base/js/mock_chrome.m.js';
import {reportPromise} from '../../../base/js/test_error_reporting.m.js';
import {VolumeManagerCommon} from '../../../base/js/volume_manager_types.m.js';
import {VolumeManager} from '../../../externs/volume_manager.m.js';
import {MockVolumeManager} from '../../background/js/mock_volume_manager.m.js';
import {VolumeInfoImpl} from '../../background/js/volume_info_impl.m.js';
import {MockDirectoryEntry, MockFileSystem} from '../../common/js/mock_entry.m.js';
import {ProvidersModel} from './providers_model.m.js';
/**
* Providing extension which has a mounted file system and doesn't support
* multiple mounts.
* @type {Object}
*/
const MOUNTED_SINGLE_PROVIDING_EXTENSION = {
name: 'mounted-single-extension-name',
source: VolumeManagerCommon.Source.NETWORK,
providerId: 'mounted-single-provider-id',
iconSet: {
icon16x16Url: 'chrome://mounted-single-extension-id-16.jpg',
icon32x32Url: 'chrome://mounted-single-extension-id-32.jpg',
},
configurable: false,
watchable: true,
multipleMounts: false,
};
/**
* Providing extension which has a not-mounted file system and doesn't support
* multiple mounts.
* @type {Object}
*/
const NOT_MOUNTED_SINGLE_PROVIDING_EXTENSION = {
name: 'not-mounted-single-extension-name',
source: VolumeManagerCommon.Source.NETWORK,
providerId: 'not-mounted-single-provider-id',
iconSet: {
icon16x16Url: 'chrome://not-mounted-single-extension-id-16.jpg',
icon32x32Url: 'chrome://not-mounted-single-extension-id-32.jpg',
},
configurable: false,
watchable: true,
multipleMounts: false,
};
/**
* Providing extension which has a mounted file system and supports multiple
* mounts.
* @type {Object}
*/
const MOUNTED_MULTIPLE_PROVIDING_EXTENSION = {
name: 'mounted-multiple-extension-name',
source: VolumeManagerCommon.Source.NETWORK,
providerId: 'mounted-multiple-provider-id',
iconSet: {
icon16x16Url: 'chrome://mounted-multiple-extension-id-16.jpg',
icon32x32Url: 'chrome://mounted-multiple-extension-id-32.jpg',
},
configurable: true,
watchable: false,
multipleMounts: true,
};
/**
* Providing extension which has a not-mounted file system of FILE source.
* Such providers are mounted via file handlers.
* @type {Object}
*/
const NOT_MOUNTED_FILE_PROVIDING_EXTENSION = {
name: 'file-extension-name',
source: VolumeManagerCommon.Source.FILE,
providerId: 'file-provider-id',
iconSet: {
icon16x16Url: 'chrome://file-extension-id-16.jpg',
icon32x32Url: 'chrome://file-extension-id-32.jpg',
},
configurable: false,
watchable: true,
multipleMounts: true,
};
/**
* Providing extension which has a not-mounted file system of DEVICE source.
* Such providers are not mounted by users: they automatically mount when the
* DEVICE is attached.
* @type {Object}
*/
const NOT_MOUNTED_DEVICE_PROVIDING_EXTENSION = {
name: 'device-extension-name',
source: VolumeManagerCommon.Source.DEVICE,
providerId: 'device-provider-id',
iconSet: {
icon16x16Url: 'chrome://device-extension-id-16.jpg',
icon32x32Url: 'chrome://device-extension-id-32.jpg',
},
configurable: false,
watchable: true,
multipleMounts: true,
};
/** @type {!VolumeManager} */
let volumeManager;
function addProvidedVolume(volumeManager, providerId, volumeId) {
const fileSystem = new MockFileSystem(volumeId, 'filesystem:' + volumeId);
fileSystem.entries['/'] = MockDirectoryEntry.create(fileSystem, '');
const volumeInfo = new VolumeInfoImpl(
VolumeManagerCommon.VolumeType.PROVIDED, volumeId, fileSystem,
'', // error
'', // deviceType
'', // devicePath
false, // isReadonly
false, // isReadonlyRemovableDevice
{isCurrentProfile: true, displayName: ''}, // profile
'', // label
providerId, // providerId
false, // hasMedia
false, // configurable
false, // watchable
VolumeManagerCommon.Source.NETWORK, // source
VolumeManagerCommon.FileSystemType.UNKNOWN, // diskFileSystemType
{}, // iconSet
'', // driveLabel
''); // remoteMountPath
volumeManager.volumeInfoList.add(volumeInfo);
}
export function setUp() {
window.loadTimeData.getString = id => id;
// Create and install a mock fileManagerPrivate API for fetching the list of
// providers. TODO(mtomasz): Add some native (non-extension) providers.
const mockChrome = {
fileManagerPrivate: {
getProviders: function(callback) {
callback([
MOUNTED_SINGLE_PROVIDING_EXTENSION,
NOT_MOUNTED_SINGLE_PROVIDING_EXTENSION,
MOUNTED_MULTIPLE_PROVIDING_EXTENSION,
NOT_MOUNTED_FILE_PROVIDING_EXTENSION,
NOT_MOUNTED_DEVICE_PROVIDING_EXTENSION
]);
},
},
};
mockChrome.runtime = {};
installMockChrome(mockChrome);
new MockCommandLinePrivate();
// Install mock volume manager.
volumeManager = new MockVolumeManager();
// Add provided test volumes.
const single = MOUNTED_SINGLE_PROVIDING_EXTENSION.providerId;
addProvidedVolume(volumeManager, single, 'volume-1');
const multiple = MOUNTED_MULTIPLE_PROVIDING_EXTENSION.providerId;
addProvidedVolume(volumeManager, multiple, 'volume-2');
}
export function testGetInstalledProviders(callback) {
const model = new ProvidersModel(volumeManager);
reportPromise(
model.getInstalledProviders().then(providers => {
assertEquals(5, providers.length);
assertEquals(
MOUNTED_SINGLE_PROVIDING_EXTENSION.providerId,
providers[0].providerId);
assertEquals(
MOUNTED_SINGLE_PROVIDING_EXTENSION.iconSet, providers[0].iconSet);
assertEquals(
MOUNTED_SINGLE_PROVIDING_EXTENSION.name, providers[0].name);
assertEquals(
MOUNTED_SINGLE_PROVIDING_EXTENSION.configurable,
providers[0].configurable);
assertEquals(
MOUNTED_SINGLE_PROVIDING_EXTENSION.watchable,
providers[0].watchable);
assertEquals(
MOUNTED_SINGLE_PROVIDING_EXTENSION.multipleMounts,
providers[0].multipleMounts);
assertEquals(
MOUNTED_SINGLE_PROVIDING_EXTENSION.source, providers[0].source);
assertEquals(
NOT_MOUNTED_SINGLE_PROVIDING_EXTENSION.providerId,
providers[1].providerId);
assertEquals(
MOUNTED_MULTIPLE_PROVIDING_EXTENSION.providerId,
providers[2].providerId);
assertEquals(
NOT_MOUNTED_FILE_PROVIDING_EXTENSION.providerId,
providers[3].providerId);
assertEquals(
NOT_MOUNTED_DEVICE_PROVIDING_EXTENSION.providerId,
providers[4].providerId);
assertEquals(
NOT_MOUNTED_SINGLE_PROVIDING_EXTENSION.iconSet,
providers[1].iconSet);
assertEquals(
MOUNTED_MULTIPLE_PROVIDING_EXTENSION.iconSet, providers[2].iconSet);
assertEquals(
NOT_MOUNTED_FILE_PROVIDING_EXTENSION.iconSet, providers[3].iconSet);
assertEquals(
NOT_MOUNTED_DEVICE_PROVIDING_EXTENSION.iconSet,
providers[4].iconSet);
}),
callback);
}
export function testGetMountableProviders(callback) {
const model = new ProvidersModel(volumeManager);
reportPromise(
model.getMountableProviders().then(providers => {
assertEquals(2, providers.length);
assertEquals(
NOT_MOUNTED_SINGLE_PROVIDING_EXTENSION.providerId,
providers[0].providerId);
assertEquals(
MOUNTED_MULTIPLE_PROVIDING_EXTENSION.providerId,
providers[1].providerId);
}),
callback);
}