Added language to session.
This commit is contained in:
parent
2c9b08c77d
commit
804a539a04
@ -11,6 +11,8 @@ pub enum MsgType {
|
|||||||
Document,
|
Document,
|
||||||
DocumentRequest,
|
DocumentRequest,
|
||||||
Error,
|
Error,
|
||||||
|
Session,
|
||||||
|
SessionGet,
|
||||||
SessionValidate,
|
SessionValidate,
|
||||||
SessionValidated,
|
SessionValidated,
|
||||||
Time,
|
Time,
|
||||||
|
|||||||
122
src/session.rs
122
src/session.rs
@ -3,6 +3,7 @@ use crate::{
|
|||||||
queue::{Message, MsgType, Queue},
|
queue::{Message, MsgType, Queue},
|
||||||
};
|
};
|
||||||
use chrono::prelude::*;
|
use chrono::prelude::*;
|
||||||
|
use isolang::Language;
|
||||||
use std::{
|
use std::{
|
||||||
collections::HashMap,
|
collections::HashMap,
|
||||||
sync::mpsc::{channel, Receiver},
|
sync::mpsc::{channel, Receiver},
|
||||||
@ -12,16 +13,23 @@ use std::{
|
|||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
const EXPIRE_IN: Duration = Duration::from_secs(60 * 60);
|
const EXPIRE_IN: Duration = Duration::from_secs(60 * 60);
|
||||||
const RESPONDS_TO: [MsgType; 2] = [MsgType::SessionValidate, MsgType::Time];
|
const RESPONDS_TO: [MsgType; 3] = [MsgType::SessionGet, MsgType::SessionValidate, MsgType::Time];
|
||||||
|
const DEFAULT_LANG: Language = Language::Eng;
|
||||||
|
|
||||||
struct SessionData {
|
struct SessionData {
|
||||||
expire_on: DateTime<Utc>,
|
expire_on: DateTime<Utc>,
|
||||||
|
language: Language,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SessionData {
|
impl SessionData {
|
||||||
fn new() -> Self {
|
fn new(lang: Option<Language>) -> Self {
|
||||||
|
let session_lang = match lang {
|
||||||
|
Some(data) => data.clone(),
|
||||||
|
None => DEFAULT_LANG,
|
||||||
|
};
|
||||||
Self {
|
Self {
|
||||||
expire_on: Utc::now() + EXPIRE_IN,
|
expire_on: Utc::now() + EXPIRE_IN,
|
||||||
|
language: session_lang,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,7 +49,7 @@ mod sessiondatas {
|
|||||||
#[test]
|
#[test]
|
||||||
fn create_session_data() {
|
fn create_session_data() {
|
||||||
let expire = Utc::now() + EXPIRE_IN;
|
let expire = Utc::now() + EXPIRE_IN;
|
||||||
let data = SessionData::new();
|
let data = SessionData::new(None);
|
||||||
assert!(
|
assert!(
|
||||||
data.expire_on > expire,
|
data.expire_on > expire,
|
||||||
"{:?} should be greater than {:?}",
|
"{:?} should be greater than {:?}",
|
||||||
@ -52,7 +60,7 @@ mod sessiondatas {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn extend_usage_time() {
|
fn extend_usage_time() {
|
||||||
let mut data = SessionData::new();
|
let mut data = SessionData::new(None);
|
||||||
let expire = Utc::now() + EXPIRE_IN;
|
let expire = Utc::now() + EXPIRE_IN;
|
||||||
data.extend();
|
data.extend();
|
||||||
assert!(
|
assert!(
|
||||||
@ -65,7 +73,7 @@ mod sessiondatas {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn is_expired() {
|
fn is_expired() {
|
||||||
let data = SessionData::new();
|
let data = SessionData::new(None);
|
||||||
let expire = Utc::now() + EXPIRE_IN;
|
let expire = Utc::now() + EXPIRE_IN;
|
||||||
assert!(data.is_expired(&expire), "should be expired");
|
assert!(data.is_expired(&expire), "should be expired");
|
||||||
}
|
}
|
||||||
@ -73,9 +81,24 @@ mod sessiondatas {
|
|||||||
#[test]
|
#[test]
|
||||||
fn is_not_expired() {
|
fn is_not_expired() {
|
||||||
let expire = Utc::now() + EXPIRE_IN;
|
let expire = Utc::now() + EXPIRE_IN;
|
||||||
let data = SessionData::new();
|
let data = SessionData::new(None);
|
||||||
assert!(!data.is_expired(&expire), "should be not expired");
|
assert!(!data.is_expired(&expire), "should be not expired");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn english_is_the_default_language() {
|
||||||
|
let data = SessionData::new(None);
|
||||||
|
assert_eq!(data.language, DEFAULT_LANG);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn assign_language() {
|
||||||
|
let langs = [Language::Jpn, Language::Deu];
|
||||||
|
for lang in langs.into_iter() {
|
||||||
|
let data = SessionData::new(Some(lang.clone()));
|
||||||
|
assert_eq!(data.language, lang);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Session {
|
pub struct Session {
|
||||||
@ -106,6 +129,7 @@ impl Session {
|
|||||||
loop {
|
loop {
|
||||||
let msg = self.rx.recv().unwrap();
|
let msg = self.rx.recv().unwrap();
|
||||||
match msg.get_msg_type() {
|
match msg.get_msg_type() {
|
||||||
|
MsgType::SessionGet => self.get(msg),
|
||||||
MsgType::SessionValidate => self.validate(msg),
|
MsgType::SessionValidate => self.validate(msg),
|
||||||
MsgType::Time => self.expire(msg),
|
MsgType::Time => self.expire(msg),
|
||||||
_ => unreachable!("received unknown message"),
|
_ => unreachable!("received unknown message"),
|
||||||
@ -135,7 +159,11 @@ impl Session {
|
|||||||
while self.data.contains_key(&id) {
|
while self.data.contains_key(&id) {
|
||||||
id = Uuid::new_v4();
|
id = Uuid::new_v4();
|
||||||
}
|
}
|
||||||
self.data.insert(id.clone(), SessionData::new());
|
let req_lang = match msg.get_data("language") {
|
||||||
|
Some(data) => Some(data.to_language().unwrap().clone()),
|
||||||
|
None => None,
|
||||||
|
};
|
||||||
|
self.data.insert(id.clone(), SessionData::new(req_lang));
|
||||||
let mut reply = msg.reply_with_data(MsgType::SessionValidated);
|
let mut reply = msg.reply_with_data(MsgType::SessionValidated);
|
||||||
reply.add_data("sess_id", id);
|
reply.add_data("sess_id", id);
|
||||||
self.queue.send(reply).unwrap();
|
self.queue.send(reply).unwrap();
|
||||||
@ -153,6 +181,14 @@ impl Session {
|
|||||||
self.data.remove(id);
|
self.data.remove(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get(&self, msg: Message) {
|
||||||
|
let sess_id = msg.get_data("sess_id").unwrap().to_uuid().unwrap();
|
||||||
|
let sess_data = self.data.get(&sess_id).unwrap();
|
||||||
|
let mut reply = msg.reply(MsgType::Session);
|
||||||
|
reply.add_data("language", sess_data.language.clone());
|
||||||
|
self.queue.send(reply);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@ -169,16 +205,21 @@ pub mod sessions {
|
|||||||
reply
|
reply
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup_session(listen_for: Vec<MsgType>) -> (Queue, Receiver<Message>) {
|
fn setup_session() -> (Queue, Receiver<Message>) {
|
||||||
let queue = Queue::new();
|
let queue = Queue::new();
|
||||||
let (tx, rx) = channel();
|
let (tx, rx) = channel();
|
||||||
|
let listen_for = [MsgType::Session, MsgType::SessionValidated].to_vec();
|
||||||
queue.add(tx, listen_for);
|
queue.add(tx, listen_for);
|
||||||
Session::start(queue.clone());
|
Session::start(queue.clone());
|
||||||
(queue, rx)
|
(queue, rx)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_session(queue: &Queue, rx: &Receiver<Message>) -> Uuid {
|
fn create_session(queue: &Queue, rx: &Receiver<Message>, lang: Option<Language>) -> Uuid {
|
||||||
let msg = Message::new(MsgType::SessionValidate);
|
let mut msg = Message::new(MsgType::SessionValidate);
|
||||||
|
match lang {
|
||||||
|
Some(data) => msg.add_data("language", data.clone()),
|
||||||
|
None => {},
|
||||||
|
}
|
||||||
queue.send(msg.clone()).unwrap();
|
queue.send(msg.clone()).unwrap();
|
||||||
let holder = rx.recv_timeout(TIMEOUT).unwrap();
|
let holder = rx.recv_timeout(TIMEOUT).unwrap();
|
||||||
holder.get_data("sess_id").unwrap().to_uuid().unwrap()
|
holder.get_data("sess_id").unwrap().to_uuid().unwrap()
|
||||||
@ -187,8 +228,7 @@ pub mod sessions {
|
|||||||
#[test]
|
#[test]
|
||||||
fn get_new_session() {
|
fn get_new_session() {
|
||||||
let id = Uuid::new_v4();
|
let id = Uuid::new_v4();
|
||||||
let listen_for = [MsgType::SessionValidated];
|
let (queue, rx) = setup_session();
|
||||||
let (queue, rx) = setup_session(listen_for.to_vec());
|
|
||||||
let mut msg = Message::new(MsgType::SessionValidate);
|
let mut msg = Message::new(MsgType::SessionValidate);
|
||||||
msg.add_data(id, id);
|
msg.add_data(id, id);
|
||||||
queue.send(msg.clone()).unwrap();
|
queue.send(msg.clone()).unwrap();
|
||||||
@ -206,8 +246,7 @@ pub mod sessions {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn session_id_is_unique() {
|
fn session_id_is_unique() {
|
||||||
let listen_for = [MsgType::SessionValidated];
|
let (queue, rx) = setup_session();
|
||||||
let (queue, rx) = setup_session(listen_for.to_vec());
|
|
||||||
let msg = Message::new(MsgType::SessionValidate);
|
let msg = Message::new(MsgType::SessionValidate);
|
||||||
let mut ids: Vec<Uuid> = Vec::new();
|
let mut ids: Vec<Uuid> = Vec::new();
|
||||||
for _ in 0..10 {
|
for _ in 0..10 {
|
||||||
@ -222,9 +261,8 @@ pub mod sessions {
|
|||||||
#[test]
|
#[test]
|
||||||
fn existing_id_is_returned() {
|
fn existing_id_is_returned() {
|
||||||
let add_data = Uuid::new_v4();
|
let add_data = Uuid::new_v4();
|
||||||
let listen_for = [MsgType::SessionValidated];
|
let (queue, rx) = setup_session();
|
||||||
let (queue, rx) = setup_session(listen_for.to_vec());
|
let id = create_session(&queue, &rx, None);
|
||||||
let id = create_session(&queue, &rx);
|
|
||||||
let mut msg = Message::new(MsgType::SessionValidate);
|
let mut msg = Message::new(MsgType::SessionValidate);
|
||||||
msg.add_data("sess_id", id.clone());
|
msg.add_data("sess_id", id.clone());
|
||||||
msg.add_data(add_data, add_data);
|
msg.add_data(add_data, add_data);
|
||||||
@ -241,8 +279,7 @@ pub mod sessions {
|
|||||||
#[test]
|
#[test]
|
||||||
fn issue_new_if_validated_doe_not_exist() {
|
fn issue_new_if_validated_doe_not_exist() {
|
||||||
let id = Uuid::new_v4();
|
let id = Uuid::new_v4();
|
||||||
let listen_for = [MsgType::SessionValidated];
|
let (queue, rx) = setup_session();
|
||||||
let (queue, rx) = setup_session(listen_for.to_vec());
|
|
||||||
let mut msg = Message::new(MsgType::SessionValidate);
|
let mut msg = Message::new(MsgType::SessionValidate);
|
||||||
msg.add_data("sess_id", id.clone());
|
msg.add_data("sess_id", id.clone());
|
||||||
queue.send(msg).unwrap();
|
queue.send(msg).unwrap();
|
||||||
@ -254,8 +291,7 @@ pub mod sessions {
|
|||||||
#[test]
|
#[test]
|
||||||
fn new_for_bad_uuid() {
|
fn new_for_bad_uuid() {
|
||||||
let id = "bad uuid";
|
let id = "bad uuid";
|
||||||
let listen_for = [MsgType::SessionValidated];
|
let (queue, rx) = setup_session();
|
||||||
let (queue, rx) = setup_session(listen_for.to_vec());
|
|
||||||
let mut msg = Message::new(MsgType::SessionValidate);
|
let mut msg = Message::new(MsgType::SessionValidate);
|
||||||
msg.add_data("sess_id", id);
|
msg.add_data("sess_id", id);
|
||||||
queue.send(msg).unwrap();
|
queue.send(msg).unwrap();
|
||||||
@ -267,9 +303,8 @@ pub mod sessions {
|
|||||||
#[test]
|
#[test]
|
||||||
fn timer_does_nothing_to_unexpired() {
|
fn timer_does_nothing_to_unexpired() {
|
||||||
let expire = Utc::now() + EXPIRE_IN;
|
let expire = Utc::now() + EXPIRE_IN;
|
||||||
let listen_for = [MsgType::SessionValidated];
|
let (queue, rx) = setup_session();
|
||||||
let (queue, rx) = setup_session(listen_for.to_vec());
|
let id = create_session(&queue, &rx, None);
|
||||||
let id = create_session(&queue, &rx);
|
|
||||||
let mut time_msg = Message::new(MsgType::Time);
|
let mut time_msg = Message::new(MsgType::Time);
|
||||||
time_msg.add_data("time", expire);
|
time_msg.add_data("time", expire);
|
||||||
queue.send(time_msg).unwrap();
|
queue.send(time_msg).unwrap();
|
||||||
@ -282,9 +317,8 @@ pub mod sessions {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn timer_removes_expired() {
|
fn timer_removes_expired() {
|
||||||
let listen_for = [MsgType::SessionValidated];
|
let (queue, rx) = setup_session();
|
||||||
let (queue, rx) = setup_session(listen_for.to_vec());
|
let id = create_session(&queue, &rx, None);
|
||||||
let id = create_session(&queue, &rx);
|
|
||||||
let expire = Utc::now() + EXPIRE_IN;
|
let expire = Utc::now() + EXPIRE_IN;
|
||||||
let mut time_msg = Message::new(MsgType::Time);
|
let mut time_msg = Message::new(MsgType::Time);
|
||||||
time_msg.add_data("time", expire);
|
time_msg.add_data("time", expire);
|
||||||
@ -298,9 +332,8 @@ pub mod sessions {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn validate_extends_session() {
|
fn validate_extends_session() {
|
||||||
let listen_for = [MsgType::SessionValidated];
|
let (queue, rx) = setup_session();
|
||||||
let (queue, rx) = setup_session(listen_for.to_vec());
|
let id = create_session(&queue, &rx, None);
|
||||||
let id = create_session(&queue, &rx);
|
|
||||||
let mut validate_msg = Message::new(MsgType::SessionValidate);
|
let mut validate_msg = Message::new(MsgType::SessionValidate);
|
||||||
validate_msg.add_data("sess_id", id.clone());
|
validate_msg.add_data("sess_id", id.clone());
|
||||||
let expire = Utc::now() + EXPIRE_IN;
|
let expire = Utc::now() + EXPIRE_IN;
|
||||||
@ -313,4 +346,33 @@ pub mod sessions {
|
|||||||
let result = rx.recv_timeout(TIMEOUT).unwrap();
|
let result = rx.recv_timeout(TIMEOUT).unwrap();
|
||||||
assert_eq!(result.get_data("sess_id").unwrap().to_uuid().unwrap(), id);
|
assert_eq!(result.get_data("sess_id").unwrap().to_uuid().unwrap(), id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn get_session_information() {
|
||||||
|
let (queue, rx) = setup_session();
|
||||||
|
let id = create_session(&queue, &rx, None);
|
||||||
|
let mut msg = Message::new(MsgType::SessionGet);
|
||||||
|
msg.add_data("sess_id", id.clone());
|
||||||
|
queue.send(msg.clone());
|
||||||
|
let reply = rx.recv_timeout(TIMEOUT).unwrap();
|
||||||
|
assert_eq!(reply.get_id(), msg.get_id());
|
||||||
|
assert_eq!(reply.get_msg_type(), &MsgType::Session);
|
||||||
|
assert_eq!(reply.get_data("language").unwrap().to_language().unwrap(), DEFAULT_LANG);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn get_requested_langaages() {
|
||||||
|
let langs = [Language::Jpn, Language::Deu];
|
||||||
|
let (queue, rx) = setup_session();
|
||||||
|
for lang in langs.into_iter() {
|
||||||
|
let id = create_session(&queue, &rx, Some(lang.clone()));
|
||||||
|
let mut msg = Message::new(MsgType::SessionGet);
|
||||||
|
msg.add_data("sess_id", id.clone());
|
||||||
|
queue.send(msg.clone());
|
||||||
|
let reply = rx.recv_timeout(TIMEOUT).unwrap();
|
||||||
|
assert_eq!(reply.get_id(), msg.get_id());
|
||||||
|
assert_eq!(reply.get_msg_type(), &MsgType::Session);
|
||||||
|
assert_eq!(reply.get_data("language").unwrap().to_language().unwrap(), lang);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user