blob: b21ab13785f071404c5d5ff89d99098ecd839b05 [file] [log] [blame]
// Copyright 2019 The Fuchsia 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 'dart:async';
import 'dart:convert' show utf8;
import 'package:fidl/fidl.dart' hide Service;
import 'package:fidl_fuchsia_io/fidl_async.dart' as io;
import 'package:fuchsia_vfs/vfs.dart';
import 'package:test/test.dart';
import 'package:zircon/zircon.dart';
void main() {
group('composed pseudo dir: ', () {
late PseudoDir pseudoDir;
late io.DirectoryProxy directory;
setUp(() {
pseudoDir = PseudoDir();
directory = io.DirectoryProxy();
pseudoDir.serve(
InterfaceRequest<io.Node>(directory.ctrl.request().passChannel()));
});
tearDown(() {
pseudoDir.close();
directory.ctrl.close();
});
test('inherited files are opened', () async {
pseudoDir.addNode('foo.txt', PseudoFile.readOnlyStr(() => 'hello world'));
final composedDir =
ComposedPseudoDir(directory: directory, inheritedNodes: ['foo.txt']);
// connect to the file through the composed directory
final fileProxy = io.FileProxy();
composedDir.open(io.openRightReadable, io.modeTypeFile, 'foo.txt',
InterfaceRequest<io.Node>(fileProxy.ctrl.request().passChannel()));
final response = await fileProxy.read(io.maxBuf);
expect(utf8.decode(response.data), 'hello world');
});
test('inherited services are opened', () async {
final completer = Completer();
pseudoDir.addNode('test.foo', Service.withConnector((_) {
completer.complete();
}));
final composedDir =
ComposedPseudoDir(directory: directory, inheritedNodes: ['test.foo']);
// connect to the service through the composed directory
final proxy = AsyncProxy(AsyncProxyController());
composedDir.open(
io.openRightReadable | io.openRightWritable,
io.modeTypeService,
'test.foo',
InterfaceRequest<io.Node>(proxy.ctrl.request().passChannel()));
expect(() => completer.future, returnsNormally);
}, timeout: Timeout(Duration(milliseconds: 500)));
test('file exists in composedDir but not directory can be opened',
() async {
final composedDir = ComposedPseudoDir(directory: directory)
..addNode('foo.txt', PseudoFile.readOnlyStr(() => 'hello world'));
// connect to the file through the composed directory
final fileProxy = io.FileProxy();
composedDir.open(io.openRightReadable, io.modeTypeFile, 'foo.txt',
InterfaceRequest<io.Node>(fileProxy.ctrl.request().passChannel()));
final response = await fileProxy.read(io.maxBuf);
expect(utf8.decode(response.data), 'hello world');
});
test('adding a node which is already included in inherited nodes fails',
() {
final composedDir =
ComposedPseudoDir(directory: directory, inheritedNodes: ['foo.txt']);
expect(composedDir.addNode('foo.txt', PseudoFile.readOnlyStr(() => '')),
ZX.ERR_ALREADY_EXISTS);
});
test('Nodes not included in inheritedNodes are not opened', () async {
pseudoDir.addNode('foo.txt', PseudoFile.readOnlyStr(() => ''));
final composedDir = ComposedPseudoDir(directory: directory);
// connect to the file through the composed directory
final fileProxy = io.FileProxy();
composedDir.open(io.openRightReadable, io.modeTypeFile, 'foo.txt',
InterfaceRequest<io.Node>(fileProxy.ctrl.request().passChannel()));
expect(() => fileProxy.read(io.maxBuf), throwsException);
});
test('cannot change list of inherited nodes after creation', () {
final inheritedNodes = <String>[];
pseudoDir.addNode('foo.txt', PseudoFile.readOnlyStr(() => ''));
final composedDir = ComposedPseudoDir(
directory: directory, inheritedNodes: inheritedNodes);
inheritedNodes.add('foo.txt');
// connect to the file through the composed directory
final fileProxy = io.FileProxy();
composedDir.open(io.openRightReadable, io.modeTypeFile, 'foo.txt',
InterfaceRequest<io.Node>(fileProxy.ctrl.request().passChannel()));
expect(() => fileProxy.read(io.maxBuf), throwsException);
});
});
}