{-# LANGUAGE CPP, ScopedTypeVariables #-}
module Main where
#ifndef ghcjs_HOST_OS
import Control.Monad
import Control.Monad.IO.Class
import Control.Applicative
import Data.Monoid
import Transient.Base
import Transient.Internals
import Transient.Indeterminism
import Transient.Move.Internals
import Transient.Move.Utils
import Transient.Move.Services
import Transient.MapReduce
import Data.List
import qualified Data.Map as M
import System.Exit
import Control.Monad.State
import Control.Exception
import Control.Concurrent(threadDelay )
#define SHOULDRUNIN(x) (local $ do p <-getMyNode; liftIO $ print (p,x) ;assert ( p == (x)) (liftIO $ print p))
-- #define _UPK_(x) {-# UNPACK #-} !(x)
-- SHOULDRUNIN x= local $ getMyNode >>= \p -> assert ( p == (x)) (liftIO $ print p)
service= [("service","test suite")
,("executable", "test-transient1")
,("package","https://github.com/agocorona/transient-universe")]
main= do
mr <- keep test
endMonitor
case mr of
Nothing -> print "NO RESULT, NO THREADS RUNNING" >> exitFailure
Just Nothing -> print "SUCCESS" >> exitSuccess
Just (Just e) -> putStr "FAIL: " >> print e >> exitFailure
test= initNodeServ service "localhost" 8080 $ do
node0 <- local getMyNode
local $ guard (nodePort node0== 8080) -- only executes locally in node 8080
[node1, node2] <- requestInstance service 2
local ( option "f" "fire") <|> return "" -- to repeat the tests, remove the "exit" at the end
localIO $ putStrLn "------checking empty in remote node when the remote call back to the caller #46 --------"
r <- runAt node1 $ do
SHOULDRUNIN(node1)
runAt node2 $ (runAt node1 $ SHOULDRUNIN(node1) >> empty ) <|> (SHOULDRUNIN(node2) >> return "world")
localIO $ print r
localIO $ putStrLn "------checking Alternative distributed--------"
r <- local $ collect 3 $
runCloud $ (runAt node0 (SHOULDRUNIN( node0) >> return "hello" ))
<|> (runAt node1 (SHOULDRUNIN( node1) >> return "world" ))
<|> (runAt node2 (SHOULDRUNIN( node2) >> return "world2" ))
assert(sort r== ["hello", "world","world2"]) $ localIO $ print r
localIO $ putStrLn "--------------checking Applicative distributed--------"
r <- loggedc $(runAt node0 (SHOULDRUNIN( node0) >> return "hello "))
<> (runAt node1 (SHOULDRUNIN( node1) >> return "world " ))
<> (runAt node2 (SHOULDRUNIN( node2) >> return "world2" ))
assert(r== "hello world world2") $ localIO $ print r
localIO $ putStrLn "----------------checking monadic, distributed-------------"
r <- runAt node0 (SHOULDRUNIN(node0)
>> runAt node1 (SHOULDRUNIN(node1)
>> runAt node2 (SHOULDRUNIN(node2) >> (return "HELLO" ))))
assert(r== "HELLO") $ localIO $ print r
localIO $ putStrLn "----------------checking map-reduce -------------"
r <- reduce (+) . mapKeyB (\w -> (w, 1 :: Int)) $ getText words "hello world hello"
localIO $ print r
assert (sort (M.toList r) == sort [("hello",2::Int),("world",1)]) $ return r
onAll $ exit (Nothing :: Maybe SomeException) -- remove this to repeat the test
#else
main= return ()
#endif