Skip to content

Commit

Permalink
add test
Browse files Browse the repository at this point in the history
  • Loading branch information
asukaminato0721 committed Feb 1, 2025
1 parent 3c31265 commit 4fdb466
Show file tree
Hide file tree
Showing 9 changed files with 517 additions and 17 deletions.
10 changes: 10 additions & 0 deletions bindings/dart/README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,12 @@
# Dart binding for opendal

## Development

```
flutter pub get
flutter_rust_bridge_codegen generate
cd rust
cargo build -r
cd ..
dart run lib/opendal_test.dart
```
2 changes: 0 additions & 2 deletions bindings/dart/lib/example.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,4 @@ import 'src/rust/api/opendal_api.dart';
Future<void> main() async {
// Initialize the Rust bridge
await RustLib.init();

// todo
}
53 changes: 53 additions & 0 deletions bindings/dart/lib/opendal_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import 'package:test/test.dart';
import 'src/rust/frb_generated.dart';
import 'src/rust/api/opendal_api.dart';

void main() {
group('opendal unit test', () {
group('opendal fs schema', () {
test('operator function in fs schema', () async {
await RustLib.init();
final op = new Operator(
schemeStr: "fs",
map: {"root": "/tmp"},
);
expect(op, isNotNull);

await op.createDir(path: "test_dir/");
expect(await op.isExist(path: "test_dir/"), true);

expect(await op.isExist(path: "test_1.txt"), false);
expect(await op.isExist(path: "test.txt"), false);
});
});

group('opendal memory schema', () {
test('operator function in memory schema', () async {
final op = new Operator(
schemeStr: "memory",
map: {"root": "/tmp"},
);
expect(op, isNotNull);
});

test('meta function in memory schema', () async {
final op = new Operator(
schemeStr: "memory",
map: {"root": "/tmp"},
);
expect(op, isNotNull);

await op.createDir(path: "test/");

final meta = await op.stat(path: "test/");
expect(meta, isNotNull);

final isFile = meta.isFile;
expect(isFile, false);

final isDir = meta.isDirectory;
expect(isDir, true);
});
});
});
}
16 changes: 16 additions & 0 deletions bindings/dart/lib/src/rust/api/opendal_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,10 @@ abstract class Operator implements RustOpaqueInterface {

void createDirSync({required String path});

Future<void> delete({required String path});

void deleteSync({required String path});

Future<bool> isExist({required String path});

bool isExistSync({required String path});
Expand All @@ -162,6 +166,18 @@ abstract class Operator implements RustOpaqueInterface {
RustLib.instance.api
.crateApiOpendalApiOperatorNew(schemeStr: schemeStr, map: map);

Future<void> rename({required String from, required String to});

/// Rename file according to given `from` and `to` path synchronously.
///
/// It's similar to `mv` command.
///
/// ### Example
/// ```javascript
/// op.renameSync("path/to/file", "path/to/dest");
/// ```
void renameSync({required String from, required String to});

Future<Metadata> stat({required String path});

Metadata statSync({required String path});
Expand Down
158 changes: 152 additions & 6 deletions bindings/dart/lib/src/rust/frb_generated.dart
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ class RustLib extends BaseEntrypoint<RustLibApi, RustLibApiImpl, RustLibWire> {
String get codegenVersion => '2.7.1';

@override
int get rustContentHash => -958887605;
int get rustContentHash => 1542605546;

static const kDefaultExternalLibraryLoaderConfig =
ExternalLibraryLoaderConfig(
Expand Down Expand Up @@ -183,6 +183,12 @@ abstract class RustLibApi extends BaseApi {
void crateApiOpendalApiOperatorCreateDirSync(
{required Operator that, required String path});

Future<void> crateApiOpendalApiOperatorDelete(
{required Operator that, required String path});

void crateApiOpendalApiOperatorDeleteSync(
{required Operator that, required String path});

Future<bool> crateApiOpendalApiOperatorIsExist(
{required Operator that, required String path});

Expand All @@ -192,6 +198,12 @@ abstract class RustLibApi extends BaseApi {
Operator crateApiOpendalApiOperatorNew(
{required String schemeStr, required Map<String, String> map});

Future<void> crateApiOpendalApiOperatorRename(
{required Operator that, required String from, required String to});

void crateApiOpendalApiOperatorRenameSync(
{required Operator that, required String from, required String to});

Future<Metadata> crateApiOpendalApiOperatorStat(
{required Operator that, required String path});

Expand Down Expand Up @@ -1388,7 +1400,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
);

@override
Future<bool> crateApiOpendalApiOperatorIsExist(
Future<void> crateApiOpendalApiOperatorDelete(
{required Operator that, required String path}) {
return handler.executeNormal(NormalTask(
callFfi: (port_) {
Expand All @@ -1399,6 +1411,61 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
pdeCallFfi(generalizedFrbRustBinding, serializer,
funcId: 46, port: port_);
},
codec: SseCodec(
decodeSuccessData: sse_decode_unit,
decodeErrorData: null,
),
constMeta: kCrateApiOpendalApiOperatorDeleteConstMeta,
argValues: [that, path],
apiImpl: this,
));
}

TaskConstMeta get kCrateApiOpendalApiOperatorDeleteConstMeta =>
const TaskConstMeta(
debugName: "Operator_delete",
argNames: ["that", "path"],
);

@override
void crateApiOpendalApiOperatorDeleteSync(
{required Operator that, required String path}) {
return handler.executeSync(SyncTask(
callFfi: () {
final serializer = SseSerializer(generalizedFrbRustBinding);
sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOperator(
that, serializer);
sse_encode_String(path, serializer);
return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 47)!;
},
codec: SseCodec(
decodeSuccessData: sse_decode_unit,
decodeErrorData: null,
),
constMeta: kCrateApiOpendalApiOperatorDeleteSyncConstMeta,
argValues: [that, path],
apiImpl: this,
));
}

TaskConstMeta get kCrateApiOpendalApiOperatorDeleteSyncConstMeta =>
const TaskConstMeta(
debugName: "Operator_delete_sync",
argNames: ["that", "path"],
);

@override
Future<bool> crateApiOpendalApiOperatorIsExist(
{required Operator that, required String path}) {
return handler.executeNormal(NormalTask(
callFfi: (port_) {
final serializer = SseSerializer(generalizedFrbRustBinding);
sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOperator(
that, serializer);
sse_encode_String(path, serializer);
pdeCallFfi(generalizedFrbRustBinding, serializer,
funcId: 48, port: port_);
},
codec: SseCodec(
decodeSuccessData: sse_decode_bool,
decodeErrorData: null,
Expand All @@ -1424,7 +1491,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOperator(
that, serializer);
sse_encode_String(path, serializer);
return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 47)!;
return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 49)!;
},
codec: SseCodec(
decodeSuccessData: sse_decode_bool,
Expand All @@ -1450,7 +1517,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
final serializer = SseSerializer(generalizedFrbRustBinding);
sse_encode_String(schemeStr, serializer);
sse_encode_Map_String_String(map, serializer);
return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 48)!;
return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 50)!;
},
codec: SseCodec(
decodeSuccessData:
Expand All @@ -1469,6 +1536,63 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
argNames: ["schemeStr", "map"],
);

@override
Future<void> crateApiOpendalApiOperatorRename(
{required Operator that, required String from, required String to}) {
return handler.executeNormal(NormalTask(
callFfi: (port_) {
final serializer = SseSerializer(generalizedFrbRustBinding);
sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOperator(
that, serializer);
sse_encode_String(from, serializer);
sse_encode_String(to, serializer);
pdeCallFfi(generalizedFrbRustBinding, serializer,
funcId: 51, port: port_);
},
codec: SseCodec(
decodeSuccessData: sse_decode_unit,
decodeErrorData: null,
),
constMeta: kCrateApiOpendalApiOperatorRenameConstMeta,
argValues: [that, from, to],
apiImpl: this,
));
}

TaskConstMeta get kCrateApiOpendalApiOperatorRenameConstMeta =>
const TaskConstMeta(
debugName: "Operator_rename",
argNames: ["that", "from", "to"],
);

@override
void crateApiOpendalApiOperatorRenameSync(
{required Operator that, required String from, required String to}) {
return handler.executeSync(SyncTask(
callFfi: () {
final serializer = SseSerializer(generalizedFrbRustBinding);
sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOperator(
that, serializer);
sse_encode_String(from, serializer);
sse_encode_String(to, serializer);
return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 52)!;
},
codec: SseCodec(
decodeSuccessData: sse_decode_unit,
decodeErrorData: null,
),
constMeta: kCrateApiOpendalApiOperatorRenameSyncConstMeta,
argValues: [that, from, to],
apiImpl: this,
));
}

TaskConstMeta get kCrateApiOpendalApiOperatorRenameSyncConstMeta =>
const TaskConstMeta(
debugName: "Operator_rename_sync",
argNames: ["that", "from", "to"],
);

@override
Future<Metadata> crateApiOpendalApiOperatorStat(
{required Operator that, required String path}) {
Expand All @@ -1479,7 +1603,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
that, serializer);
sse_encode_String(path, serializer);
pdeCallFfi(generalizedFrbRustBinding, serializer,
funcId: 49, port: port_);
funcId: 53, port: port_);
},
codec: SseCodec(
decodeSuccessData:
Expand Down Expand Up @@ -1507,7 +1631,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOperator(
that, serializer);
sse_encode_String(path, serializer);
return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 50)!;
return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 54)!;
},
codec: SseCodec(
decodeSuccessData:
Expand Down Expand Up @@ -2442,12 +2566,34 @@ class OperatorImpl extends RustOpaque implements Operator {
void createDirSync({required String path}) => RustLib.instance.api
.crateApiOpendalApiOperatorCreateDirSync(that: this, path: path);

Future<void> delete({required String path}) => RustLib.instance.api
.crateApiOpendalApiOperatorDelete(that: this, path: path);

void deleteSync({required String path}) => RustLib.instance.api
.crateApiOpendalApiOperatorDeleteSync(that: this, path: path);

Future<bool> isExist({required String path}) => RustLib.instance.api
.crateApiOpendalApiOperatorIsExist(that: this, path: path);

bool isExistSync({required String path}) => RustLib.instance.api
.crateApiOpendalApiOperatorIsExistSync(that: this, path: path);

Future<void> rename({required String from, required String to}) =>
RustLib.instance.api
.crateApiOpendalApiOperatorRename(that: this, from: from, to: to);

/// Rename file according to given `from` and `to` path synchronously.
///
/// It's similar to `mv` command.
///
/// ### Example
/// ```javascript
/// op.renameSync("path/to/file", "path/to/dest");
/// ```
void renameSync({required String from, required String to}) =>
RustLib.instance.api
.crateApiOpendalApiOperatorRenameSync(that: this, from: from, to: to);

Future<Metadata> stat({required String path}) => RustLib.instance.api
.crateApiOpendalApiOperatorStat(that: this, path: path);

Expand Down
19 changes: 18 additions & 1 deletion bindings/dart/rust/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,24 @@ edition = "2021"

[dependencies]
flutter_rust_bridge = "2.7.1"
opendal = { path = "../../../core" }
opendal = { path = "../../../core", features = [
# These are default features before v0.46. TODO: change to optional features
"services-azblob",
"services-azdls",
"services-cos",
"services-fs",
"services-gcs",
"services-ghac",
"services-http",
"services-ipmfs",
"services-memory",
"services-obs",
"services-oss",
"services-s3",
"services-webdav",
"services-webhdfs",
"services-azfile",
] }

[lib]
crate-type = ["staticlib", "cdylib"]
Loading

0 comments on commit 4fdb466

Please sign in to comment.