Skip to content

Commit

Permalink
V2 slate versioning enablement (#85)
Browse files Browse the repository at this point in the history
* fix for command line listener port override

* reduce parameter query size

* Add slate versioning

* rustfmt

* bump version number

* Add tests for slate version conversion

* rustfmt

* Updates and test addition based on bdap's review

* rustfmt
  • Loading branch information
yeastplume authored Apr 23, 2019
1 parent 54bd364 commit 47ee03c
Show file tree
Hide file tree
Showing 17 changed files with 3,787 additions and 278 deletions.
443 changes: 222 additions & 221 deletions Cargo.lock

Large diffs are not rendered by default.

14 changes: 7 additions & 7 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "grin_wallet"
version = "1.1.0-beta.1"
version = "1.1.0-beta.2"
authors = ["Grin Developers <[email protected]>"]
description = "Simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format."
license = "Apache-2.0"
Expand Down Expand Up @@ -29,13 +29,13 @@ prettytable-rs = "0.7"
log = "0.4"
linefeed = "0.5"

grin_wallet_api = { path = "./api", version = "1.1.0-beta.1" }
grin_wallet_impls = { path = "./impls", version = "1.1.0-beta.1" }
grin_wallet_libwallet = { path = "./libwallet", version = "1.1.0-beta.1" }
grin_wallet_controller = { path = "./controller", version = "1.1.0-beta.1" }
grin_wallet_config = { path = "./config", version = "1.1.0-beta.1" }
grin_wallet_api = { path = "./api", version = "1.1.0-beta.2" }
grin_wallet_impls = { path = "./impls", version = "1.1.0-beta.2" }
grin_wallet_libwallet = { path = "./libwallet", version = "1.1.0-beta.2" }
grin_wallet_controller = { path = "./controller", version = "1.1.0-beta.2" }
grin_wallet_config = { path = "./config", version = "1.1.0-beta.2" }

grin_wallet_util = { path = "./util", version = "1.1.0-beta.1" }
grin_wallet_util = { path = "./util", version = "1.1.0-beta.2" }

[build-dependencies]
built = "0.3"
10 changes: 5 additions & 5 deletions api/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "grin_wallet_api"
version = "1.1.0-beta.1"
version = "1.1.0-beta.2"
authors = ["Grin Developers <[email protected]>"]
description = "Grin Wallet API"
license = "Apache-2.0"
Expand All @@ -18,11 +18,11 @@ serde_json = "1"
easy-jsonrpc = "0.4.1"
chrono = { version = "0.4.4", features = ["serde"] }

grin_wallet_libwallet = { path = "../libwallet", version = "1.1.0-beta.1" }
grin_wallet_config = { path = "../config", version = "1.1.0-beta.1" }
grin_wallet_impls = { path = "../impls", version = "1.1.0-beta.1" }
grin_wallet_libwallet = { path = "../libwallet", version = "1.1.0-beta.2" }
grin_wallet_config = { path = "../config", version = "1.1.0-beta.2" }
grin_wallet_impls = { path = "../impls", version = "1.1.0-beta.2" }

grin_wallet_util = { path = "../util", version = "1.1.0-beta.1" }
grin_wallet_util = { path = "../util", version = "1.1.0-beta.2" }

[dev-dependencies]
serde_json = "1"
Expand Down
15 changes: 9 additions & 6 deletions api/src/foreign_rpc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@
//! JSON-RPC Stub generation for the Foreign API
use crate::keychain::Keychain;
use crate::libwallet::slate::Slate;
use crate::libwallet::types::{BlockFees, CbData, InitTxArgs, NodeClient, WalletBackend};
use crate::libwallet::ErrorKind;
use crate::libwallet::{Slate, VersionedSlate};
use crate::Foreign;
use easy_jsonrpc;

Expand Down Expand Up @@ -310,10 +310,10 @@ pub trait ForeignRpc {
*/
fn receive_tx(
&self,
slate: Slate,
slate: VersionedSlate,
dest_acct_name: Option<String>,
message: Option<String>,
) -> Result<Slate, ErrorKind>;
) -> Result<VersionedSlate, ErrorKind>;
}

impl<W: ?Sized, C, K> ForeignRpc for Foreign<W, C, K>
Expand All @@ -332,18 +332,21 @@ where

fn receive_tx(
&self,
slate: Slate,
slate: VersionedSlate,
dest_acct_name: Option<String>,
message: Option<String>,
) -> Result<Slate, ErrorKind> {
) -> Result<VersionedSlate, ErrorKind> {
let version = slate.version();
let slate: Slate = slate.into();
let slate = Foreign::receive_tx(
self,
&slate,
dest_acct_name.as_ref().map(String::as_str),
message,
)
.map_err(|e| e.kind())?;
Ok(slate)

Ok(VersionedSlate::into_version(slate, version))
}
}

Expand Down
1 change: 1 addition & 0 deletions api/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,5 +43,6 @@ pub use crate::foreign_rpc::ForeignRpc;
pub use crate::owner::Owner;
pub use crate::owner_rpc::OwnerRpc;

pub use crate::foreign_rpc::foreign_rpc as foreign_rpc_client;
pub use crate::foreign_rpc::run_doctest_foreign;
pub use crate::owner_rpc::run_doctest_owner;
131 changes: 131 additions & 0 deletions api/tests/slate_versioning.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
// Copyright 2019 The Grin Developers
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

//! core::libtx specific tests
use grin_wallet_api::foreign_rpc_client;
use grin_wallet_api::run_doctest_foreign;
use grin_wallet_libwallet::{Slate, SlateVersion, VersionedSlate};
use serde_json;
use serde_json::Value;
use tempfile::tempdir;
//use grin_wallet_libwallet::slate_versions::v1::SlateV1;
//use grin_wallet_libwallet::slate_versions::v2::SlateV2;

// test all slate conversions
#[test]
fn receive_versioned_slate() {
// as in doctests, except exercising versioning functionality
// by accepting and responding with a V1 slate

let dir = tempdir().map_err(|e| format!("{:#?}", e)).unwrap();
let dir = dir
.path()
.to_str()
.ok_or("Failed to convert tmpdir path to string.".to_owned())
.unwrap();

let v1_req = include_str!("slates/v1_req.slate");
let v1_resp = include_str!("slates/v1_res.slate");

// leave here for the ability to create earlier slate versions
// for test input
/*let v: Value = serde_json::from_str(v1_req).unwrap();
let v2_slate = v["params"][0].clone();
println!("{}", v2_slate);
let v2_slate_str = v2_slate.to_string();
println!("{}", v2_slate_str);
let v2: SlateV2 = serde_json::from_str(&v2_slate.to_string()).unwrap();
let v1 = SlateV1::from(v2);
let v1_str = serde_json::to_string_pretty(&v1).unwrap();
panic!("{}", v1_str);*/

let request_val: Value = serde_json::from_str(v1_req).unwrap();
let expected_response: Value = serde_json::from_str(v1_resp).unwrap();

let response = run_doctest_foreign(request_val, dir, 5, true)
.unwrap()
.unwrap();

if response != expected_response {
panic!(
"(left != right) \nleft: {}\nright: {}",
serde_json::to_string_pretty(&response).unwrap(),
serde_json::to_string_pretty(&expected_response).unwrap()
);
}
}

/// call ForeignRpc::receive_tx on vs and return the result
fn receive_tx(vs: VersionedSlate) -> VersionedSlate {
let dir = tempdir().map_err(|e| format!("{:#?}", e)).unwrap();
let dir = dir
.path()
.to_str()
.ok_or("Failed to convert tmpdir path to string.".to_owned())
.unwrap();
let bound_method = foreign_rpc_client::receive_tx(
vs,
None,
Some("Thanks for saving my dog from that tree, bddap.".into()),
)
.unwrap();
let (call, tracker) = bound_method.call();
let json_response = run_doctest_foreign(call.as_request(), dir, 5, false)
.unwrap()
.unwrap();
let mut response = easy_jsonrpc::Response::from_json_response(json_response).unwrap();
tracker.get_return(&mut response).unwrap().unwrap()
}

#[test]
fn version_unchanged() {
let req: Value = serde_json::from_str(include_str!("slates/v1_req.slate")).unwrap();
let slate: VersionedSlate = serde_json::from_value(req["params"][0].clone()).unwrap();
let slate_req: Slate = slate.into();

assert_eq!(
receive_tx(VersionedSlate::into_version(
slate_req.clone(),
SlateVersion::V0
))
.version(),
SlateVersion::V0
);

assert_eq!(
receive_tx(VersionedSlate::into_version(
slate_req.clone(),
SlateVersion::V1
))
.version(),
SlateVersion::V1
);

assert_eq!(
receive_tx(VersionedSlate::into_version(
slate_req.clone(),
SlateVersion::V2
))
.version(),
SlateVersion::V2
);

// compile time test will remind us to update these tests when updating slate format
fn _all_versions_tested(vs: VersionedSlate) {
match vs {
VersionedSlate::V0(_) => (),
VersionedSlate::V1(_) => (),
VersionedSlate::V2(_) => (),
}
}
}
Loading

0 comments on commit 47ee03c

Please sign in to comment.