def test_getinfo_not_getinfo():
    db_conn = get_db()
    # not a GetInfo
    gi = SignedMessage.sign(Stub(1), SK1)
    gir = server.handle_getinfo(db_conn, gi)
    assert isinstance(gir, getinfo.GetInfoResp)
    assert not gir.ok
    assert gir.err == getinfo.GetInfoRespErr.Malformed
def test_getinfo_notimpl():
    db_conn = get_db()
    u = db.user_with_pk(db_conn, U1.pk)
    ecred = get_cred(u)
    gi = SignedMessage.sign(getinfo.GetInfo(U2.pk, ecred), SK1)
    gir = server.handle_getinfo(db_conn, gi)
    assert isinstance(gir, getinfo.GetInfoResp)
    assert not gir.ok
    assert gir.err == getinfo.GetInfoRespErr.NotImpl
def test_getinfoloc_happy_default():
    db_conn = get_db()
    u_me = db.user_with_pk(db_conn, U1.pk)
    u_other = db.user_with_pk(db_conn, U2.pk)
    insert_many_locs(db_conn, u_other)
    ecred = get_cred(u_me)
    gi = SignedMessage.sign(getinfo.GetInfoLocation(u_other.pk, ecred), SK1)
    gir = server.handle_getinfo(db_conn, gi)
    assert gir.ok
    assert gir.err is None
    assert len(gir.locs) == 1
def test_getinfo_unknown_user_in_req():
    db_conn = get_db()
    # ask about a user with a pubkey that doesn't exist
    fake_pk = crypto.Pubkey((98345).to_bytes(32, byteorder='big'))
    u = db.user_with_pk(db_conn, U1.pk)
    ecred = get_cred(u)
    gi = SignedMessage.sign(getinfo.GetInfo(fake_pk, ecred), SK1)
    gir = server.handle_getinfo(db_conn, gi)
    assert isinstance(gir, getinfo.GetInfoResp)
    assert not gir.ok
    assert gir.err == getinfo.GetInfoRespErr.NoSuchUser
def test_getinfo_badcred():
    db_conn = get_db()
    u = db.user_with_pk(db_conn, U1.pk)
    ecred = get_cred(u)
    # munge the cred so it isn't valid
    ecred.ctext_nonce = b'0000000000000000000000000'
    gi = SignedMessage.sign(getinfo.GetInfo(u.pk, ecred), SK1)
    gir = server.handle_getinfo(db_conn, gi)
    assert isinstance(gir, getinfo.GetInfoResp)
    assert not gir.ok
    assert gir.err == CredChalErr.Malformed
def test_getinfo_badsig():
    db_conn = get_db()
    u = db.user_with_pk(db_conn, U1.pk)
    ecred = get_cred(u)
    gi = SignedMessage.sign(getinfo.GetInfo(u.pk, ecred), SK1)
    # munge the signed message so it doesn't verify
    gi.msg_bytes = b'nnnnnnnnnnnnnnnnnnnnnnnnaaaaaaaaaaaa'
    gir = server.handle_getinfo(db_conn, gi)
    assert isinstance(gir, getinfo.GetInfoResp)
    assert not gir.ok
    assert gir.err == SignedMessageErr.BadSig
def test_getinfo_unknown_user():
    db_conn = get_db()
    u = db.user_with_pk(db_conn, U1.pk)
    ecred = get_cred(u)
    # user who signed this message is not even in the db
    fake_sk = crypto.Seckey((1).to_bytes(32, byteorder='big'))
    gi = SignedMessage.sign(getinfo.GetInfo(u.pk, ecred), fake_sk)
    gir = server.handle_getinfo(db_conn, gi)
    assert isinstance(gir, getinfo.GetInfoResp)
    assert not gir.ok
    assert gir.err == SignedMessageErr.UnknownUser
def test_getinfoloc_multiple_count_correct_3():
    db_conn = get_db()
    u_me = db.user_with_pk(db_conn, U1.pk)
    u_other = db.user_with_pk(db_conn, U2.pk)
    num_locs = insert_many_locs(db_conn, u_other)
    ecred = get_cred(u_me)
    gi = SignedMessage.sign(
        getinfo.GetInfoLocation(u_other.pk, ecred, count=num_locs + 10), SK1)
    gir = server.handle_getinfo(db_conn, gi)
    assert gir.ok
    assert gir.err is None
    assert len(gir.locs) == num_locs
def test_getinfoloc_multiple_order_correct_2():
    db_conn = get_db()
    u_me = db.user_with_pk(db_conn, U1.pk)
    u_other = db.user_with_pk(db_conn, U2.pk)
    insert_many_locs(db_conn, u_other)
    # when asking for newest=False, we should get the oldest location first,
    # thus it should have the min time of all locations
    min_time = min(
        [loc.time for loc in db.locations_for_user(db_conn, u_other)])
    ecred = get_cred(u_me)
    gi = SignedMessage.sign(
        getinfo.GetInfoLocation(u_other.pk, ecred, count=1, newest=False), SK1)
    gir = server.handle_getinfo(db_conn, gi)
    assert gir.ok
    assert gir.err is None
    assert len(gir.locs) == 1
    assert gir.locs[0].time == min_time
def test_getinfoloc_multiple_order_correct_3():
    db_conn = get_db()
    u_me = db.user_with_pk(db_conn, U1.pk)
    u_other = db.user_with_pk(db_conn, U2.pk)
    num_locs = insert_many_locs(db_conn, u_other)
    # when not asking for a specfic order, we get the newest location first,
    # every subsequent location should have a smaller time
    ecred = get_cred(u_me)
    gi = SignedMessage.sign(
        getinfo.GetInfoLocation(u_other.pk, ecred, count=num_locs), SK1)
    gir = server.handle_getinfo(db_conn, gi)
    assert gir.ok
    assert gir.err is None
    assert len(gir.locs) == num_locs
    last_time = 999999999999999
    for loc in gir.locs:
        assert loc.time < last_time
        last_time = loc.time