packages feed

jobqueue-0.1.5: test/BackendQueue.hs

-- Copyright (c) Gree, Inc. 2013
-- License: MIT-style

{-# LANGUAGE TemplateHaskell #-}

module BackendQueue (testJobQueueBackend) where

import Control.Exception
import Test.Hspec
import System.Directory
import System.IO.Error (isDoesNotExistError)
import System.Environment (lookupEnv)

import qualified Data.ByteString.Char8 as BS
import Network.JobQueue.Backend
import Network.JobQueue.Backend.Types
import Network.JobQueue.Backend.Class

testJobQueueBackend :: String -> Spec
testJobQueueBackend backend = do
  describe "backend queue" $ do
    it "peeks" $ do
      withBackend backend $ \(Backend { bOpenQueue = openQueue }) -> do
        q <- openQueue "/case/peek_1"
        k <- writeQueue q (BS.pack "hoge") 0
        Just (bs, name, idName, version) <- peekQueue q
        _ <- deleteQueue q name
        countQueue q `shouldReturn` 0

    it "writes and reads" $ do
      withBackend backend $ \(Backend { bOpenQueue = openQueue }) -> do
        q <- openQueue "/case/read_and_write_1"
        k <- writeQueue q (BS.pack "hoge") 0
        readQueue q `shouldReturn` Just (BS.pack "hoge", k)

    it "counts" $ do
      withBackend backend $ \(Backend { bOpenQueue = openQueue }) -> do
        q <- openQueue "/case/count_1"
        _ <- writeQueue q (BS.pack "hoge1") 0
        countQueue q `shouldReturn` 1
        _ <- writeQueue q (BS.pack "hoge2") 0
        countQueue q `shouldReturn` 2
        _ <- readQueue q
        _ <- readQueue q
        return ()

    it "has items" $ do
      withBackend backend $ \(Backend { bOpenQueue = openQueue }) -> do
        q <- openQueue "/case/items_1"
        k1 <- writeQueue q (BS.pack "hoge1") 0
        itemsQueue q `shouldReturn` [k1]
        k2 <- writeQueue q (BS.pack "hoge2") 0
        itemsQueue q `shouldReturn` [k1, k2]
        _ <- readQueue q
        _ <- readQueue q
        return ()

---------------------------------------------------------------- Utils

withBackend :: String -> (Backend -> IO ()) -> IO ()
withBackend backend act = do
  bracket (openBackend backend) bClose act