Skip to content

Commit 303be53

Browse files
committed
Fixed Update method bug
1 parent 12c9ded commit 303be53

File tree

6 files changed

+141
-4
lines changed

6 files changed

+141
-4
lines changed

pqueue.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,11 @@ func (pq *PriorityQueue) Update(item *PriorityItem, newValue []byte) error {
228228
return ErrDBClosed
229229
}
230230

231+
// Check if item exists in queue.
232+
if item.ID <= pq.levels[item.Priority].head || item.ID > pq.levels[item.Priority].tail {
233+
return ErrOutOfBounds
234+
}
235+
231236
item.Value = newValue
232237
return pq.db.Put(item.Key, item.Value, nil)
233238
}

pqueue_test.go

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ func TestPriorityQueueDequeueByPriority(t *testing.T) {
194194
}
195195

196196
if pq.Length() != 50 {
197-
t.Errorf("Expected queue length of 1, got %d", pq.Length())
197+
t.Errorf("Expected queue length of 50, got %d", pq.Length())
198198
}
199199

200200
deqItem, err := pq.DequeueByPriority(3)
@@ -765,6 +765,48 @@ func TestPriorityQueueUpdateObject(t *testing.T) {
765765
}
766766
}
767767

768+
func TestPriorityQueueUpdateOutOfBounds(t *testing.T) {
769+
file := fmt.Sprintf("test_db_%d", time.Now().UnixNano())
770+
pq, err := OpenPriorityQueue(file, ASC)
771+
if err != nil {
772+
t.Error(err)
773+
}
774+
defer pq.Drop()
775+
776+
for p := 0; p <= 4; p++ {
777+
for i := 1; i <= 10; i++ {
778+
item := NewPriorityItemString(fmt.Sprintf("value for item %d", i), uint8(p))
779+
if err = pq.Enqueue(item); err != nil {
780+
t.Error(err)
781+
}
782+
}
783+
}
784+
785+
if pq.Length() != 50 {
786+
t.Errorf("Expected queue length of 50, got %d", pq.Length())
787+
}
788+
789+
deqItem, err := pq.DequeueByPriority(3)
790+
if err != nil {
791+
t.Error(err)
792+
}
793+
794+
if pq.Length() != 49 {
795+
t.Errorf("Expected queue length of 49, got %d", pq.Length())
796+
}
797+
798+
if err = pq.Update(deqItem, []byte(`new value`)); err != ErrOutOfBounds {
799+
t.Errorf("Expected to get queue out of bounds error, got %s", err.Error())
800+
}
801+
802+
deqItem.ID++
803+
deqItem.Key = idToKey(deqItem.ID)
804+
805+
if err = pq.Update(deqItem, []byte(`new value`)); err != nil {
806+
t.Error(err)
807+
}
808+
}
809+
768810
func TestPriorityQueueHigherPriorityAsc(t *testing.T) {
769811
file := fmt.Sprintf("test_db_%d", time.Now().UnixNano())
770812
pq, err := OpenPriorityQueue(file, ASC)

queue.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,11 @@ func (q *Queue) Update(item *Item, newValue []byte) error {
153153
return ErrDBClosed
154154
}
155155

156+
// Check if item exists in queue.
157+
if item.ID <= q.head || item.ID > q.tail {
158+
return ErrOutOfBounds
159+
}
160+
156161
item.Value = newValue
157162
return q.db.Put(item.Key, item.Value, nil)
158163
}

queue_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,46 @@ func TestQueueUpdateObject(t *testing.T) {
386386
}
387387
}
388388

389+
func TestQueueUpdateOutOfBounds(t *testing.T) {
390+
file := fmt.Sprintf("test_db_%d", time.Now().UnixNano())
391+
q, err := OpenQueue(file)
392+
if err != nil {
393+
t.Error(err)
394+
}
395+
defer q.Drop()
396+
397+
for i := 1; i <= 10; i++ {
398+
item := NewItemString(fmt.Sprintf("value for item %d", i))
399+
if err = q.Enqueue(item); err != nil {
400+
t.Error(err)
401+
}
402+
}
403+
404+
if q.Length() != 10 {
405+
t.Errorf("Expected queue length of 10, got %d", q.Length())
406+
}
407+
408+
deqItem, err := q.Dequeue()
409+
if err != nil {
410+
t.Error(err)
411+
}
412+
413+
if q.Length() != 9 {
414+
t.Errorf("Expected queue length of 9, got %d", q.Length())
415+
}
416+
417+
if err = q.Update(deqItem, []byte(`new value`)); err != ErrOutOfBounds {
418+
t.Errorf("Expected to get queue out of bounds error, got %s", err.Error())
419+
}
420+
421+
deqItem.ID++
422+
deqItem.Key = idToKey(deqItem.ID)
423+
424+
if err = q.Update(deqItem, []byte(`new value`)); err != nil {
425+
t.Error(err)
426+
}
427+
}
428+
389429
func TestQueueEmpty(t *testing.T) {
390430
file := fmt.Sprintf("test_db_%d", time.Now().UnixNano())
391431
q, err := OpenQueue(file)

stack.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,11 @@ func (s *Stack) Update(item *Item, newValue []byte) error {
153153
return ErrDBClosed
154154
}
155155

156+
// Check if item exists in stack.
157+
if item.ID > s.head || item.ID <= s.tail {
158+
return ErrOutOfBounds
159+
}
160+
156161
item.Value = newValue
157162
return s.db.Put(item.Key, item.Value, nil)
158163
}

stack_test.go

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ func TestStackPop(t *testing.T) {
105105
t.Errorf("Expected stack length of 10, got %d", s.Length())
106106
}
107107

108-
deqItem, err := s.Pop()
108+
popItem, err := s.Pop()
109109
if err != nil {
110110
t.Error(err)
111111
}
@@ -116,8 +116,8 @@ func TestStackPop(t *testing.T) {
116116

117117
compStr := "value for item 10"
118118

119-
if deqItem.ToString() != compStr {
120-
t.Errorf("Expected string to be '%s', got '%s'", compStr, deqItem.ToString())
119+
if popItem.ToString() != compStr {
120+
t.Errorf("Expected string to be '%s', got '%s'", compStr, popItem.ToString())
121121
}
122122
}
123123

@@ -386,6 +386,46 @@ func TestStackUpdateObject(t *testing.T) {
386386
}
387387
}
388388

389+
func TestStackUpdateOutOfBounds(t *testing.T) {
390+
file := fmt.Sprintf("test_db_%d", time.Now().UnixNano())
391+
s, err := OpenStack(file)
392+
if err != nil {
393+
t.Error(err)
394+
}
395+
defer s.Drop()
396+
397+
for i := 1; i <= 10; i++ {
398+
item := NewItemString(fmt.Sprintf("value for item %d", i))
399+
if err = s.Push(item); err != nil {
400+
t.Error(err)
401+
}
402+
}
403+
404+
if s.Length() != 10 {
405+
t.Errorf("Expected stack length of 10, got %d", s.Length())
406+
}
407+
408+
popItem, err := s.Pop()
409+
if err != nil {
410+
t.Error(err)
411+
}
412+
413+
if s.Length() != 9 {
414+
t.Errorf("Expected stack length of 9, got %d", s.Length())
415+
}
416+
417+
if err = s.Update(popItem, []byte(`new value`)); err != ErrOutOfBounds {
418+
t.Errorf("Expected to get stack out of bounds error, got %s", err.Error())
419+
}
420+
421+
popItem.ID--
422+
popItem.Key = idToKey(popItem.ID)
423+
424+
if err = s.Update(popItem, []byte(`new value`)); err != nil {
425+
t.Error(err)
426+
}
427+
}
428+
389429
func TestStackEmpty(t *testing.T) {
390430
file := fmt.Sprintf("test_db_%d", time.Now().UnixNano())
391431
s, err := OpenStack(file)

0 commit comments

Comments
 (0)