Skip to content

Commit 11f8eeb

Browse files
committed
fix bugs & add CI
Signed-off-by: 0oshowero0 <o0shower0o@outlook.com>
1 parent 6c1bca1 commit 11f8eeb

2 files changed

Lines changed: 208 additions & 6 deletions

File tree

tests/test_client.py

Lines changed: 98 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,16 +116,16 @@ def _handle_requests(self):
116116
# Mock consumption status check - all consumed
117117
response_body = {
118118
"partition_id": request_msg.body.get("partition_id"),
119-
"global_index": torch.tensor([0,1,2]),
120-
"consumption_status": torch.tensor([1,1,1]),
119+
"global_index": torch.tensor([0, 1, 2]),
120+
"consumption_status": torch.tensor([1, 1, 1]),
121121
}
122122
response_type = ZMQRequestType.CONSUMPTION_RESPONSE
123123
elif request_msg.request_type == ZMQRequestType.GET_PRODUCTION:
124124
# Mock production status check - all produced
125125
response_body = {
126126
"partition_id": request_msg.body.get("partition_id"),
127-
"global_index": torch.tensor([0,1,2]),
128-
"production_status": torch.tensor([[1,1,1],[1,1,1]]),
127+
"global_index": torch.tensor([0, 1, 2]),
128+
"production_status": torch.tensor([[1, 1, 1], [1, 1, 1]]),
129129
}
130130
response_type = ZMQRequestType.PRODUCTION_RESPONSE
131131
elif request_msg.request_type == ZMQRequestType.GET_LIST_PARTITIONS:
@@ -469,6 +469,52 @@ def test_check_production_status(client_setup):
469469
assert is_produced is True
470470

471471

472+
def test_get_consumption_status(client_setup):
473+
"""Test get_consumption_status - returns global_index and consumption_status tensors"""
474+
client, _, _ = client_setup
475+
476+
# Test synchronous get_consumption_status
477+
global_index, consumption_status = client.get_consumption_status(
478+
task_name="generate_sequences", partition_id="train_0"
479+
)
480+
481+
# Verify return types
482+
assert global_index is not None
483+
assert consumption_status is not None
484+
485+
# Verify global_index contains expected values
486+
assert torch.equal(global_index, torch.tensor([0, 1, 2], dtype=torch.long))
487+
488+
# Verify consumption_status (mock returns all consumed)
489+
expected_status = torch.tensor([1, 1, 1], dtype=torch.int8)
490+
assert torch.equal(consumption_status, expected_status)
491+
492+
print("✓ get_consumption_status returns correct global_index and consumption_status")
493+
494+
495+
def test_get_production_status(client_setup):
496+
"""Test get_production_status - returns global_index and production_status tensors"""
497+
client, _, _ = client_setup
498+
499+
# Test synchronous get_production_status
500+
global_index, production_status = client.get_production_status(
501+
data_fields=["prompt_ids", "attention_mask"], partition_id="train_0"
502+
)
503+
504+
# Verify return types
505+
assert global_index is not None
506+
assert production_status is not None
507+
508+
# Verify global_index contains expected values
509+
assert torch.equal(global_index, torch.tensor([0, 1, 2], dtype=torch.long))
510+
511+
# Verify production_status shape (mock returns 2x3 matrix)
512+
expected_status = torch.tensor([[1, 1, 1], [1, 1, 1]], dtype=torch.int8)
513+
assert torch.equal(production_status, expected_status)
514+
515+
print("✓ get_production_status returns correct global_index and production_status")
516+
517+
472518
def test_get_partition_list(client_setup):
473519
"""Test partition list retrieval"""
474520
client, _, _ = client_setup
@@ -504,6 +550,54 @@ async def test_async_check_production_status(client_setup):
504550
assert is_produced is True
505551

506552

553+
@pytest.mark.asyncio
554+
async def test_async_get_consumption_status(client_setup):
555+
"""Test async get_consumption_status - returns global_index and consumption_status tensors"""
556+
client, _, _ = client_setup
557+
558+
# Test async_get_consumption_status
559+
global_index, consumption_status = await client.async_get_consumption_status(
560+
task_name="generate_sequences", partition_id="train_0"
561+
)
562+
563+
# Verify return types
564+
assert global_index is not None
565+
assert consumption_status is not None
566+
567+
# Verify global_index contains expected values
568+
assert torch.equal(global_index, torch.tensor([0, 1, 2], dtype=torch.long))
569+
570+
# Verify consumption_status (mock returns all consumed)
571+
expected_status = torch.tensor([1, 1, 1], dtype=torch.int8)
572+
assert torch.equal(consumption_status, expected_status)
573+
574+
print("✓ async_get_consumption_status returns correct global_index and consumption_status")
575+
576+
577+
@pytest.mark.asyncio
578+
async def test_async_get_production_status(client_setup):
579+
"""Test async get_production_status - returns global_index and production_status tensors"""
580+
client, _, _ = client_setup
581+
582+
# Test async_get_production_status
583+
global_index, production_status = await client.async_get_production_status(
584+
data_fields=["prompt_ids", "attention_mask"], partition_id="train_0"
585+
)
586+
587+
# Verify return types
588+
assert global_index is not None
589+
assert production_status is not None
590+
591+
# Verify global_index contains expected values
592+
assert torch.equal(global_index, torch.tensor([0, 1, 2], dtype=torch.long))
593+
594+
# Verify production_status shape (mock returns 2x3 matrix)
595+
expected_status = torch.tensor([[1, 1, 1], [1, 1, 1]], dtype=torch.int8)
596+
assert torch.equal(production_status, expected_status)
597+
598+
print("✓ async_get_production_status returns correct global_index and production_status")
599+
600+
507601
@pytest.mark.asyncio
508602
async def test_async_get_partition_list(client_setup):
509603
"""Test async partition list retrieval"""

tests/test_controller_data_partitions.py

Lines changed: 110 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,9 @@ def test_data_partition_status():
8686
print("✓ Field metadata retrieval works")
8787

8888
# Test consumption status
89-
global_index, consumption_tensor = partition.get_consumption_status("test_task", )
89+
global_index, consumption_tensor = partition.get_consumption_status("test_task", mask=False)
9090
assert consumption_tensor is not None
91-
assert consumption_tensor.shape[0] == partition.total_samples_num
91+
assert consumption_tensor.shape[0] == partition.allocated_samples_num
9292

9393
print("✓ Consumption status creation works")
9494

@@ -526,3 +526,111 @@ def test_update_field_metadata_variants():
526526
# Length mismatch should raise ValueError when provided mapping lengths differ from global_indices
527527
with pytest.raises(ValueError):
528528
partition._update_field_metadata([0, 1, 2], dtypes={0: {}}, shapes=None, custom_meta=None)
529+
530+
531+
def test_get_production_status_for_fields():
532+
"""Test get_production_status_for_fields method with mask parameter."""
533+
print("Testing get_production_status_for_fields...")
534+
535+
import torch
536+
537+
from transfer_queue.controller import DataPartitionStatus
538+
539+
partition = DataPartitionStatus(partition_id="production_status_test")
540+
541+
# Add some data first
542+
partition.update_production_status(
543+
global_indices=[0, 1, 2, 3, 4],
544+
field_names=["field_a", "field_b"],
545+
dtypes={i: {"field_a": "torch.int64", "field_b": "torch.bool"} for i in range(5)},
546+
shapes={i: {"field_a": (32,), "field_b": (32,)} for i in range(5)},
547+
)
548+
549+
# Test get_production_status_for_fields WITHOUT mask (mask=False)
550+
global_index, production_status = partition.get_production_status_for_fields(
551+
field_names=["field_a", "field_b"], mask=False
552+
)
553+
# Without mask, should return all allocated samples
554+
assert production_status.shape[0] == partition.allocated_samples_num
555+
# Production status should be 1 for samples 0-4 (produced), 0 for others
556+
# Check that samples 0-4 have all fields produced (all 1s)
557+
assert torch.all(production_status[0:5] == 1), "Samples 0-4 should all be produced"
558+
# Verify shape - should have 2 fields (columns)
559+
assert production_status.shape[1] == 2
560+
561+
print("✓ get_production_status_for_fields without mask works")
562+
563+
# Test get_production_status_for_fields WITH mask (mask=True)
564+
global_index_masked, production_status_masked = partition.get_production_status_for_fields(
565+
field_names=["field_a", "field_b"], mask=True
566+
)
567+
# With mask, should return only global_indexes (0-4)
568+
assert global_index_masked.shape[0] == 5
569+
assert torch.equal(global_index_masked, torch.tensor([0, 1, 2, 3, 4], dtype=torch.long))
570+
# Masked status should be same as original for these indices
571+
assert production_status_masked.shape[0] == 5
572+
assert torch.all(production_status_masked == 1)
573+
574+
print("✓ get_production_status_for_fields with mask works")
575+
576+
# Test get_production_status_for_fields with subset of fields
577+
global_index_subset, production_status_subset = partition.get_production_status_for_fields(
578+
field_names=["field_a"], mask=True
579+
)
580+
assert global_index_subset.shape[0] == 5
581+
assert production_status_subset.shape == (5, 1) # Only one field
582+
583+
print("✓ get_production_status_for_fields with subset fields works")
584+
585+
print("get_production_status_for_fields tests passed!\n")
586+
587+
588+
def test_consumption_status_mask_parameter():
589+
"""Test get_consumption_status method with mask parameter."""
590+
print("Testing consumption status mask parameter...")
591+
592+
import torch
593+
594+
from transfer_queue.controller import DataPartitionStatus
595+
596+
partition = DataPartitionStatus(partition_id="consumption_mask_test")
597+
598+
# Add some data
599+
partition.update_production_status(
600+
global_indices=[0, 1, 2, 3, 4],
601+
field_names=["field_a"],
602+
dtypes={i: {"field_a": "torch.int64"} for i in range(5)},
603+
shapes={i: {"field_a": (32,)} for i in range(5)},
604+
)
605+
606+
# Mark some samples as consumed
607+
partition.mark_consumed("test_task", [0, 2, 4])
608+
609+
# Test get_consumption_status WITHOUT mask (mask=False)
610+
global_index, consumption_status = partition.get_consumption_status("test_task", mask=False)
611+
# Without mask, should return all allocated samples
612+
assert consumption_status.shape[0] == partition.allocated_samples_num
613+
assert consumption_status[0].item() == 1
614+
assert consumption_status[1].item() == 0 # Not consumed
615+
assert consumption_status[2].item() == 1
616+
assert consumption_status[3].item() == 0
617+
assert consumption_status[4].item() == 1
618+
619+
print("✓ get_consumption_status without mask works")
620+
621+
# Test get_consumption_status WITH mask (mask=True)
622+
global_index_masked, consumption_status_masked = partition.get_consumption_status("test_task", mask=True)
623+
# With mask, should return only global_indexes (0-4)
624+
assert global_index_masked.shape[0] == 5
625+
assert torch.equal(global_index_masked, torch.tensor([0, 1, 2, 3, 4], dtype=torch.long))
626+
# Masked status should correspond to global indexes
627+
assert consumption_status_masked.shape[0] == 5
628+
assert consumption_status_masked[0].item() == 1
629+
assert consumption_status_masked[1].item() == 0
630+
assert consumption_status_masked[2].item() == 1
631+
assert consumption_status_masked[3].item() == 0
632+
assert consumption_status_masked[4].item() == 1
633+
634+
print("✓ get_consumption_status with mask works")
635+
636+
print("Consumption status mask parameter tests passed!\n")

0 commit comments

Comments
 (0)