Skip to content

Add scheduler boundary tests#196

Merged
leynos merged 2 commits intomainfrom
codex/add-boundary-case-tests-for-scheduler
Jul 7, 2025
Merged

Add scheduler boundary tests#196
leynos merged 2 commits intomainfrom
codex/add-boundary-case-tests-for-scheduler

Conversation

@leynos
Copy link
Copy Markdown
Owner

@leynos leynos commented Jul 7, 2025

Summary

  • add boundary cases for high-only and low-only push queues
  • generate expected output dynamically

Testing

  • make fmt
  • make lint
  • make test

https://chatgpt.com/codex/tasks/task_e_686c206e925c8322b95f363cc1e8574f

Summary by Sourcery

Add dynamic expected output generation and boundary tests for the scheduler’s fairness-disabled priority queues

Enhancements:

  • Refactor the fairness-disabled priority processing test to use a dynamic queue_frames helper instead of hardcoded sequences

Tests:

  • Add queue_frames helper to generate expected output dynamically for priority push queues
  • Add boundary test cases for high-only and low-only priority sequences in fairness-disabled processing

@sourcery-ai
Copy link
Copy Markdown
Contributor

sourcery-ai Bot commented Jul 7, 2025

Reviewer's Guide

Introduces a reusable helper to dynamically compute expected output for fairness-disabled scheduler tests and adds boundary test cases for high-only and low-only priority scenarios, simplifying the existing test by replacing hardcoded sequences with a call to the new helper.

File-Level Changes

Change Details Files
Add queue_frames helper to generate expected output dynamically
  • Define async fn queue_frames(order, handle, high_count)
  • Compute next_high and next_low counters
  • Push frames based on priority and collect highs and lows
  • Return concatenated vector of frame values
tests/connection_actor.rs
Refactor fairness-disabled test to use queue_frames and add boundary cases
  • Rename test to processes_all_priorities_in_order
  • Remove manual push loop and hardcoded expected vector
  • Compute high_count and call queue_frames for expected output
  • Add #[case] attributes for high-only and low-only scenarios
tests/connection_actor.rs

Possibly linked issues

  • #0: PR adds tests for high-only/low-only scheduler queues, directly fulfilling the issue.

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jul 7, 2025

Warning

Rate limit exceeded

@leynos has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 7 minutes and 34 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between a4cb5d6 and ebfe944.

📒 Files selected for processing (1)
  • tests/connection_actor.rs (2 hunks)

Summary by CodeRabbit

  • Tests
    • Expanded test coverage with additional cases for all-high and all-low priority sequences.
    • Improved test logic to dynamically handle varying numbers of high and low priority frames.
    • Updated assertions to match dynamically generated expected outputs.

Walkthrough

The test fairness_disabled_processes_all_high_first in tests/connection_actor.rs was expanded to include cases for all-high and all-low priority sequences. The logic for assigning frame identifiers was generalised to dynamically match the input order, and expected outputs are now constructed based on these dynamic assignments.

Changes

File(s) Change Summary
tests/connection_actor.rs Extended test with additional cases for all-high and all-low priorities; generalised frame numbering and assertions

Sequence Diagram(s)

sequenceDiagram
    participant Test as Test Function
    participant FrameGen as Frame Number Generator
    participant Assert as Assertion

    Test->>FrameGen: Determine number of high/low priorities in input order
    FrameGen-->>Test: Generate dynamic frame numbers for highs and lows
    Test->>Test: Push frames using generated numbers
    Test->>Assert: Construct expected output vector dynamically
    Assert-->>Test: Compare actual and expected outputs
Loading

Possibly related issues

Possibly related PRs

Poem

A bunny hopped through tests anew,
With highs and lows in ordered queue.
No numbers fixed, the code’s now wise—
Dynamic frames, a neat surprise!
All-high, all-low, the cases grow,
The garden of fairness starts to show.
🐇✨

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch codex/add-boundary-case-tests-for-scheduler

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai auto-generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Copy Markdown
Contributor

@sourcery-ai sourcery-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @leynos - I've reviewed your changes - here's some feedback:

  • The expected output builder uses low-level iterator arithmetic which makes the test harder to follow; consider extracting a small helper or using a simple map with two counters to generate the expected sequence more declaratively.
  • The test function name fairness_disabled_processes_all_high_first no longer accurately reflects that it covers both high-only and low-only scenarios; renaming it to something more general (e.g., processes_all_priorities_in_order) would improve clarity.
  • The new #[case] attributes for homogeneous sequences can be simplified with vec![Priority::High; 3] and vec![Priority::Low; 3] instead of manually repeating each element.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- The expected output builder uses low-level iterator arithmetic which makes the test harder to follow; consider extracting a small helper or using a simple map with two counters to generate the expected sequence more declaratively.
- The test function name `fairness_disabled_processes_all_high_first` no longer accurately reflects that it covers both high-only and low-only scenarios; renaming it to something more general (e.g., `processes_all_priorities_in_order`) would improve clarity.
- The new `#[case]` attributes for homogeneous sequences can be simplified with `vec![Priority::High; 3]` and `vec![Priority::Low; 3]` instead of manually repeating each element.

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

@leynos
Copy link
Copy Markdown
Owner Author

leynos commented Jul 7, 2025

@sourcery-ai review

Copy link
Copy Markdown
Contributor

@sourcery-ai sourcery-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @leynos - I've reviewed your changes and they look great!

Prompt for AI Agents
Please address the comments from this code review:
## Individual Comments

### Comment 1
<location> `tests/connection_actor.rs:91` </location>
<code_context>
+async fn queue_frames(
</code_context>

<issue_to_address>
Consider adding tests for empty input and mixed single-element cases.

Adding tests for empty input and single-element cases will help verify the scheduler's behavior in these edge scenarios.

Suggested implementation:

```rust
async fn queue_frames(
    order: &[Priority],
    handle: &wireframe::push::PushHandle<u8>,
    high_count: usize,
) -> Vec<u8> {
    let mut next_high = 1u8;
    let mut next_low = u8::try_from(high_count).expect("too many high frames") + 1;

    let mut highs = Vec::new();
    let mut lows = Vec::new();

}

// Test for empty input
#[tokio::test]
async fn test_queue_frames_empty_input() {
    let (handle, mut output) = wireframe::push::PushHandle::new();
    let result = queue_frames(&[], &handle, 0).await;
    assert!(result.is_empty(), "Expected empty output for empty input");
}

// Test for single high-priority frame
#[tokio::test]
async fn test_queue_frames_single_high() {
    let (handle, mut output) = wireframe::push::PushHandle::new();
    let result = queue_frames(&[Priority::High], &handle, 1).await;
    assert_eq!(result, vec![1u8], "Expected output to contain only the high-priority frame");
}

// Test for single low-priority frame
#[tokio::test]
async fn test_queue_frames_single_low() {
    let (handle, mut output) = wireframe::push::PushHandle::new();
    let result = queue_frames(&[Priority::Low], &handle, 0).await;
    assert_eq!(result, vec![1u8], "Expected output to contain only the low-priority frame");
}

// Test for mixed single-element case (one high, one low)
#[tokio::test]
async fn test_queue_frames_mixed_single_elements() {
    let (handle, mut output) = wireframe::push::PushHandle::new();
    let result = queue_frames(&[Priority::High, Priority::Low], &handle, 1).await;
    assert_eq!(result, vec![1u8, 2u8], "Expected output to contain high then low frame");
}

```

- Ensure that `wireframe::push::PushHandle::new()` is available and returns a handle suitable for testing.
- If the `queue_frames` function or the test module uses a different async runtime, adjust the test attribute accordingly.
- If the `Priority` enum is not in scope, import it at the top of the file.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment thread tests/connection_actor.rs
Comment on lines +91 to +100
async fn queue_frames(
order: &[Priority],
handle: &wireframe::push::PushHandle<u8>,
high_count: usize,
) -> Vec<u8> {
let mut next_high = 1u8;
let mut next_low = u8::try_from(high_count).expect("too many high frames") + 1;

let mut highs = Vec::new();
let mut lows = Vec::new();
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (testing): Consider adding tests for empty input and mixed single-element cases.

Adding tests for empty input and single-element cases will help verify the scheduler's behavior in these edge scenarios.

Suggested implementation:

async fn queue_frames(
    order: &[Priority],
    handle: &wireframe::push::PushHandle<u8>,
    high_count: usize,
) -> Vec<u8> {
    let mut next_high = 1u8;
    let mut next_low = u8::try_from(high_count).expect("too many high frames") + 1;

    let mut highs = Vec::new();
    let mut lows = Vec::new();

}

// Test for empty input
#[tokio::test]
async fn test_queue_frames_empty_input() {
    let (handle, mut output) = wireframe::push::PushHandle::new();
    let result = queue_frames(&[], &handle, 0).await;
    assert!(result.is_empty(), "Expected empty output for empty input");
}

// Test for single high-priority frame
#[tokio::test]
async fn test_queue_frames_single_high() {
    let (handle, mut output) = wireframe::push::PushHandle::new();
    let result = queue_frames(&[Priority::High], &handle, 1).await;
    assert_eq!(result, vec![1u8], "Expected output to contain only the high-priority frame");
}

// Test for single low-priority frame
#[tokio::test]
async fn test_queue_frames_single_low() {
    let (handle, mut output) = wireframe::push::PushHandle::new();
    let result = queue_frames(&[Priority::Low], &handle, 0).await;
    assert_eq!(result, vec![1u8], "Expected output to contain only the low-priority frame");
}

// Test for mixed single-element case (one high, one low)
#[tokio::test]
async fn test_queue_frames_mixed_single_elements() {
    let (handle, mut output) = wireframe::push::PushHandle::new();
    let result = queue_frames(&[Priority::High, Priority::Low], &handle, 1).await;
    assert_eq!(result, vec![1u8, 2u8], "Expected output to contain high then low frame");
}
  • Ensure that wireframe::push::PushHandle::new() is available and returns a handle suitable for testing.
  • If the queue_frames function or the test module uses a different async runtime, adjust the test attribute accordingly.
  • If the Priority enum is not in scope, import it at the top of the file.

@leynos leynos linked an issue Jul 7, 2025 that may be closed by this pull request
6 tasks
@leynos leynos merged commit 49d71f9 into main Jul 7, 2025
5 checks passed
@leynos leynos deleted the codex/add-boundary-case-tests-for-scheduler branch July 7, 2025 21:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add boundary case tests for scheduler with homogeneous priority queues

1 participant