main.rs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. use std::{fs::create_dir_all, sync::Arc};
  2. use async_executor::Executor;
  3. use clap::{IntoApp, Parser};
  4. use simplelog::{ColorChoice, TermLogger, TerminalMode};
  5. use darkfi::{
  6. net::Settings as P2pSettings,
  7. rpc::rpcserver::{listen_and_serve, RpcServerConfig},
  8. util::{
  9. cli::{log_config, spawn_config, Config},
  10. expand_path,
  11. path::get_config_path,
  12. },
  13. Error, Result,
  14. };
  15. mod crdt;
  16. mod error;
  17. mod jsonrpc;
  18. mod month_tasks;
  19. mod task_info;
  20. mod util;
  21. use crate::{
  22. crdt::Node,
  23. jsonrpc::JsonRpcInterface,
  24. task_info::TaskInfo,
  25. util::{CliTaud, Settings, TauConfig, CONFIG_FILE_CONTENTS},
  26. };
  27. async fn start(config: TauConfig, executor: Arc<Executor<'_>>) -> Result<()> {
  28. if config.dataset_path.is_empty() {
  29. return Err(Error::ParseFailed("Failed to parse dataset_path"))
  30. }
  31. let dataset_path = expand_path(&config.dataset_path)?;
  32. // mkdir dataset_path if not exists
  33. create_dir_all(dataset_path.join("month"))?;
  34. create_dir_all(dataset_path.join("task"))?;
  35. let settings = Settings { dataset_path };
  36. //
  37. // Crdt
  38. //
  39. let p2p_settings = P2pSettings::default();
  40. let node = Node::new("node", p2p_settings).await;
  41. let ex2 = executor.clone();
  42. let node2 = node.clone();
  43. let crdt_task = executor.spawn(node2.start(ex2.clone()));
  44. //
  45. // RPC
  46. //
  47. let server_config = RpcServerConfig {
  48. socket_addr: config.rpc_listener_url.url.parse()?,
  49. use_tls: false,
  50. // this is all random filler that is meaningless bc tls is disabled
  51. identity_path: Default::default(),
  52. identity_pass: Default::default(),
  53. };
  54. let (snd, rcv) = async_channel::unbounded::<TaskInfo>();
  55. let rpc_interface = Arc::new(JsonRpcInterface::new(snd, settings));
  56. let node2 = node.clone();
  57. let recv_update_from_rpc: smol::Task<Result<()>> = executor.spawn(async move {
  58. loop {
  59. let task_info = rcv.recv().await?;
  60. node2.clone().send_event(task_info).await?;
  61. }
  62. });
  63. listen_and_serve(server_config, rpc_interface, executor).await?;
  64. crdt_task.cancel().await;
  65. recv_update_from_rpc.cancel().await;
  66. Ok(())
  67. }
  68. #[async_std::main]
  69. async fn main() -> Result<()> {
  70. let args = CliTaud::parse();
  71. let matches = CliTaud::command().get_matches();
  72. let verbosity_level = matches.occurrences_of("verbose");
  73. let (lvl, conf) = log_config(verbosity_level)?;
  74. TermLogger::init(lvl, conf, TerminalMode::Mixed, ColorChoice::Auto)?;
  75. let config_path = get_config_path(args.config, "taud_config.toml")?;
  76. spawn_config(&config_path, CONFIG_FILE_CONTENTS)?;
  77. let config: TauConfig = Config::<TauConfig>::load(config_path)?;
  78. let ex = Arc::new(Executor::new());
  79. smol::block_on(ex.run(start(config, ex.clone())))
  80. }
  81. #[cfg(test)]
  82. mod tests {
  83. use std::{
  84. fs::{create_dir_all, remove_dir_all},
  85. path::PathBuf,
  86. };
  87. use super::*;
  88. use crate::{
  89. error::TaudResult, month_tasks::MonthTasks, task_info::TaskInfo, util::get_current_time,
  90. };
  91. const TEST_DATA_PATH: &str = "/tmp/test_tau_data";
  92. fn get_path() -> Result<PathBuf> {
  93. remove_dir_all(TEST_DATA_PATH).ok();
  94. let path = PathBuf::from(TEST_DATA_PATH);
  95. // mkdir dataset_path if not exists
  96. create_dir_all(path.join("month"))?;
  97. create_dir_all(path.join("task"))?;
  98. Ok(path)
  99. }
  100. #[test]
  101. fn load_and_save_tasks() -> TaudResult<()> {
  102. let settings = Settings { dataset_path: get_path()? };
  103. // load and save TaskInfo
  104. ///////////////////////
  105. let mut task = TaskInfo::new("test_title", "test_desc", None, 0.0, &settings)?;
  106. task.save()?;
  107. let t_load = TaskInfo::load(&task.get_ref_id(), &settings)?;
  108. assert_eq!(task, t_load);
  109. task.set_title("test_title_2");
  110. task.save()?;
  111. let t_load = TaskInfo::load(&task.get_ref_id(), &settings)?;
  112. assert_eq!(task, t_load);
  113. // load and save MonthTasks
  114. ///////////////////////
  115. let task_tks = vec![];
  116. let mut mt = MonthTasks::new(&task_tks, &settings);
  117. mt.save()?;
  118. let mt_load = MonthTasks::load_or_create(&get_current_time(), &settings)?;
  119. assert_eq!(mt, mt_load);
  120. mt.add(&task.get_ref_id());
  121. mt.save()?;
  122. let mt_load = MonthTasks::load_or_create(&get_current_time(), &settings)?;
  123. assert_eq!(mt, mt_load);
  124. // activate task
  125. ///////////////////////
  126. let task = TaskInfo::new("test_title_3", "test_desc", None, 0.0, &settings)?;
  127. task.save()?;
  128. let mt_load = MonthTasks::load_or_create(&get_current_time(), &settings)?;
  129. assert!(!mt_load.get_task_tks().contains(&task.get_ref_id()));
  130. task.activate()?;
  131. let mt_load = MonthTasks::load_or_create(&get_current_time(), &settings)?;
  132. assert!(mt_load.get_task_tks().contains(&task.get_ref_id()));
  133. remove_dir_all(TEST_DATA_PATH).ok();
  134. Ok(())
  135. }
  136. }