hyperdex 1.0.0

Rust binding for HyperDex, the next-generation distributed key-value store
use std::collections::HashMap;
use std::str::FromStr;

use super::*;
use super::HyperValue::*;
use super::HyperPredicateType::*;
use hyperdex_client::*;

static coord_addr: &'static str = "127.0.0.1:1982";

static space_name: &'static str = "contacts";

static space_desc: &'static str = "
space contacts
key username
attributes first, last, int age
subspace first, last
create 2 partitions
tolerate 2 failures";

#[test]
fn test_add_and_rm_space() {
    let admin = Admin::new(FromStr::from_str(coord_addr).unwrap()).unwrap();

    match admin.add_space(space_desc) {
        Ok(()) => (),
        Err(err) => panic!(format!("{}", err)),
    };

    admin.remove_space(space_name).unwrap();
}

#[test]
fn test_get_nonexistent_objects() {
    let admin = Admin::new(FromStr::from_str(coord_addr).unwrap()).unwrap();

    match admin.add_space(space_desc) {
        Ok(()) => (),
        Err(err) => panic!(format!("{}", err)),
    };

    let mut client = Client::new(FromStr::from_str(coord_addr).unwrap()).unwrap();
    match client.get(space_name, "lol") {
        Ok(obj) => panic!("wrongly getting an object: {:?}", obj),
        Err(err) => assert!(err.status == HYPERDEX_CLIENT_NOTFOUND),
    }

    admin.remove_space(space_name).unwrap();
}

#[test]
fn test_add_and_get_objects() {
    let admin = Admin::new(FromStr::from_str(coord_addr).unwrap()).unwrap();
    match admin.add_space(space_desc) {
        Ok(()) => (),
        Err(err) => panic!(format!("{}", err)),
    };

    let mut client = Client::new(FromStr::from_str(coord_addr).unwrap()).unwrap();
    match client.put(space_name, "derek", NewHyperObject!(
        "first", "Derek",
        "last", "Chiang",
    )) {
        Ok(()) => (),
        Err(err) => panic!(err),
    }

    match client.get(space_name, "derek") {
        Ok(mut obj) => {
            let first: Vec<u8> = match obj.get("first") {
                Ok(s) => s,
                Err(err) => panic!(err),
            };

            let last: Vec<u8> = match obj.get("last") {
                Ok(s) => s,
                Err(err) => panic!(err),
            };

            assert_eq!(first, "Derek".as_bytes());
            assert_eq!(last, "Chiang".as_bytes());
        },
        Err(err) => panic!(err),
    }

    admin.remove_space(space_name).unwrap();
}

#[test]
fn test_add_and_search_objects() {
    let admin = Admin::new(FromStr::from_str(coord_addr).unwrap()).unwrap();
    match admin.add_space(space_desc) {
        Ok(()) => (),
        Err(err) => panic!(format!("{}", err)),
    };

    let mut client = Client::new(FromStr::from_str(coord_addr).unwrap()).unwrap();

    match client.put(space_name, "derek", NewHyperObject!(
        "first", "Derek",
        "last", "Chiang",
        "age", 20,
    )) {
        Ok(()) => (),
        Err(err) => panic!(err),
    }

    match client.put(space_name, "robert", NewHyperObject!(
        "first", "Robert",
        "last", "Escriva",
        "age", 25,
    )) {
        Ok(()) => (),
        Err(err) => panic!(err),
    }

    let mut obj = HyperObject::new();
    obj.insert("first", "Emin");
    obj.insert("last", "Sirer");
    obj.insert("age", 30);

    let fut = client.async_put(space_name, "emin", obj);
    match fut.into_inner() {
        Ok(()) => (),
        Err(err) => panic!(err),
    }

    let predicates = vec!(HyperPredicate::new("age", LESS_EQUAL, 25));

    let res = client.search(space_name, predicates);

    for obj_res in res.iter() {
        let obj = obj_res.unwrap();
        let name: Vec<u8> = obj.get("first").unwrap();
        let age: i64 = obj.get("age").unwrap();
        assert!(age <= 25);
        println!("{:?} is {} years old", name, age);
    }

    admin.remove_space(space_name).unwrap();
}