498b235461
Build and test / Build and test AMD64 Ubuntu 22.04 (push) Failing after 0s
Publish Builder / amazonlinux2023 (push) Failing after 1s
Build and test / UT for Go (push) Has been skipped
Publish KRTE Images / KRTE (push) Failing after 1s
Build and test / Integration Test (push) Has been skipped
Build and test / Upload Code Coverage (push) Has been skipped
Publish Builder / rockylinux9 (push) Failing after 1s
Publish Builder / ubuntu22.04 (push) Failing after 0s
Publish Builder / ubuntu24.04 (push) Failing after 0s
Publish Gpu Builder / publish-gpu-builder (push) Failing after 1s
Publish Test Images / PyTest (push) Failing after 0s
Build and test / UT for Cpp (push) Has been cancelled
231 lines
5.7 KiB
Go
231 lines
5.7 KiB
Go
// Licensed to the LF AI & Data foundation under one
|
|
// or more contributor license agreements. See the NOTICE file
|
|
// distributed with this work for additional information
|
|
// regarding copyright ownership. The ASF licenses this file
|
|
// to you under the Apache License, Version 2.0 (the
|
|
// "License"); you may not use this file except in compliance
|
|
// with the License. You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package assign
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
// TestBaseItem_GetSetPriority tests BaseItem priority methods
|
|
func TestBaseItem_GetSetPriority(t *testing.T) {
|
|
item := &BaseItem{}
|
|
|
|
// Initial priority should be 0
|
|
assert.Equal(t, 0, item.getPriority())
|
|
|
|
// Set priority
|
|
item.setPriority(100)
|
|
assert.Equal(t, 100, item.getPriority())
|
|
}
|
|
|
|
// TestNewPriorityQueue tests priority queue creation
|
|
func TestNewPriorityQueue(t *testing.T) {
|
|
pq := NewPriorityQueue()
|
|
assert.NotNil(t, pq)
|
|
assert.Equal(t, 0, pq.Len())
|
|
}
|
|
|
|
// TestNewPriorityQueuePtr tests priority queue pointer creation
|
|
func TestNewPriorityQueuePtr(t *testing.T) {
|
|
pq := NewPriorityQueuePtr()
|
|
assert.NotNil(t, pq)
|
|
assert.Equal(t, 0, pq.Len())
|
|
}
|
|
|
|
// TestPriorityQueue_PushPop tests basic push and pop operations
|
|
func TestPriorityQueue_PushPop(t *testing.T) {
|
|
pq := NewPriorityQueue()
|
|
|
|
// Create items with different priorities
|
|
item1 := NewNodeItem(100, 1)
|
|
item2 := NewNodeItem(50, 2)
|
|
item3 := NewNodeItem(200, 3)
|
|
|
|
// Push items
|
|
pq.Push(&item1)
|
|
pq.Push(&item2)
|
|
pq.Push(&item3)
|
|
|
|
assert.Equal(t, 3, pq.Len())
|
|
|
|
// Pop should return items in priority order (lowest first)
|
|
// item2 has priority 50 (lowest)
|
|
popped1 := pq.Pop().(*NodeItem)
|
|
assert.Equal(t, int64(2), popped1.NodeID)
|
|
|
|
// item1 has priority 100
|
|
popped2 := pq.Pop().(*NodeItem)
|
|
assert.Equal(t, int64(1), popped2.NodeID)
|
|
|
|
// item3 has priority 200 (highest)
|
|
popped3 := pq.Pop().(*NodeItem)
|
|
assert.Equal(t, int64(3), popped3.NodeID)
|
|
|
|
assert.Equal(t, 0, pq.Len())
|
|
}
|
|
|
|
// TestPriorityQueue_SingleItem tests with single item
|
|
func TestPriorityQueue_SingleItem(t *testing.T) {
|
|
pq := NewPriorityQueue()
|
|
|
|
item := NewNodeItem(100, 1)
|
|
pq.Push(&item)
|
|
|
|
assert.Equal(t, 1, pq.Len())
|
|
|
|
popped := pq.Pop().(*NodeItem)
|
|
assert.Equal(t, int64(1), popped.NodeID)
|
|
assert.Equal(t, 0, pq.Len())
|
|
}
|
|
|
|
// TestPriorityQueue_SamePriority tests items with same priority
|
|
func TestPriorityQueue_SamePriority(t *testing.T) {
|
|
pq := NewPriorityQueue()
|
|
|
|
// Create items with same priority
|
|
item1 := NewNodeItem(100, 1)
|
|
item2 := NewNodeItem(100, 2)
|
|
item3 := NewNodeItem(100, 3)
|
|
|
|
pq.Push(&item1)
|
|
pq.Push(&item2)
|
|
pq.Push(&item3)
|
|
|
|
assert.Equal(t, 3, pq.Len())
|
|
|
|
// All have same priority, should still pop 3 items
|
|
_ = pq.Pop()
|
|
_ = pq.Pop()
|
|
_ = pq.Pop()
|
|
|
|
assert.Equal(t, 0, pq.Len())
|
|
}
|
|
|
|
// TestPriorityQueue_RePush tests pushing item back after popping
|
|
func TestPriorityQueue_RePush(t *testing.T) {
|
|
pq := NewPriorityQueue()
|
|
|
|
item1 := NewNodeItem(50, 1)
|
|
item2 := NewNodeItem(100, 2)
|
|
|
|
pq.Push(&item1)
|
|
pq.Push(&item2)
|
|
|
|
// Pop the lowest priority item
|
|
popped := pq.Pop().(*NodeItem)
|
|
assert.Equal(t, int64(1), popped.NodeID)
|
|
assert.Equal(t, 1, pq.Len())
|
|
|
|
// Modify and push back
|
|
popped.AddCurrentScoreDelta(200)
|
|
pq.Push(popped)
|
|
|
|
assert.Equal(t, 2, pq.Len())
|
|
|
|
// Now item2 should be popped first (lower priority)
|
|
nextPopped := pq.Pop().(*NodeItem)
|
|
assert.Equal(t, int64(2), nextPopped.NodeID)
|
|
}
|
|
|
|
// TestPriorityQueue_LargeDataset tests with many items
|
|
func TestPriorityQueue_LargeDataset(t *testing.T) {
|
|
pq := NewPriorityQueue()
|
|
|
|
// Push 100 items with random priorities
|
|
for i := 0; i < 100; i++ {
|
|
item := NewNodeItem(i*10, int64(i))
|
|
pq.Push(&item)
|
|
}
|
|
|
|
assert.Equal(t, 100, pq.Len())
|
|
|
|
// Pop all items and verify they come out in priority order
|
|
lastPriority := -1
|
|
for i := 0; i < 100; i++ {
|
|
item := pq.Pop().(*NodeItem)
|
|
currentPriority := item.getPriority()
|
|
assert.GreaterOrEqual(t, currentPriority, lastPriority)
|
|
lastPriority = currentPriority
|
|
}
|
|
|
|
assert.Equal(t, 0, pq.Len())
|
|
}
|
|
|
|
// TestPriorityQueue_WithAssignedScore tests priority ordering with assigned scores
|
|
func TestPriorityQueue_WithAssignedScore(t *testing.T) {
|
|
pq := NewPriorityQueue()
|
|
|
|
item1 := NewNodeItem(100, 1)
|
|
item1.AddAssignedScore(50) // Priority: 100 - 50 = 50
|
|
|
|
item2 := NewNodeItem(80, 2)
|
|
item2.AddAssignedScore(50) // Priority: 80 - 50 = 30
|
|
|
|
item3 := NewNodeItem(120, 3)
|
|
item3.AddAssignedScore(50) // Priority: 120 - 50 = 70
|
|
|
|
pq.Push(&item1)
|
|
pq.Push(&item2)
|
|
pq.Push(&item3)
|
|
|
|
// Should pop in order: item2 (30), item1 (50), item3 (70)
|
|
popped1 := pq.Pop().(*NodeItem)
|
|
assert.Equal(t, int64(2), popped1.NodeID)
|
|
|
|
popped2 := pq.Pop().(*NodeItem)
|
|
assert.Equal(t, int64(1), popped2.NodeID)
|
|
|
|
popped3 := pq.Pop().(*NodeItem)
|
|
assert.Equal(t, int64(3), popped3.NodeID)
|
|
}
|
|
|
|
// TestHeapQueue_Len tests heap queue length
|
|
func TestHeapQueue_Len(t *testing.T) {
|
|
hq := make(heapQueue, 0)
|
|
assert.Equal(t, 0, hq.Len())
|
|
|
|
item := &BaseItem{}
|
|
hq = append(hq, item)
|
|
assert.Equal(t, 1, hq.Len())
|
|
}
|
|
|
|
// TestHeapQueue_Less tests heap queue comparison
|
|
func TestHeapQueue_Less(t *testing.T) {
|
|
item1 := &BaseItem{priority: 10}
|
|
item2 := &BaseItem{priority: 20}
|
|
|
|
hq := heapQueue{item1, item2}
|
|
|
|
assert.True(t, hq.Less(0, 1))
|
|
assert.False(t, hq.Less(1, 0))
|
|
}
|
|
|
|
// TestHeapQueue_Swap tests heap queue swap
|
|
func TestHeapQueue_Swap(t *testing.T) {
|
|
item1 := &BaseItem{priority: 10}
|
|
item2 := &BaseItem{priority: 20}
|
|
|
|
hq := heapQueue{item1, item2}
|
|
|
|
hq.Swap(0, 1)
|
|
|
|
assert.Equal(t, 20, hq[0].getPriority())
|
|
assert.Equal(t, 10, hq[1].getPriority())
|
|
}
|