{-# LANGUAGE ScopedTypeVariables #-}
module Integration.SednaBindingTests (integrationTests) where
--------------------------------------------------------------------------------
import Prelude hiding (catch)
import Control.Exception
import Data.ByteString.Char8 (pack, unpack)
import Foreign (free)
import System.Process (readProcess)
import Text.Printf (printf)
import Test.HUnit hiding (Test)
import Test.Framework (Test, testGroup)
import Test.Framework.Providers.HUnit
import Database.SednaTypes
import Database.SednaBindings
import Database.Internal.SednaConnectionAttributes
import Database.SednaExceptions
import qualified Data.Text as T
import Data.Text.Encoding (decodeUtf8)
--------------------------------------------------------------------------------
type TestMsg = String
--------------------------------------------------------------------------------
testDBName :: String
testDBName = "SednaDBXMLTestDB"
testCollName = "'testCollection'"
--------------------------------------------------------------------------------
bringUpDB :: IO String
bringUpDB = do readProcess "se_cdb"[testDBName] "/dev/null"
readProcess "se_sm" [testDBName] "/dev/null"
readProcess "se_term" [ "-query"
,"CREATE COLLECTION " ++ testCollName
, testDBName
]
"/dev/null"
--------------------------------------------------------------------------------
bringDownDB :: IO String
bringDownDB = do readProcess "se_smsd" [testDBName] "/dev/null"
readProcess "se_ddb" [testDBName] "/dev/null"
--------------------------------------------------------------------------------
setup :: IO SednaConnection
setup = do
let url = "localhost"
let dbname = testDBName
let login = "SYSTEM"
let password = "MANAGER"
bringUpDB
onException (sednaConnect url dbname login password)
bringDownDB
tearDown :: SednaConnection -> IO String
tearDown conn =
do
sednaCloseConnection conn
bringDownDB
--------------------------------------------------------------------------------
formatMsg :: String -> String
formatMsg = printf "%-60s"
--------------------------------------------------------------------------------
testCaseFMsg :: String -> Assertion -> Test
testCaseFMsg = testCase . formatMsg
--------------------------------------------------------------------------------
sednaDBTest :: (SednaConnection -> IO c) -> IO c
sednaDBTest = bracket setup tearDown
----------------------------------------------------------------------------------
connectionTest :: (SednaConnection -> IO ()) -> String -> Test
connectionTest connFun msg =
testCaseFMsg msg $
catch (sednaDBTest connFun)
(\(e :: SednaException) -> assertFailure $ show e)
--------------------------------------------------------------------------------
testOpenConnection :: Test
testOpenConnection = testCaseFMsg "Testing connection initialization" openTest
--------------------------------------------------------------------------------
openTest :: IO ()
openTest = do
bracketOnError bringUpDB
(\_ -> bringDownDB >> assertFailure "Open Connection Failed")
(\_ -> sednaConnect "localhost" testDBName "SYSTEM" "MANAGER" >>= free)
bringDownDB
return ()
--------------------------------------------------------------------------------
--testCloseConnection :: Test
--testCloseConnection = connectionTest sednaCloseConnection
-- "Test connection termination"
--------------------------------------------------------------------------------
testBeginTransaction :: Test
testBeginTransaction = connectionTest sednaBegin
"Testing transaction initialization"
---------------------------------------------------------------------------------
testSetConnectionAttr :: Test
testSetConnectionAttr =
connectionTest (`sednaSetConnectionAttr` autoCommitOff)
"Testing modification of connection attributes"
---------------------------------------------------------------------------------
testGetConnectionAttr :: Test
testGetConnectionAttr =
connectionTest (\conn -> do
result <- sednaGetConnectionAttr conn attrAutoCommit
assertEqual "Testing attribute value response."
autoCommitOff
result)
"Testing inspection of connection attributes"
---------------------------------------------------------------------------------
testLoadData :: Test
testLoadData =
connectionTest (\conn -> do
sednaBegin conn
sednaLoadData conn
(pack "Hello World!!!")
"testDoc"
"testCollection"
sednaEndLoadData conn
sednaCommit conn)
"Testing proper loading of chunk data"
--------------------------------------------------------------------------------
testLoadFile :: Test
testLoadFile =
let testFile = "fixtures/baseballleague.xml" in
connectionTest (\conn -> sednaLoadFile conn
testFile
"testdoc3"
"testCollection")
"Testing loading of XML file"
--------------------------------------------------------------------------------
testExecuteQuery :: Test
testExecuteQuery =
connectionTest (\conn -> do
sednaBegin conn
queryExecutionStatus <- sednaExecute conn "doc('$documents')"
sednaCommit conn)
"Testing Proper Execution of valid query"
--------------------------------------------------------------------------------
testLoadRetrieveData :: Test
testLoadRetrieveData =
let xmlData = pack "And the world alright with me!" in
connectionTest (\conn -> do
sednaBegin conn
sednaLoadData conn xmlData "testdoc" "testCollection"
sednaEndLoadData conn
sednaExecute conn "doc('testdoc','testCollection')/note"
queryResult <- sednaGetResult conn
assertEqual "Testing proper retrieval of query results"
(decodeUtf8 xmlData)
(T.concat.T.lines $ queryResult)
sednaCommit conn)
"Testing loading and retrieval of data."
-----------------------------------------------------------------------------------
connectionTests :: Test
connectionTests = testGroup "Connection Tests" [ testOpenConnection
]
--------------------------------------------------------------------------------
controlTests :: Test
controlTests = testGroup "Control Tests" [ testGetConnectionAttr
, testSetConnectionAttr
]
-- --------------------------------------------------------------------------------
transactionTests :: Test
transactionTests = testGroup "Transaction Tests" [ testBeginTransaction
, testLoadData
, testLoadFile
, testExecuteQuery
, testLoadRetrieveData
]
--------------------------------------------------------------------------------
integrationTests :: Test
integrationTests = testGroup "Sedna C API Integration Tests" [ connectionTests
, controlTests
, transactionTests
]