]> git.corax.cc Git - toolbox/commitdiff
include/queue: Turn queue into a simple FIFO
authorMatthias Kruk <m@m10k.eu>
Sat, 19 Nov 2022 10:38:00 +0000 (19:38 +0900)
committerMatthias Kruk <m@m10k.eu>
Sat, 19 Nov 2022 10:38:00 +0000 (19:38 +0900)
The queue module contains functions for file queues and queues with
unique contents, which should be used into separate modules to keep
modules simple and avoid mistakes such as using functions for normal
queues on file-queues.

This commit removes functions for file and unique queues from the
queue module, turning queues into simple FIFO data structures.

include/queue.sh
test/queue_spec.sh

index 4bef0fae2add688c5ef32d03672d584272034018..dd592db68638ba6dc587071db30b3fadbe6e5c43 100644 (file)
@@ -1,7 +1,7 @@
 #!/bin/bash
 
 # queue.sh - Toolbox module for "thread"-safe queues
-# Copyright (C) 2021 Matthias Kruk
+# Copyright (C) 2021-2022 Matthias Kruk
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -137,15 +137,6 @@ _queue_get_data() {
        echo "$path/data"
 }
 
-_queue_get_filedir() {
-       local queue="$1"
-
-       local path
-
-       path=$(_queue_get_path "$queue")
-       echo "$path/files"
-}
-
 queue_init() {
        local queue="$1"
 
@@ -219,161 +210,6 @@ queue_put() {
        return "$err"
 }
 
-_queue_contains() {
-       local queue="$1"
-       local item="$2"
-
-       local data
-       local qitem
-
-       data=$(_queue_get_data "$queue")
-
-       if ! [ -f "$data" ]; then
-               return 1
-       fi
-
-       while read -r qitem; do
-               if [[ "$qitem" == "$item" ]]; then
-                       return 0
-               fi
-       done < "$data"
-
-       return 1
-}
-
-queue_put_unique() {
-       local queue="$1"
-       local item="$2"
-
-       local mutex
-       local sem
-       local data
-       local err
-
-       # When this function returns success, the caller can be sure that
-       # the item is in the queue. However, this includes the case that
-       # it was already in the queue. Since the item is transient data,
-       # this behavior seems appropriate. Files are a different story.
-
-       mutex=$(_queue_get_mutex "$queue")
-       sem=$(_queue_get_sem "$queue")
-       data=$(_queue_get_data "$queue")
-
-       mutex_lock "$mutex"
-
-       if _queue_contains "$queue" "$item"; then
-               err=-1
-       else
-               if ! echo "$item" >> "$data"; then
-                       err=1
-               else
-                       err=0
-               fi
-       fi
-
-       mutex_unlock "$mutex"
-
-       if (( err == 0 )); then
-               if ! sem_post "$sem"; then
-                       err=1
-               fi
-       elif (( err < 0 )); then
-               err=0
-       fi
-
-       return "$err"
-}
-
-_queue_move_to_q() {
-       local queue="$1"
-       local filepath="$2"
-
-       local filename
-       local filedir
-       local data
-       local dest
-
-       filedir=$(_queue_get_filedir "$queue")
-       data=$(_queue_get_data "$queue")
-       filename="${filepath##*/}"
-       dest="$filedir/$filename"
-
-       if ! cp -a "$filepath" "$dest"; then
-               return 1
-       fi
-
-       if ! echo "$filename" >> "$data"; then
-               log_error "Could not append to queue: $data"
-
-               if ! rm -rf "$dest"; then
-                       log_error "Could not remove file from queue: $dest"
-               fi
-
-               return 1
-       fi
-
-       if ! rm -rf "$filepath"; then
-               log_error "Could not remove source file: $filepath"
-       fi
-
-       return 0
-}
-
-queue_put_file() {
-       local queue="$1"
-       local filepath="$2"
-
-       local mutex
-       local sem
-       local filedir
-       local filename
-       local data
-       local err
-
-       # Unlike queue_put_unique(), this function returns failure if the
-       # file was already in the queue. The file queue does not allow
-       # duplicates because files would be overwritten.
-
-       filename="${filepath##*/}"
-
-       mutex=$(_queue_get_mutex "$queue")
-       filedir=$(_queue_get_filedir "$queue")
-       sem=$(_queue_get_sem "$queue")
-
-       mutex_lock "$mutex"
-
-       if ! mkdir -p "$filedir" &> /dev/null; then
-               err=1
-       else
-               local dest
-
-               dest="$filedir/$filename"
-
-               if [ -e "$filedir/$filename" ]; then
-                       # Must not succeed if the file was already in the queue
-                       err=1
-               else
-                       if _queue_move_to_q "$queue" "$filepath"; then
-                               err=0
-                       else
-                               err=1
-                       fi
-               fi
-       fi
-
-       mutex_unlock "$mutex"
-
-       if (( err == 0 )); then
-               if ! sem_post "$sem"; then
-                       err=1
-               fi
-       elif (( err < 0 )); then
-               err=0
-       fi
-
-       return "$err"
-}
-
 queue_get() {
        local queue="$1"
        local -i timeout="$2"
@@ -418,94 +254,6 @@ queue_get() {
        return 0
 }
 
-queue_get_file() {
-       local queue="$1"
-       local destdir="$2"
-       local -i timeout="$3"
-
-       local sem
-       local mutex
-       local data
-       local item
-       local dest
-       local err
-
-       if (( $# < 3 )); then
-               timeout=-1
-       fi
-
-       if ! [ -d "$destdir" ]; then
-               log_error "Destination must be a directory"
-               return 1
-       fi
-
-       sem=$(_queue_get_sem "$queue")
-       mutex=$(_queue_get_mutex "$queue")
-       data=$(_queue_get_data "$queue")
-
-       err=false
-
-       if ! sem_wait "$sem" "$timeout"; then
-               return 1
-       fi
-
-       mutex_lock "$mutex"
-
-       if ! item=$(head -n 1 "$data" 2>/dev/null); then
-               err=true
-       else
-               src="$(_queue_get_filedir "$queue")/$item"
-               dest="${destdir%/}/$item"
-
-               # The reason we remove the item from the list first is that
-               # it is much cheaper to put it back in case the move failed
-               # than the other way around.
-
-               if ! sed -i '1d' "$data" 2>/dev/null; then
-                       log_error "Could not remove item from $data"
-                       err=true
-               else
-                       log_debug "Moving $src to $dest"
-
-                       if ! mv "$src" "$dest"; then
-                               local tmpfile
-                               local restored
-
-                               log_error "Could not move $src to $dest"
-                               restored=true
-
-                               # Put the file back to the head of the list
-                               if ! tmpfile=$(mktemp); then
-                                       restored=false
-                               elif ! echo "$item" | cat - "$data" > "$tmpfile"; then
-                                       restored=false
-                                       rm "$tmpfile"
-                               elif ! mv "$tmpfile" "$data"; then
-                                       restored=false
-                                       rm "$tmpfile"
-                               fi
-
-                               if ! "$restored"; then
-                                       log_error "Could not restore queue $queue"
-                               else
-                                       sem_post "$sem"
-                               fi
-
-                               err=true
-                       fi
-               fi
-       fi
-
-       mutex_unlock "$mutex"
-
-       if "$err"; then
-               return 1
-       fi
-
-       echo "$dest"
-       return 0
-}
-
 queue_foreach() {
        local name="$1"
        local func="$2"
index 0776ec135edb3a1064e921043cbc17ab085ecfb0..a88ce3f41fabd172347ce5eaf87b3b1d7950abc1 100644 (file)
@@ -260,733 +260,50 @@ Describe "queue_put()"
   End
 End
 
-Describe "queue_put_unique()"
-  It "adds an item to the queue"
-    _test_queue_put_unique_add() {
-           local tmpdir
-           local queue
-
-           local items_before
-           local items_after
-           local item_new
-           local item
-
-           if ! tmpdir=$(mktemp -d); then
-                   return 1
-           fi
-
-           queue="$tmpdir/queue"
-
-           if ! queue_init "$queue"; then
-                   rm -rf "$tmpdir"
-                   return 2
-           fi
-
-           items_before=()
-           while read -r item; do
-                   items_before+=("$item")
-           done < <(queue_foreach "$queue" echo)
-
-           item_new="$RANDOM.item.$RANDOM"
-
-           if ! queue_put_unique "$queue" "$item_new"; then
-                   rm -rf "$tmpdir"
-                   return 3
-           fi
-
-           items_after=()
-           while read -r item; do
-                   items_after+=("$item")
-           done < <(queue_foreach "$queue" echo)
-
-           rm -rf "$tmpdir"
-
-           items_before+=("$item_new")
-
-           if ! array_same items_before items_after; then
-                   return 4
-           fi
-
-           return 0
-    }
-
-    When call _test_queue_put_unique_add
-    The status should equal 0
-  End
-
-  It "adds an item to the end of the queue"
-    _test_queue_put_unique_append() {
-           local tmpdir
-           local queue
-
-           local items_before
-           local items_after
-           local item_new
-           local item
-
-           if ! tmpdir=$(mktemp -d); then
-                   return 1
-           fi
-
-           queue="$tmpdir/queue"
-
-           if ! queue_init "$queue"; then
-                   rm -rf "$tmpdir"
-                   return 2
-           fi
-
-           items_before=()
-           while read -r item; do
-                   items_before+=("$item")
-           done < <(queue_foreach "$queue" echo)
-
-           item_new="$RANDOM.item.$RANDOM"
-
-           if ! queue_put_unique "$queue" "$item_new"; then
-                   rm -rf "$tmpdir"
-                   return 3
-           fi
-
-           items_after=()
-           while read -r item; do
-                   items_after+=("$item")
-           done < <(queue_foreach "$queue" echo)
-
-           rm -rf "$tmpdir"
-
-           items_before+=("$item_new")
-
-           if ! array_identical items_before items_after; then
-                   return 4
-           fi
-
-           return 0
-    }
-
-    When call _test_queue_put_unique_append
-    The status should equal 0
-  End
-
-  It "does not add the same item twice"
-    _test_queue_put_unique_fail_not_unique() {
-           local tmpdir
-           local queue
-           local items
-           local item
-           local -i num_items
-           local err
-
-           if ! tmpdir=$(mktemp -d); then
-                   return 1
-           fi
-
-           err=0
-           queue="$tmpdir/queue"
-           item="$RANDOM.item.$RANDOM"
-
-           if ! queue_init "$queue"; then
-                   err=2
-
-           elif ! queue_put_unique "$queue" "$item" ||
-                ! queue_put_unique "$queue" "$item"; then
-                   # If queue_put_unique() succeeds, that means the item
-                   # is in the queue. It does not mean that it was added
-                   # by this call. It may already have been there. Long
-                   # story short, both calls must succeed.
-                   err=3
-
-           elif ! items=$(queue_foreach "$queue" echo); then
-                   err=4
-
-           elif [[ -z "$items" ]]; then
-                   err=5
-
-           elif ! num_items=$(wc -l <<< "$items"); then
-                   err=6
-
-           elif (( num_items != 1 )); then
-                   err=7
-           fi
-
-           rm -rf "$tmpdir"
-           return "$err"
-    }
-
-    When call _test_queue_put_unique_fail_not_unique
-    The status should equal 0
-  End
-End
-
-Describe "queue_put_file()"
-  It "adds a file to the queue"
-    _test_queue_put_file_add() {
-           local tmpdir
-           local queue
-
-           local items_before
-           local items_after
-           local item_new
-           local item_data
-           local item_last
-           local enqueued_data
-           local item
-
-           if ! tmpdir=$(mktemp -d); then
-                   return 1
-           fi
-
-           if ! item_new=$(mktemp); then
-                   rmdir "$tmpdir"
-                   return 2
-           fi
-
-           queue="$tmpdir/queue"
-
-           if ! queue_init "$queue"; then
-                   rm -rf "$tmpdir" "$item_new"
-                   return 3
-           fi
-
-           items_before=()
-           while read -r item; do
-                   items_before+=("$item")
-           done < <(queue_foreach "$queue" echo)
-
-           item_data="$RANDOM.item.$RANDOM"
-           if ! echo "$item_data" > "$item_new"; then
-                   rm -rf "$tmpdir" "$item_new"
-                   return 4
-           fi
-
-           if ! queue_put_file "$queue" "$item_new"; then
-                   rm -rf "$tmpdir" "$item_new"
-                   return 5
-           fi
-
-           items_after=()
-           item_last=""
-           while read -r item; do
-                   items_after+=("$item")
-                   item_last="$item"
-           done < <(queue_foreach "$queue" echo)
-
-           if ! enqueued_data=$(< "$queue/files/${item_new##*/}"); then
-                   rm -rf "$tmpdir"
-                   return 6
-           fi
-
-           rm -rf "$tmpdir"
-
-           if [[ "$enqueued_data" != "$item_data" ]]; then
-                   return 7
-           fi
-
-           items_before+=("$item_last")
-
-           if ! array_same items_before items_after; then
-                   return 8
-           fi
-
-           return 0
-    }
-
-    When call _test_queue_put_file_add
-    The status should equal 0
-  End
-
-  It "adds an item to the end of the queue"
-    _test_queue_put_file_append() {
-           local tmpdir
-           local queue
-
-           local items_before
-           local items_after
-           local item_new
-           local item_data
-           local item_last
-           local enqueued_data
-           local item
-
-           if ! tmpdir=$(mktemp -d); then
-                   return 1
-           fi
-
-           if ! item_new=$(mktemp); then
-                   rmdir "$tmpdir"
-                   return 2
-           fi
-
-           queue="$tmpdir/queue"
-
-           if ! queue_init "$queue"; then
-                   rm -rf "$tmpdir" "$item_new"
-                   return 3
-           fi
-
-           items_before=()
-           while read -r item; do
-                   items_before+=("$item")
-           done < <(queue_foreach "$queue" echo)
-
-           item_data="$RANDOM.item.$RANDOM"
-           if ! echo "$item_data" > "$item_new"; then
-                   rm -rf "$tmpdir" "$item_new"
-                   return 4
-           fi
-
-           if ! queue_put_file "$queue" "$item_new"; then
-                   rm -rf "$tmpdir" "$item_new"
-                   return 5
-           fi
-
-           items_after=()
-           item_last=""
-           while read -r item; do
-                   items_after+=("$item")
-                   item_last="$item"
-           done < <(queue_foreach "$queue" echo)
-
-           if ! enqueued_data=$(< "$queue/files/${item_new##*/}"); then
-                   rm -rf "$tmpdir"
-                   return 6
-           fi
-
-           rm -rf "$tmpdir"
-
-           if [[ "$enqueued_data" != "$item_data" ]]; then
-                   return 7
-           fi
-
-           items_before+=("$item_last")
-
-           if ! array_identical items_before items_after; then
-                   return 8
-           fi
-
-           return 0
-    }
-
-    When call _test_queue_put_file_append
-    The status should equal 0
-  End
-
-  It "does not add a file with the same name twice"
-    _test_queue_put_file_fail_not_unique() {
-           local tmpdir
-           local queue
-           local items
-           local item
-           local -i num_items
-           local err
-
-           if ! tmpdir=$(mktemp -d); then
-                   return 1
-           fi
-
-           err=0
-           queue="$tmpdir/queue"
-
-           if ! queue_init "$queue"; then
-                   err=2
-
-           elif ! echo "$RANDOM.item.$RANDOM" > "$tmpdir/file"; then
-                   err=3
-
-           elif ! queue_put_file "$queue" "$tmpdir/file"; then
-                   err=4
-
-           elif ! echo "$RANDOM.item.$RANDOM" > "$tmpdir/file"; then
-                   err=5
-
-           elif queue_put_file "$queue" "$tmpdir/file"; then
-                   err=6
-
-           elif ! items=$(queue_foreach "$queue" echo); then
-                   err=7
-
-           elif [[ -z "$items" ]]; then
-                   err=8
-
-           elif ! num_items=$(wc -l <<< "$items"); then
-                   err=9
-
-           elif (( num_items != 1 )); then
-                   err=10
-           fi
-
-           rm -rf "$tmpdir"
-           return "$err"
-    }
-
-    When call _test_queue_put_file_fail_not_unique
-    The status should equal 0
-  End
-End
-
-Describe "queue_get()"
-  It "gets an item from a queue"
-    _test_queue_get_simple() {
-           local tmpdir
-           local queue
-           local data_enqueued
-           local data_dequeued
-           local err
-
-           if ! tmpdir=$(mktemp -d); then
-                   return 1
-           fi
-
-           queue="$tmpdir/queue"
-           data_enqueued="$RANDOM.data.$RANDOM"
-           err=0
-
-           if ! queue_init "$queue"; then
-                   err=2
-
-           elif ! queue_put "$queue" "$data_enqueued"; then
-                   err=3
-
-           elif ! data_dequeued=$(queue_get "$queue" 0); then
-                   err=4
-
-           elif [[ "$data_enqueued" != "$data_dequeued" ]]; then
-                   err=5
-           fi
-
-           rm -rf "$tmpdir"
-           return "$err"
-    }
-
-    When call _test_queue_get_simple
-    The status should equal 0
-  End
-
-  It "preserves the order of items"
-    _test_queue_get_order() {
-           local tmpdir
-           local queue
-           local data_enqueued
-           local data_dequeued
-           local err
-
-           if ! tmpdir=$(mktemp -d); then
-                   return 1
-           fi
-
-           queue="$tmpdir/queue"
-           data_enqueued=(1 2 3)
-           err=0
-
-           if ! queue_init "$queue"; then
-                   err=2
-
-           elif ! queue_put "$queue" "${data_enqueued[0]}" ||
-                ! queue_put "$queue" "${data_enqueued[1]}" ||
-                ! queue_put "$queue" "${data_enqueued[2]}"; then
-                   err=3
-
-           elif ! data_dequeued+=("$(queue_get "$queue")") ||
-                ! data_dequeued+=("$(queue_get "$queue")") ||
-                ! data_dequeued+=("$(queue_get "$queue")"); then
-                   err=4
-
-           elif ! array_identical data_enqueued data_dequeued; then
-                   err=5
-           fi
-
-           rm -rf "$tmpdir"
-           return "$err"
-    }
-
-    When call _test_queue_get_order
-    The status should equal 0
-  End
-
-  It "blocks for specified amount of seconds if timeout > 0"
-    _test_queue_get_timeout_n() {
-           local timeout
-           local tmpdir
-           local queue
-           local err
-
-           if ! tmpdir=$(mktemp -d); then
-                   return 1
-           fi
-
-           queue="$tmpdir/queue"
-           timeout=5
-           err=0
-
-           if ! queue_init "$queue"; then
-                   err=2
-           else
-                   local time_before
-                   local time_after
-                   local time_waited
-
-                   time_before=$(date +"%s")
-                   queue_get "$queue" "$timeout"
-                   time_after=$(date +"%s")
-
-                   time_waited=$((time_after - time_before))
-                   if (( time_waited > (timeout + 1) )); then
-                           err=3
-                   elif (( time_waited < timeout )); then
-                           err=4
-                   fi
-           fi
-
-           rm -rf "$tmpdir"
-           return "$err"
-    }
-
-    When call _test_queue_get_timeout_n
-    The status should equal 0
-  End
-
-  It "does not block if timeout == 0"
-    _test_queue_get_timeout_zero() {
-           local tmpdir
-           local queue
-           local err
-
-           if ! tmpdir=$(mktemp -d); then
-                   return 1
-           fi
-
-           queue="$tmpdir/queue"
-           err=0
-
-           if ! queue_init "$queue"; then
-                   err=2
-
-           else
-                   local time_before
-                   local time_after
-
-                   time_before=$(date +"%s")
-                   queue_get "$queue" 0
-                   time_after=$(date +"%s")
-
-                   if (( (time_after - time_before) > 0 )); then
-                           err=3
-                   fi
-           fi
-
-           rm -rf "$tmpdir"
-           return "$err"
-    }
-
-    When call _test_queue_get_timeout_zero
-    The status should equal 0
-  End
-
-  It "blocks until a message arrives if timeout == -1"
-    _test_queue_get_timeout_negative() {
-           local tmpdir
-           local queue
-           local err
-
-           if ! tmpdir=$(mktemp -d); then
-                   return 1
-           fi
-
-           queue="$tmpdir/queue"
-           err=0
-
-           if ! queue_init "$queue"; then
-                   err=2
-
-           else
-                   local delay
-
-                   for (( delay = 0; delay < 5; delay++ )); do
-                           local time_before
-                           local time_after
-                           local time_waited
-
-                           ( sleep "$delay"; queue_put "$queue" "hello world" ) &
-
-                           time_before=$(date +"%s")
-                           queue_get "$queue" -1 &> /dev/null
-                           time_after=$(date +"%s")
-
-                           time_waited=$((time_after - time_before))
-
-                           if (( time_waited < delay )); then
-                                   err=3
-                                   break
-                           fi
-
-                           # queue_put() and queue_get() may incur a delay of 1s each,
-                           # add bad scheduler timing and we need 3 seconds tolerance
-                           if (( (time_waited - delay) > 3 )); then
-                                   err=4
-                                   break
-                           fi
-                   done
-           fi
-
-           rm -rf "$tmpdir"
-           return "$err"
-    }
-
-    When call _test_queue_get_timeout_negative
-    The status should equal 0
-  End
-
-  It "blocks until a message arrives if timeout is omitted"
-    _test_queue_get_timeout_omitted() {
-           local tmpdir
-           local queue
-           local err
-
-           if ! tmpdir=$(mktemp -d); then
-                   return 1
-           fi
-
-           queue="$tmpdir/queue"
-           err=0
-
-           if ! queue_init "$queue"; then
-                   err=2
-
-           else
-                   local delay
-
-                   for (( delay = 0; delay < 5; delay++ )); do
-                           local time_before
-                           local time_after
-                           local time_waited
-
-                           ( sleep "$delay"; queue_put "$queue" "hello world" ) &
-
-                           time_before=$(date +"%s")
-                           queue_get "$queue" &> /dev/null
-                           time_after=$(date +"%s")
-
-                           time_waited=$((time_after - time_before))
-
-                           if (( time_waited < delay )); then
-                                   err=3
-                                   break
-                           fi
-
-                           if (( (time_waited - delay) > 3 )); then
-                                   err=4
-                                   break
-                           fi
-                   done
-           fi
-
-           rm -rf "$tmpdir"
-           return "$err"
-    }
-
-    When call _test_queue_get_timeout_omitted
-    The status should equal 0
-  End
-
-End
-
-Describe "queue_get_file()"
-  It "retrieves a file from the queue"
-    _test_queue_get_file() {
+Describe "queue_get()"
+  It "gets an item from a queue"
+    _test_queue_get_simple() {
            local tmpdir
            local queue
-           local file_sent
-           local file_received
-           local data_sent
-           local data_received
+           local data_enqueued
+           local data_dequeued
            local err
 
            if ! tmpdir=$(mktemp -d); then
                    return 1
            fi
 
-           data_sent="hello world"
-           file_sent="$tmpdir/file"
            queue="$tmpdir/queue"
+           data_enqueued="$RANDOM.data.$RANDOM"
            err=0
 
            if ! queue_init "$queue"; then
                    err=2
 
-           elif ! echo "$data_sent" > "$file_sent"; then
+           elif ! queue_put "$queue" "$data_enqueued"; then
                    err=3
 
-           elif ! queue_put_file "$queue" "$file_sent"; then
+           elif ! data_dequeued=$(queue_get "$queue" 0); then
                    err=4
 
-           elif ! file_received=$(queue_get_file "$queue" "$tmpdir"); then
+           elif [[ "$data_enqueued" != "$data_dequeued" ]]; then
                    err=5
-
-           elif ! data_received=$(< "$file_received"); then
-                   err=6
-
-           elif [[ "$data_received" != "$data_sent" ]]; then
-                   err=7
            fi
 
            rm -rf "$tmpdir"
            return "$err"
     }
 
-    When call _test_queue_get_file
+    When call _test_queue_get_simple
     The status should equal 0
   End
 
-  It "preserves the queue order"
-    _populate_queue() {
-           local queue="$1"
-           local tmpdir="$2"
-           local -i items="$3"
-
-           local i
-
-           for (( i = 0; i < items; i++ )); do
-                   if ! echo "$i" > "$tmpdir/$i"; then
-                           return 1
-                   fi
-
-                   if ! queue_put_file "$queue" "$tmpdir/$i"; then
-                           return 1
-                   fi
-           done
-
-           return 0
-    }
-
-    _depopulate_queue() {
-           local queue="$1"
-           local tmpdir="$2"
-           local -i items="$3"
-
-           local i
-
-           for (( i = 0; i < items; i++ )); do
-                   local file
-                   local data
-
-                   if ! file=$(queue_get_file "$queue" "$tmpdir"); then
-                           return 1
-                   fi
-
-                   if ! data=$(< "$file"); then
-                           return 1
-                   fi
-
-                   if [[ "$data" != "$i" ]]; then
-                           return 1
-                   fi
-           done
-
-           return 0
-    }
-
-    _test_queue_get_file_order() {
+  It "preserves the order of items"
+    _test_queue_get_order() {
            local tmpdir
            local queue
+           local data_enqueued
+           local data_dequeued
            local err
 
            if ! tmpdir=$(mktemp -d); then
@@ -994,28 +311,36 @@ Describe "queue_get_file()"
            fi
 
            queue="$tmpdir/queue"
+           data_enqueued=(1 2 3)
            err=0
 
            if ! queue_init "$queue"; then
                    err=2
 
-           elif ! _populate_queue "$queue" "$tmpdir" 10; then
+           elif ! queue_put "$queue" "${data_enqueued[0]}" ||
+                ! queue_put "$queue" "${data_enqueued[1]}" ||
+                ! queue_put "$queue" "${data_enqueued[2]}"; then
                    err=3
 
-           elif ! _depopulate_queue "$queue" "$tmpdir" 10; then
+           elif ! data_dequeued+=("$(queue_get "$queue")") ||
+                ! data_dequeued+=("$(queue_get "$queue")") ||
+                ! data_dequeued+=("$(queue_get "$queue")"); then
                    err=4
+
+           elif ! array_identical data_enqueued data_dequeued; then
+                   err=5
            fi
 
            rm -rf "$tmpdir"
            return "$err"
     }
 
-    When call _test_queue_get_file_order
+    When call _test_queue_get_order
     The status should equal 0
   End
 
-  It "blocks for the specified amount of seconds if timeout > 0"
-    _test_queue_get_file_timeout_n() {
+  It "blocks for specified amount of seconds if timeout > 0"
+    _test_queue_get_timeout_n() {
            local timeout
            local tmpdir
            local queue
@@ -1037,7 +362,7 @@ Describe "queue_get_file()"
                    local time_waited
 
                    time_before=$(date +"%s")
-                   queue_get_file "$queue" "$tmpdir" "$timeout" &> /dev/null
+                   queue_get "$queue" "$timeout"
                    time_after=$(date +"%s")
 
                    time_waited=$((time_after - time_before))
@@ -1052,12 +377,12 @@ Describe "queue_get_file()"
            return "$err"
     }
 
-    When call _test_queue_get_file_timeout_n
+    When call _test_queue_get_timeout_n
     The status should equal 0
   End
 
   It "does not block if timeout == 0"
-    _test_queue_get_file_timeout_zero() {
+    _test_queue_get_timeout_zero() {
            local tmpdir
            local queue
            local err
@@ -1077,7 +402,7 @@ Describe "queue_get_file()"
                    local time_after
 
                    time_before=$(date +"%s")
-                   queue_get_file "$queue" "$tmpdir" 0 &> /dev/null
+                   queue_get "$queue" 0
                    time_after=$(date +"%s")
 
                    if (( (time_after - time_before) > 0 )); then
@@ -1089,12 +414,12 @@ Describe "queue_get_file()"
            return "$err"
     }
 
-    When call _test_queue_get_file_timeout_zero
+    When call _test_queue_get_timeout_zero
     The status should equal 0
   End
 
   It "blocks until a message arrives if timeout == -1"
-    _test_queue_get_file_timeout_negative() {
+    _test_queue_get_timeout_negative() {
            local tmpdir
            local queue
            local err
@@ -1117,26 +442,23 @@ Describe "queue_get_file()"
                            local time_after
                            local time_waited
 
-                           if ! echo "hello world" > "$tmpdir/file"; then
-                                   err=3
-                                   break
-                           fi
-
-                           ( sleep "$delay"; queue_put_file "$queue" "$tmpdir/file" ) &
+                           ( sleep "$delay"; queue_put "$queue" "hello world" ) &
 
                            time_before=$(date +"%s")
-                           queue_get_file "$queue" "$tmpdir" -1 &> /dev/null
+                           queue_get "$queue" -1 &> /dev/null
                            time_after=$(date +"%s")
 
                            time_waited=$((time_after - time_before))
 
                            if (( time_waited < delay )); then
-                                   err=4
+                                   err=3
                                    break
                            fi
 
+                           # queue_put() and queue_get() may incur a delay of 1s each,
+                           # add bad scheduler timing and we need 3 seconds tolerance
                            if (( (time_waited - delay) > 3 )); then
-                                   err=5
+                                   err=4
                                    break
                            fi
                    done
@@ -1146,12 +468,12 @@ Describe "queue_get_file()"
            return "$err"
     }
 
-    When call _test_queue_get_file_timeout_negative
+    When call _test_queue_get_timeout_negative
     The status should equal 0
   End
 
   It "blocks until a message arrives if timeout is omitted"
-    _test_queue_get_file_timeout_omitted() {
+    _test_queue_get_timeout_omitted() {
            local tmpdir
            local queue
            local err
@@ -1174,15 +496,10 @@ Describe "queue_get_file()"
                            local time_after
                            local time_waited
 
-                           if ! echo "hello world" > "$tmpdir/file"; then
-                                   err=3
-                                   break
-                           fi
-
-                           ( sleep "$delay"; queue_put_file "$queue" "$tmpdir/file" ) &
+                           ( sleep "$delay"; queue_put "$queue" "hello world" ) &
 
                            time_before=$(date +"%s")
-                           queue_get_file "$queue" "$tmpdir" &> /dev/null
+                           queue_get "$queue" &> /dev/null
                            time_after=$(date +"%s")
 
                            time_waited=$((time_after - time_before))
@@ -1203,7 +520,7 @@ Describe "queue_get_file()"
            return "$err"
     }
 
-    When call _test_queue_get_file_timeout_omitted
+    When call _test_queue_get_timeout_omitted
     The status should equal 0
   End
 End
@@ -1333,6 +650,4 @@ Describe "queue_foreach()"
     When call _test_queue_foreach_call_order
     The status should equal 0
   End
-
-
 End