-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathnative_test_utils.dart
68 lines (58 loc) · 2.2 KB
/
native_test_utils.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import 'dart:ffi';
import 'dart:io';
import 'package:sqlite3/common.dart';
import 'package:sqlite3/open.dart' as sqlite_open;
import 'package:sqlite3/sqlite3.dart';
import 'package:path/path.dart' as p;
const defaultSqlitePath = 'libsqlite3.so.0';
const libPath = '../target/debug';
var didLoadExtension = false;
void applyOpenOverride() {
sqlite_open.open.overrideFor(sqlite_open.OperatingSystem.linux, () {
return DynamicLibrary.open('libsqlite3.so.0');
});
sqlite_open.open.overrideFor(sqlite_open.OperatingSystem.macOS, () {
// Prefer using Homebrew's SQLite which allows loading extensions.
const fromHomebrew = '/opt/homebrew/opt/sqlite/lib/libsqlite3.dylib';
if (File(fromHomebrew).existsSync()) {
return DynamicLibrary.open(fromHomebrew);
}
return DynamicLibrary.open('libsqlite3.dylib');
});
}
CommonDatabase openTestDatabase([VirtualFileSystem? vfs]) {
applyOpenOverride();
if (!didLoadExtension) {
loadExtension();
}
return sqlite3.open(':memory:', vfs: vfs?.name);
}
void loadExtension() {
applyOpenOverride();
var lib = DynamicLibrary.open(getLibraryForPlatform(path: libPath));
var extension = SqliteExtension.inLibrary(lib, 'sqlite3_powersync_init');
sqlite3.ensureExtensionLoaded(extension);
didLoadExtension = true;
}
String getLibraryForPlatform({String? path = "."}) {
// Using an absolute path is required for macOS, where Dart can't dlopen
// relative paths due to being a "hardened program".
return p.normalize(p.absolute(switch (Abi.current()) {
Abi.androidArm ||
Abi.androidArm64 ||
Abi.androidX64 =>
'$path/libpowersync.so',
Abi.macosArm64 || Abi.macosX64 => '$path/libpowersync.dylib',
Abi.linuxX64 || Abi.linuxArm64 => '$path/libpowersync.so',
Abi.windowsX64 => '$path/powersync.dll',
Abi.androidIA32 => throw ArgumentError(
'Unsupported processor architecture. X86 Android emulators are not '
'supported. Please use an x86_64 emulator instead. All physical '
'Android devices are supported including 32bit ARM.',
),
_ => throw ArgumentError(
'Unsupported processor architecture "${Abi.current()}". '
'Please open an issue on GitHub to request it.',
)
}));
}