Skip to content

Commit 2b476a7

Browse files
author
Kasper Overgård Nielsen
authored
RDART-999: Fix flutter test dlopen (#1623)
* Use lib in package directly during flutter test * Fix paths * Update CHANGELOG
1 parent c57d96f commit 2b476a7

File tree

8 files changed

+166
-117
lines changed

8 files changed

+166
-117
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
### Fixed
77
* Fixed an issue that would cause macOS apps to be rejected with `Invalid Code Signing Entitlements` error. (Issue [#1679](https://github.com/realm/realm-dart/issues/1679))
8+
* Fixed a regression that makes it inconvenient to run unit tests using realm. (Issue [#1619](https://github.com/realm/realm-dart/issues/1619))
89

910
### Compatibility
1011
* Realm Studio: 15.0.0 or later.

packages/realm_dart/lib/src/cli/common/target_os_type.dart

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,19 @@ enum TargetOsType {
88
ios,
99
linux,
1010
macos,
11-
windows,
11+
windows;
12+
13+
bool get isDesktop => [TargetOsType.linux, TargetOsType.macos, TargetOsType.windows].contains(this);
1214
}
1315

1416
// Cannot use Dart 2.17 enhanced enums, due to an issue with build_cli :-/
1517
enum Flavor {
1618
flutter,
17-
dart,
19+
dart;
1820
}
1921

2022
extension FlavorEx on Flavor {
21-
String get packageName {
22-
switch (this) {
23-
case Flavor.dart:
24-
return 'realm_dart';
25-
case Flavor.flutter:
26-
return 'realm';
27-
}
28-
}
23+
String get packageName => switch (this) { Flavor.dart => 'realm_dart', Flavor.flutter => 'realm' };
2924
}
3025

3126
extension StringEx on String {

packages/realm_dart/lib/src/cli/install/install_command.dart

Lines changed: 34 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -25,26 +25,34 @@ class InstallCommand extends Command<void> {
2525

2626
late Options options;
2727

28-
bool get debug => options.debug;
28+
late Pubspec pubspec;
29+
late final debug = options.debug;
30+
late final flavor = options.flavor!;
31+
late final force = options.force; // not used!?!
32+
late final targetOsType = options.targetOsType!;
2933

3034
InstallCommand() {
31-
populateOptionsParser(argParser);
35+
pubspec = parsePubspec(File('pubspec.yaml'));
36+
final defaultFlavor = pubspec.dependencies['flutter'] == null ? Flavor.dart : Flavor.flutter; // default depends on project type
37+
populateOptionsParser(
38+
argParser,
39+
targetOsTypeDefaultOverride: Platform.operatingSystem.asTargetOsType,
40+
flavorDefaultOverride: defaultFlavor,
41+
);
3242
}
3343

34-
Directory getBinaryPath(Directory realmPackagePath, {required bool isFlutter}) {
35-
if (isFlutter) {
36-
final root = realmPackagePath.path;
37-
return Directory(switch (options.targetOsType) {
38-
TargetOsType.android => path.join(root, 'android', 'src', 'main', 'cpp', 'lib'),
39-
TargetOsType.ios => path.join(root, 'ios'),
40-
TargetOsType.macos => path.join(root, 'macos'),
41-
TargetOsType.linux => path.join(root, 'linux', 'binary', 'linux'),
42-
TargetOsType.windows => path.join(root, 'windows', 'binary', 'windows'),
43-
_ => throw Exception('Unsupported target OS type for Flutter: ${options.targetOsType}')
44-
});
45-
}
46-
// TODO: Should binaries not go into package also for Dart?
47-
return Directory(path.join(Directory.current.absolute.path, 'binary', options.targetOsType!.name));
44+
Directory getBinaryPath(Directory realmPackagePath, Flavor flavor) {
45+
final root = realmPackagePath.path;
46+
return switch (flavor) {
47+
Flavor.dart => Directory(path.join(root, 'binary', targetOsType.name)),
48+
Flavor.flutter => Directory(switch (targetOsType) {
49+
TargetOsType.android => path.join(root, 'android', 'src', 'main', 'cpp', 'lib'),
50+
TargetOsType.ios => path.join(root, 'ios'),
51+
TargetOsType.macos => path.join(root, 'macos'),
52+
TargetOsType.linux => path.join(root, 'linux', 'binary', 'linux'),
53+
TargetOsType.windows => path.join(root, 'windows', 'binary', 'windows'),
54+
}),
55+
};
4856
}
4957

5058
Future<bool> shouldSkipDownload(String binariesPath, String expectedVersion) async {
@@ -105,31 +113,29 @@ class InstallCommand extends Command<void> {
105113
if (packageConfig == null) {
106114
abort('Run `dart pub get`');
107115
}
108-
final package = packageConfig.packages.where((p) => p.name == name).singleOrNull;
116+
final package = packageConfig[name];
109117
if (package == null) {
110118
abort('$name package not found in dependencies. Add $name package to your pubspec.yaml');
111119
}
112120
return Directory.fromUri(package.root);
113121
}
114122

115-
Future<Pubspec> parsePubspec(File file) async {
123+
Pubspec parsePubspec(File file) {
116124
try {
117-
return Pubspec.parse(await file.readAsString(), sourceUrl: file.uri);
118-
} on Exception catch (e) {
119-
throw Exception('Error parsing package pubspec at ${file.parent}. Error $e');
125+
return Pubspec.parse(file.readAsStringSync(), sourceUrl: file.uri);
126+
} catch (e) {
127+
abort('Error parsing package pubspec at ${file.parent}. Error $e');
120128
}
121129
}
122130

123131
@override
124132
FutureOr<void> run() async {
125-
final pubspec = await parsePubspec(File('pubspec.yaml'));
126-
final flavor = pubspec.dependencies['flutter'] == null ? Flavor.dart : Flavor.flutter;
127-
128133
options = parseOptionsResult(argResults!);
129-
validateOptions(flavor);
130134

131135
final flavorName = flavor.packageName;
132136
final realmDependency = pubspec.dependencyOverrides[flavorName] ?? pubspec.dependencies[flavorName];
137+
print(pubspec.dependencyOverrides.values.join('\n'));
138+
print(realmDependency);
133139
if (realmDependency is PathDependency) {
134140
print('Path dependency for $flavorName found. Skipping install of native lib (assuming local development)');
135141
return;
@@ -140,26 +146,16 @@ class InstallCommand extends Command<void> {
140146
}
141147

142148
final realmPackagePath = await getPackagePath(flavorName);
143-
final realmPubspec = await parsePubspec(File(path.join(realmPackagePath.path, "pubspec.yaml")));
149+
final realmPubspec = parsePubspec(File(path.join(realmPackagePath.path, "pubspec.yaml")));
144150

145-
final binaryPath = getBinaryPath(realmPackagePath, isFlutter: flavor == Flavor.flutter);
151+
final binaryPath = getBinaryPath(realmPackagePath, flavor);
146152
print(binaryPath);
147-
final archiveName = '${options.targetOsType!.name}.tar.gz';
153+
final archiveName = '${targetOsType.name}.tar.gz';
148154
await downloadAndExtractBinaries(binaryPath, realmPubspec.version!, archiveName);
149155

150156
print('Realm install command finished.');
151157
}
152158

153-
void validateOptions(Flavor flavor) {
154-
final targetOs = flavor == Flavor.dart ? getTargetOS() : options.targetOsType;
155-
if (targetOs == null) {
156-
abort('Target OS not specified');
157-
}
158-
options.targetOsType = targetOs;
159-
}
160-
161-
TargetOsType getTargetOS() => Platform.operatingSystem.asTargetOsType ?? (throw UnsupportedError('Unsupported platform ${Platform.operatingSystem}'));
162-
163159
Never abort(String error) {
164160
print(error);
165161
print(usage);

packages/realm_dart/lib/src/cli/install/options.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ part 'options.g.dart';
88

99
@CliOptions()
1010
class Options {
11-
@CliOption(help: 'The target OS to install binaries for.', abbr: 't')
11+
@CliOption(help: 'The flavor to install binaries for.', abbr: 'f', provideDefaultToOverride: true)
12+
Flavor? flavor;
13+
14+
@CliOption(help: 'The target OS to install binaries for.', abbr: 't', provideDefaultToOverride: true)
1215
TargetOsType? targetOsType;
1316

1417
// use to debug install command
@@ -23,6 +26,9 @@ class Options {
2326

2427
String get usage => _$parserForOptions.usage;
2528

26-
ArgParser populateOptionsParser(ArgParser p) => _$populateOptionsParser(p);
29+
ArgParser populateOptionsParser(ArgParser parser, {
30+
TargetOsType? targetOsTypeDefaultOverride,
31+
Flavor? flavorDefaultOverride,
32+
}) => _$populateOptionsParser(parser, targetOsTypeDefaultOverride: targetOsTypeDefaultOverride, flavorDefaultOverride: flavorDefaultOverride);
2733

2834
Options parseOptionsResult(ArgResults results) => _$parseOptionsResult(results);

packages/realm_dart/lib/src/cli/install/options.g.dart

Lines changed: 39 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)