mirror of
https://github.com/chatmail/core.git
synced 2026-05-06 16:36:59 +03:00
Make dc_accounts_get_all return accounts sorted
HashMap may rearrange all accounts after each insertion and deletion, making it unpredictable where the new account appears.
This commit is contained in:
committed by
link2xt
parent
3ce244b048
commit
b42b1ad99b
@@ -1,4 +1,4 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::BTreeMap;
|
||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use std::task::{Context as TaskContext, Poll};
|
use std::task::{Context as TaskContext, Poll};
|
||||||
@@ -20,7 +20,7 @@ use crate::events::Event;
|
|||||||
pub struct Accounts {
|
pub struct Accounts {
|
||||||
dir: PathBuf,
|
dir: PathBuf,
|
||||||
config: Config,
|
config: Config,
|
||||||
accounts: Arc<RwLock<HashMap<u32, Context>>>,
|
accounts: Arc<RwLock<BTreeMap<u32, Context>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Accounts {
|
impl Accounts {
|
||||||
@@ -342,9 +342,9 @@ impl Config {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn load_accounts(&self) -> Result<HashMap<u32, Context>> {
|
pub async fn load_accounts(&self) -> Result<BTreeMap<u32, Context>> {
|
||||||
let cfg = &*self.inner.read().await;
|
let cfg = &*self.inner.read().await;
|
||||||
let mut accounts = HashMap::with_capacity(cfg.accounts.len());
|
let mut accounts = BTreeMap::new();
|
||||||
for account_config in &cfg.accounts {
|
for account_config in &cfg.accounts {
|
||||||
let ctx = Context::new(
|
let ctx = Context::new(
|
||||||
cfg.os_name.clone(),
|
cfg.os_name.clone(),
|
||||||
@@ -530,4 +530,23 @@ mod tests {
|
|||||||
ctx.get_config(crate::config::Config::Addr).await.unwrap()
|
ctx.get_config(crate::config::Config::Addr).await.unwrap()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Tests that accounts are sorted by ID.
|
||||||
|
#[async_std::test]
|
||||||
|
async fn test_accounts_sorted() {
|
||||||
|
let dir = tempfile::tempdir().unwrap();
|
||||||
|
let p: PathBuf = dir.path().join("accounts").into();
|
||||||
|
|
||||||
|
let accounts = Accounts::new("my_os".into(), p.clone()).await.unwrap();
|
||||||
|
|
||||||
|
for expected_id in 2..10 {
|
||||||
|
let id = accounts.add_account().await.unwrap();
|
||||||
|
assert_eq!(id, expected_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
let ids = accounts.get_all().await;
|
||||||
|
for (i, expected_id) in (1..10).enumerate() {
|
||||||
|
assert_eq!(ids.get(i), Some(&expected_id));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user