Skip to content

Commit f1403a6

Browse files
authored
Sync result (#547)
* Remove sync_account() returns MergeOutcome. * Remove execute_sync() returns Option<MergeOutcome>. * Split sync traits for single remote and multiple remotes. * Use enum for remote sync result. * Use RemoteResult in listen channel. * Bump sos-net version, prepare for next release. * Use type def for RemoteResult. * Include Origin in RemoteResult. * Prefer named fields for RemoteResult. * Define SyncResult. * Update sdk crate types to NetworkResult. * Update net crate to use SyncResult type. * Update sos cli for new SyncResult type. * Update test specs. * Bump minor version, prepare for next release. * Remove obsolete into_option() function. * Remove SyncError type. * Add has_errors() and first_error_ref(). * Rename to has_error(). * Update dependencies.
1 parent 9f9fa71 commit f1403a6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+645
-599
lines changed

Cargo.lock

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

crates/account_extras/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "sos-account-extras"
3-
version = "0.14.5"
3+
version = "0.15.0"
44
edition = "2021"
55
description = "Extra features for Save Our Secrets local accounts."
66
homepage = "https://saveoursecrets.com"
@@ -21,7 +21,7 @@ tokio.workspace = true
2121
once_cell.workspace = true
2222

2323
[dependencies.sos-sdk]
24-
version = "0.14.5"
24+
version = "0.15"
2525
path = "../sdk"
2626

2727
[build-dependencies]

crates/integration_tests/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ pretty_assertions = "1.4"
3838
anticipate-runner = { version = "0.5.1" }
3939

4040
[dev-dependencies.sos-net]
41-
version = "0.14.0"
4241
features = ["full"]
4342
path = "../net"
4443

crates/integration_tests/tests/access_control/allow.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ use crate::test_utils::{
66
};
77
use http::StatusCode;
88
use sos_net::{
9-
protocol::SyncError, sdk::prelude::*, Error as ClientError,
10-
NetworkAccount, RemoteSync,
9+
sdk::prelude::*, AccountSync, Error as ClientError, NetworkAccount,
1110
};
1211

1312
use sos_server::AccessControlConfig;
@@ -52,10 +51,9 @@ async fn access_control_allow() -> Result<()> {
5251
allowed.owner.add_server(origin.clone()).await?;
5352
denied.add_server(origin.clone()).await?;
5453

55-
assert!(allowed.owner.sync().await.is_none());
54+
assert!(allowed.owner.sync().await.first_error().is_none());
5655
let sync_error = denied.sync().await;
57-
if let Some(SyncError { mut errors }) = sync_error {
58-
let (_, err) = errors.remove(0);
56+
if let Some(err) = sync_error.first_error() {
5957
assert!(matches!(
6058
err,
6159
ClientError::ResponseCode(StatusCode::FORBIDDEN)

crates/integration_tests/tests/access_control/deny.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ use crate::test_utils::{
66
};
77
use http::StatusCode;
88
use sos_net::{
9-
protocol::SyncError, sdk::prelude::*, Error as ClientError,
10-
NetworkAccount, RemoteSync,
9+
sdk::prelude::*, AccountSync, Error as ClientError, NetworkAccount,
1110
};
1211

1312
use sos_server::AccessControlConfig;
@@ -51,10 +50,9 @@ async fn access_control_deny() -> Result<()> {
5150

5251
allowed.owner.add_server(origin.clone()).await?;
5352
denied.add_server(origin.clone()).await?;
54-
assert!(allowed.owner.sync().await.is_none());
53+
assert!(allowed.owner.sync().await.first_error().is_none());
5554
let sync_error = denied.sync().await;
56-
if let Some(SyncError { mut errors }) = sync_error {
57-
let (_, err) = errors.remove(0);
55+
if let Some(err) = sync_error.first_error() {
5856
assert!(matches!(
5957
err,
6058
ClientError::ResponseCode(StatusCode::FORBIDDEN)

crates/integration_tests/tests/auto_merge/create_secrets.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::test_utils::{
33
teardown,
44
};
55
use anyhow::Result;
6-
use sos_net::{sdk::prelude::*, RemoteSync};
6+
use sos_net::{sdk::prelude::*, AccountSync};
77

88
/// Tests making conflicting changes to a folder whilst
99
/// a server is offline and resolving the conflicts with
@@ -35,15 +35,15 @@ async fn auto_merge_create_secrets() -> Result<()> {
3535
.owner
3636
.create_secret(meta, secret, Default::default())
3737
.await?;
38-
assert!(result1.sync_error.is_some());
38+
assert!(result1.sync_result.first_error().is_some());
3939

4040
// Create a secret on second device and fail to sync
4141
let (meta, secret) = mock::note("note_2", "offline_secret_2");
4242
let result2 = device2
4343
.owner
4444
.create_secret(meta, secret, Default::default())
4545
.await?;
46-
assert!(result2.sync_error.is_some());
46+
assert!(result2.sync_result.first_error().is_some());
4747

4848
let device1_folder_state =
4949
device1.owner.commit_state(&default_folder).await?;
@@ -59,12 +59,12 @@ async fn auto_merge_create_secrets() -> Result<()> {
5959
let _server = spawn(TEST_ID, Some(addr), None).await?;
6060

6161
// Sync the first device
62-
assert!(device1.owner.sync().await.is_none());
62+
assert!(device1.owner.sync().await.first_error().is_none());
6363

6464
// Sync the second device which will auto merge local
6565
// changes with the remote so it has both secrets
66-
let sync_error = device2.owner.sync().await;
67-
assert!(sync_error.is_none());
66+
let sync_result = device2.owner.sync().await;
67+
assert!(sync_result.first_error().is_none());
6868

6969
// Second device now has both secrets
7070
let (s1, _) = device2
@@ -94,7 +94,7 @@ async fn auto_merge_create_secrets() -> Result<()> {
9494

9595
// Sync the first device again to fetch the remote commits
9696
// that were changed when the auto merge executed
97-
assert!(device1.owner.sync().await.is_none());
97+
assert!(device1.owner.sync().await.first_error().is_none());
9898

9999
// First device now has both secrets
100100
let (s1, _) = device1

crates/integration_tests/tests/auto_merge/delete_secrets.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::test_utils::{
33
teardown,
44
};
55
use anyhow::Result;
6-
use sos_net::{sdk::prelude::*, RemoteSync};
6+
use sos_net::{sdk::prelude::*, AccountSync};
77

88
/// Tests making deletes to a folder whilst
99
/// a server is offline and resolving the conflicts with
@@ -30,7 +30,7 @@ async fn auto_merge_delete_secrets() -> Result<()> {
3030
.owner
3131
.create_secret(meta, secret, Default::default())
3232
.await?;
33-
assert!(result1.sync_error.is_none());
33+
assert!(result1.sync_result.first_error().is_none());
3434

3535
// Create a secret (device2) which will auto merge
3636
//
@@ -43,8 +43,7 @@ async fn auto_merge_delete_secrets() -> Result<()> {
4343
.owner
4444
.create_secret(meta, secret, Default::default())
4545
.await?;
46-
println!("{:#?}", result2.sync_error);
47-
assert!(result2.sync_error.is_none());
46+
assert!(result2.sync_result.first_error().is_none());
4847

4948
// Oh no, the server has gone offline!
5049
drop(server);
@@ -56,14 +55,14 @@ async fn auto_merge_delete_secrets() -> Result<()> {
5655
.owner
5756
.delete_secret(&result1.id, Default::default())
5857
.await?;
59-
assert!(result.sync_error.is_some());
58+
assert!(result.sync_result.first_error().is_some());
6059

6160
// Second device deletes it's secret
6261
let result = device2
6362
.owner
6463
.delete_secret(&result2.id, Default::default())
6564
.await?;
66-
assert!(result.sync_error.is_some());
65+
assert!(result.sync_result.first_error().is_some());
6766

6867
let device1_folder_state =
6968
device1.owner.commit_state(&default_folder).await?;
@@ -83,13 +82,13 @@ async fn auto_merge_delete_secrets() -> Result<()> {
8382
// This brings the first client and server into sync
8483
// with both create secrets and the deletion on the
8584
// first client but the second client is out of sync.
86-
assert!(device1.owner.sync().await.is_none());
85+
assert!(device1.owner.sync().await.first_error().is_none());
8786

8887
// Sync second device to auto merge and push their offline changes
89-
assert!(device2.owner.sync().await.is_none());
88+
assert!(device2.owner.sync().await.first_error().is_none());
9089

9190
// Sync first device again to fetch the pushed changes
92-
assert!(device1.owner.sync().await.is_none());
91+
assert!(device1.owner.sync().await.first_error().is_none());
9392

9493
// Folder commits are back in sync
9594
let device1_folder_state =

crates/integration_tests/tests/auto_merge/edit_secrets.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::test_utils::{
33
teardown,
44
};
55
use anyhow::Result;
6-
use sos_net::{sdk::prelude::*, RemoteSync};
6+
use sos_net::{sdk::prelude::*, AccountSync};
77

88
/// Tests making conflicting edits to a folder whilst
99
/// a server is offline and resolving the conflicts with
@@ -30,10 +30,10 @@ async fn auto_merge_edit_secrets() -> Result<()> {
3030
.owner
3131
.create_secret(meta, secret, Default::default())
3232
.await?;
33-
assert!(result.sync_error.is_none());
33+
assert!(result.sync_result.first_error().is_none());
3434

3535
// Sync to fetch the new secret on the second device
36-
assert!(device2.owner.sync().await.is_none());
36+
assert!(device2.owner.sync().await.first_error().is_none());
3737

3838
// Oh no, the server has gone offline!
3939
drop(server);
@@ -42,7 +42,7 @@ async fn auto_merge_edit_secrets() -> Result<()> {
4242

4343
// Update the secret whilst offline on first device
4444
let (meta, secret) = mock::note("edit_1", TEST_ID);
45-
let SecretChange { sync_error, .. } = device1
45+
let SecretChange { sync_result, .. } = device1
4646
.owner
4747
.update_secret(
4848
&result.id,
@@ -52,11 +52,11 @@ async fn auto_merge_edit_secrets() -> Result<()> {
5252
None,
5353
)
5454
.await?;
55-
assert!(sync_error.is_some());
55+
assert!(sync_result.first_error().is_some());
5656

5757
// Update the secret whilst offline on second device
5858
let (meta, secret) = mock::note("edit_2", TEST_ID);
59-
let SecretChange { sync_error, .. } = device2
59+
let SecretChange { sync_result, .. } = device2
6060
.owner
6161
.update_secret(
6262
&result.id,
@@ -66,7 +66,7 @@ async fn auto_merge_edit_secrets() -> Result<()> {
6666
None,
6767
)
6868
.await?;
69-
assert!(sync_error.is_some());
69+
assert!(sync_result.first_error().is_some());
7070

7171
let device1_folder_state =
7272
device1.owner.commit_state(&default_folder).await?;
@@ -82,13 +82,13 @@ async fn auto_merge_edit_secrets() -> Result<()> {
8282
let _server = spawn(TEST_ID, Some(addr), None).await?;
8383

8484
// Sync first device to push changes
85-
assert!(device1.owner.sync().await.is_none());
85+
assert!(device1.owner.sync().await.first_error().is_none());
8686

8787
// Sync second device to auto merge
88-
assert!(device2.owner.sync().await.is_none());
88+
assert!(device2.owner.sync().await.first_error().is_none());
8989

9090
// Sync first device again to fetch auto merged changes
91-
assert!(device1.owner.sync().await.is_none());
91+
assert!(device1.owner.sync().await.first_error().is_none());
9292

9393
let device1_folder_state =
9494
device1.owner.commit_state(&default_folder).await?;

crates/integration_tests/tests/auto_merge/scan_commits.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ async fn auto_merge_scan_commits() -> Result<()> {
3232
.owner
3333
.create_secret(meta, secret, Default::default())
3434
.await?;
35-
assert!(result.sync_error.is_none());
35+
assert!(result.sync_result.first_error().is_none());
3636
let (meta, secret) = mock::note("note_edited", TEST_ID);
3737
device
3838
.owner

crates/integration_tests/tests/file_transfers/multi_server.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::test_utils::{
77
mock::files::{create_file_secret, update_file_secret},
88
simulate_device, spawn, teardown, wait_for_num_transfers,
99
};
10-
use sos_net::{sdk::prelude::*, RemoteSync};
10+
use sos_net::{sdk::prelude::*, AccountSync};
1111

1212
/// Tests uploading an external file to multiple servers.
1313
#[tokio::test]
@@ -295,7 +295,7 @@ async fn file_transfers_multi_download() -> Result<()> {
295295
{
296296
// Sync pulls down the file event logs and
297297
// creates the pending download transfer operation
298-
assert!(downloader.owner.sync().await.is_none());
298+
assert!(downloader.owner.sync().await.first_error().is_none());
299299
wait_for_num_transfers(&downloader.owner, 1).await?;
300300

301301
let server1_path = downloader.server_path;

0 commit comments

Comments
 (0)