lspf 0.9.1

A Rust framework for building extensible LSP language servers
Documentation
use std::time::Duration;

use lspf::{ResourcePolicy, ResourcePolicyField, Server};

fn build_error(policy: ResourcePolicy) -> lspf::BuildError {
    Server::builder(())
        .resource_policy(policy)
        .build()
        .err()
        .expect("an invalid resource policy must fail the build")
}

#[test]
fn production_resource_defaults_are_finite_and_buildable() {
    let policy = ResourcePolicy::default();

    assert_eq!(
        policy,
        ResourcePolicy {
            max_inbound_requests: 64,
            max_outbound_messages: 1_024,
            max_outbound_bytes: 16 * 1024 * 1024,
            max_documents: 1_024,
            max_document_bytes: 64 * 1024 * 1024,
            outbound_request_timeout: Some(Duration::from_secs(30)),
            handler_timeout: Duration::from_secs(30),
        }
    );

    Server::builder(())
        .resource_policy(policy)
        .build()
        .expect("the production resource policy builds");
}

#[test]
fn explicitly_disabled_outbound_request_deadline_is_buildable() {
    let policy = ResourcePolicy {
        outbound_request_timeout: None,
        ..ResourcePolicy::default()
    };

    Server::builder(())
        .resource_policy(policy)
        .build()
        .expect("an explicitly disabled outbound request deadline builds");
}

#[test]
fn zero_handler_deadline_fails_server_build() {
    let policy = ResourcePolicy {
        handler_timeout: Duration::ZERO,
        ..ResourcePolicy::default()
    };

    let error = Server::builder(())
        .resource_policy(policy)
        .build()
        .err()
        .expect("a zero handler deadline must fail the build");

    assert_eq!(
        error.to_string(),
        "resource policy `handler_timeout` must be greater than zero when enabled"
    );
}

#[test]
fn every_zero_connection_budget_fails_server_build() {
    let cases = [
        (
            ResourcePolicyField::MaxInboundRequests,
            ResourcePolicy {
                max_inbound_requests: 0,
                ..ResourcePolicy::default()
            },
        ),
        (
            ResourcePolicyField::MaxOutboundMessages,
            ResourcePolicy {
                max_outbound_messages: 0,
                ..ResourcePolicy::default()
            },
        ),
        (
            ResourcePolicyField::MaxOutboundBytes,
            ResourcePolicy {
                max_outbound_bytes: 0,
                ..ResourcePolicy::default()
            },
        ),
        (
            ResourcePolicyField::MaxDocuments,
            ResourcePolicy {
                max_documents: 0,
                ..ResourcePolicy::default()
            },
        ),
        (
            ResourcePolicyField::MaxDocumentBytes,
            ResourcePolicy {
                max_document_bytes: 0,
                ..ResourcePolicy::default()
            },
        ),
    ];

    for (field, policy) in cases {
        assert_eq!(
            build_error(policy),
            lspf::BuildError::InvalidResourcePolicy { field }
        );
    }
}

#[test]
fn zero_outbound_request_deadline_fails_server_build() {
    let policy = ResourcePolicy {
        outbound_request_timeout: Some(Duration::ZERO),
        ..ResourcePolicy::default()
    };

    assert_eq!(
        build_error(policy),
        lspf::BuildError::InvalidResourcePolicy {
            field: ResourcePolicyField::OutboundRequestTimeout
        }
    );
}