Make Uri.base see IOOverrides changes to current directory.

Fixes #39796.

Tested: Case added to `io_overrides_test.dart`.
Bug: https://dartbug.com/39796
Change-Id: Id72f75f972f59f4f9b7d17e79b4bcffd6d79f2c7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/304006
Commit-Queue: Lasse Nielsen <lrn@google.com>
Reviewed-by: Nate Bosch <nbosch@google.com>
This commit is contained in:
Lasse R.H. Nielsen 2023-05-17 17:27:13 +00:00 committed by Commit Queue
parent 43ce5487c1
commit 066106d19a
4 changed files with 19 additions and 5 deletions

View file

@ -4,6 +4,12 @@
### Libraries
#### `dart:core`
- `Uri.base` on native platforms now respectes `IOOverrides` overriding
current directory ([#39796][]).
[#39796]: https://darbug.com/39796
#### `dart:io`
- **Breaking change** [#51486][]:

View file

@ -66,12 +66,16 @@ base class _AsyncDirectoryListerOpsImpl extends NativeFieldWrapperClass1
// Corelib 'Uri.base' implementation.
// Uri.base is susceptible to changes in the current working directory.
Uri _uriBaseClosure() {
var overrides = IOOverrides.current;
if (overrides != null) {
return overrides.getCurrentDirectory().uri;
}
var result = _Directory._current(_Namespace._namespace);
if (result is OSError) {
throw new FileSystemException(
"Getting current working directory failed", "", result);
throw new FileSystemException._fromOSError(
result, "Getting current working directory failed", "");
}
return new Uri.directory(result);
return new Uri.directory(result as String);
}
@pragma("vm:entry-point", "call")

View file

@ -11,6 +11,7 @@ import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";
class DirectoryMock extends FileSystemEntity implements Directory {
static final _mockUri = Uri.parse('http:///mockdir/');
final String path = "/mockdir";
DirectoryMock(String path);
@ -19,8 +20,8 @@ class DirectoryMock extends FileSystemEntity implements Directory {
static DirectoryMock getCurrent() => new DirectoryMock("");
static void setCurrent(String path) {}
static DirectoryMock getSystemTemp() => new DirectoryMock("");
Uri get uri => _mockUri;
Uri get uri => throw "";
Future<Directory> create({bool recursive = false}) => throw "";
void createSync({bool recursive = false}) {}
Future<Directory> createTemp([String? prefix]) => throw "";
@ -206,6 +207,7 @@ Future<Null> ioOverridesRunTest() async {
() async {
Expect.isTrue(new Directory("directory") is DirectoryMock);
Expect.isTrue(Directory.current is DirectoryMock);
Expect.identical(Uri.base, DirectoryMock._mockUri);
Expect.isTrue(Directory.systemTemp is DirectoryMock);
Expect.isTrue(new File("file") is FileMock);
Expect.isTrue(await FileStat.stat("file") is FileStatMock);

View file

@ -12,6 +12,7 @@ import 'dart:typed_data';
import "package:expect/expect.dart";
class DirectoryMock extends FileSystemEntity implements Directory {
static final _mockUri = Uri.parse('http:///mockdir/');
final String path = "/mockdir";
DirectoryMock(String path);
@ -20,8 +21,8 @@ class DirectoryMock extends FileSystemEntity implements Directory {
static DirectoryMock getCurrent() => new DirectoryMock(null);
static void setCurrent(String path) {}
static DirectoryMock getSystemTemp() => new DirectoryMock(null);
Uri get uri => _mockUri;
Uri get uri => null;
Future<Directory> create({bool recursive: false}) => null;
void createSync({bool recursive: false}) {}
Future<Directory> createTemp([String prefix]) => null;
@ -205,6 +206,7 @@ Future<Null> ioOverridesRunTest() async {
() async {
Expect.isTrue(new Directory("directory") is DirectoryMock);
Expect.isTrue(Directory.current is DirectoryMock);
Expect.identical(Uri.base, DirectoryMock._mockUri);
Expect.isTrue(Directory.systemTemp is DirectoryMock);
Expect.isTrue(new File("file") is FileMock);
Expect.isTrue(await FileStat.stat("file") is FileStatMock);