packages feed

concrete-haskell-0.1.0.15: tests/TestIngesters.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE OverloadedLists #-}
module Main (main) where

import Data.ByteString.Lazy (ByteString)
import qualified Data.ByteString.Lazy as BS
import Data.Map (toList, (!), keys)
import qualified Data.Map as Map
import Data.Map (Map)
import Data.Monoid ((<>))
import Data.List (intercalate)
import Control.Monad (void, join, liftM)
import Data.Text.Lazy (Text, unpack, take)
import qualified Data.Text.Lazy as T
import Data.Text.Lazy.Encoding (decodeUtf8)
import System.IO (stdin, stdout, stderr, openFile, Handle, IOMode(..), hPutStrLn)
import System.FilePath (takeExtension)
import qualified Codec.Compression.GZip as GZip
import Data.Concrete.Utils (writeCommunication, showCommunication)
import Data.Concrete.Parsers.Types (CommunicationParser)
import Data.Concrete.Parsers (communicationParsers, ingest)
import Data.Concrete.Autogen.Communication_Types (default_Communication, Communication(..))
import Text.Printf (printf)
import qualified Control.Concurrent as C
import qualified Control.Concurrent.STM as S
import qualified Data.Concrete.Services.Store as Store
import qualified Data.Concrete.Services.Fetch as Fetch
import Data.Concrete.Services.Store (ZipStore(..), TarStore(..), HandleStore(..), makeTarStore, makeZipStore, makeHandleStore)
import Data.Concrete.Services.Fetch (ZipFetch(..), TarFetch(..), HandleFetch(..), makeTarFetch, makeZipFetch, makeHandleFetch)
import Data.Concrete.Services (runConcreteService, Compression(..), connectToService)
import qualified Data.Concrete.Autogen.FetchCommunicationService_Client as FetchService
import qualified Data.Concrete.Autogen.StoreCommunicationService_Client as StoreService
import qualified Data.Concrete.Autogen.Service_Client as Service
import Data.Concrete.Autogen.Access_Types (FetchRequest(..), default_FetchRequest, FetchResult(..))
import System.IO.Unsafe
import qualified Codec.Compression.GZip as GZip
import qualified Data.Vector as V


testFormat :: (String, (desc, CommunicationParser (), [String], String)) -> IO ()
testFormat (f, (d, p, c, i)) = do
  let inputFile = printf "tests/data/example.%s.gz" f :: String
  putStrLn (printf "\t%s" f :: String)
  con <- connectToService "localhost" 9090
  ih <- (liftM GZip.decompress . BS.readFile) inputFile
  let (_, cp, _, _) = (Map.fromList communicationParsers) ! f
  ingest (\c -> do
             putStrLn $ printf "\t\t%s" (communication_id c)
             StoreService.store con c) p (decodeUtf8 ih) c i "concrete-haskell unit test data"
  return ()


testFetch :: IO ()
testFetch = do
  putStrLn "Testing fetch service:"
  con <- connectToService "localhost" 9091
  c <- FetchService.getCommunicationCount con
  putStrLn $ printf "\tFetch service reports %d Communications" c
  ids <- FetchService.getCommunicationIDs con 0 c
  putStrLn $ printf "\tReceived %d Communication IDs" (length ids)
  FetchResult {..} <- FetchService.fetch con $ default_FetchRequest { fetchRequest_communicationIds=ids }
  sequence $ map (putStrLn . printf "\t\tFetched Communication with ID == %s" . T.unpack . communication_id) (V.toList fetchResult_communications)
  return ()
  

main = do
  putStrLn "\nTesting parsers + fetch and store services:"
  let outputFile = "test.tar"
  store <- C.forkIO $ do
    case takeExtension outputFile of
      ".zip" -> do
        h <- makeZipStore outputFile
        runConcreteService 9090 Store.process h
      ".tar" -> do
        h <- makeTarStore outputFile
        runConcreteService 9090 Store.process h
      _ -> do
        h <- makeHandleStore outputFile
        runConcreteService 9090 Store.process h
  C.threadDelay 1000000
  sequence $ map testFormat (communicationParsers)
  C.killThread store
  C.threadDelay 1000000
  fetch <- C.forkIO $ do
    case takeExtension outputFile of
      ".zip" -> do
        h <- makeZipFetch outputFile
        runConcreteService 9091 Fetch.process h
      ".tar" -> do
        h <- makeTarFetch outputFile
        runConcreteService 9091 Fetch.process h
      _ -> do
        h <- makeHandleFetch outputFile
        runConcreteService 9091 Fetch.process h
  C.threadDelay 1000000
  testFetch
  C.killThread fetch