Coverage Report

Created: 2022-11-10 19:56

/home/runner/work/creditcoin/creditcoin/node/rpc/src/lib.rs
Line
Count
Source (jump to first uncovered line)
1
1
use jsonrpc_core::Result as RpcResult;use jsonrpc_core::Result as RpcResult;
2
use jsonrpc_derive::rpc;
3
use jsonrpc_pubsub::PubSubMetadata;
4
use primitives::metrics::MiningMetrics;
5
6
0
#[rpc]
7
pub trait CreditcoinApi {
8
  type Metadata: PubSubMetadata;
9
10
  #[rpc(name = "creditcoin_hashrate")]
11
  fn mining_stats(&self) -> RpcResult<MiningStats>;
12
}
13
14
pub struct CreditcoinRpc {
15
  mining_metrics: MiningMetrics,
16
}
17
18
impl CreditcoinRpc {
19
1
  pub fn new(mining_metrics: MiningMetrics) -> Self {
20
1
    Self { mining_metrics }
21
1
  }
22
}
23
24
pub enum Error {
25
  StorageError = 1,
26
  DecodeError,
27
  SubscriptionError,
28
  RuntimeError,
29
}
30
31
impl From<Error> for i64 {
32
3
  fn from(e: Error) -> i64 {
33
3
    e as i64
34
3
  }
35
}
36
37
impl CreditcoinApi for CreditcoinRpc {
38
  type Metadata = sc_rpc::Metadata;
39
40
1
  fn mining_stats(&self) -> RpcResult<MiningStats> {
41
1
    let hash_count = self.mining_metrics.count();
42
1
    let elapsed = self.mining_metrics.elapsed();
43
1
    let rate = hash_count as f64 / elapsed.as_secs_f64();
44
1
    Ok(MiningStats { hash_count, elapsed, rate })
45
1
  }
46
}
47
48
2
#[derive(
Debug0
, Clone,
serd0
e::Serializ0
e0
,
s0
erd
e::Deserializ0
e0
)]
49
pub struct MiningStats {
50
  hash_count: u64,
51
  elapsed: std::time::Duration,
52
  rate: f64,
53
}
54
55
mod task;
56
pub use task::{Task, TaskRpc};
57
58
#[cfg(test)]
59
mod test {
60
  use super::*;
61
  use assert_matches::assert_matches;
62
  use std::time::Duration;
63
64
1
  #[test]
65
  #[allow(clippy::redundant_clone)]
66
1
  fn metrics_work() {
67
1
    let metrics = MiningMetrics::new(None).unwrap();
68
1
    let rpc = CreditcoinRpc::new(metrics);
69
1
70
1
    let result = rpc.mining_stats();
71
1
    
assert_matches!0
(result.clone(), Ok(stats) => {
72
1
      assert_eq!(stats.hash_count, 0);
73
1
      assert!(stats.elapsed > Duration::from_secs(0));
74
1
      assert_eq!(stats.rate, 0.0);
75
    });
76
77
    // exercise Clone trait
78
1
    let stats = result.unwrap();
79
1
    let _ = stats.clone();
80
1
  }
81
82
1
  #[test]
83
1
  fn can_create_integer_from_error() {
84
1
    assert_eq!(i64::from(Error::StorageError), 1);
85
1
    assert_eq!(i64::from(Error::DecodeError), 2);
86
1
    assert_eq!(i64::from(Error::SubscriptionError), 3);
87
1
  }
88
}