-- -- Licensed to the Apache Software Foundation (ASF) under one -- or more contributor license agreements. See the NOTICE file -- distributed with this work for additional information -- regarding copyright ownership. The ASF licenses this file -- to you under the Apache License, Version 2.0 (the -- "License"); you may not use this file except in compliance -- with the License. You may obtain a copy of the License at -- -- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, -- software distributed under the License is distributed on an -- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -- KIND, either express or implied. See the License for the -- specific language governing permissions and limitations -- under the License. -- module ThriftTestUtils (ClientFunc, ServerFunc, clientLog, serverLog, testLog, runTest) where import qualified Control.Concurrent import qualified Network import qualified System.IO serverPort :: Network.PortNumber serverPort = 9090 serverAddress :: (String, Network.PortID) serverAddress = ("localhost", Network.PortNumber serverPort) testLog :: String -> IO () testLog str = do System.IO.hPutStr System.IO.stdout $ str ++ "\n" System.IO.hFlush System.IO.stdout clientLog :: String -> IO () clientLog str = testLog $ "CLIENT: " ++ str serverLog :: String -> IO () serverLog str = testLog $ "SERVER: " ++ str type ServerFunc = Network.PortNumber -> IO () type ClientFunc = (String, Network.PortID) -> IO () runTest :: ServerFunc -> ClientFunc -> IO () runTest server client = do _ <- Control.Concurrent.forkIO (server serverPort) -- Fairly horrible; this does not 100% guarantees that the other thread -- has actually opened the socket we need... but not much else we can do -- without this, the client races the server to the socket, and wins every -- time Control.Concurrent.yield Control.Concurrent.threadDelay $ 500 * 1000 -- unit is in _micro_seconds Control.Concurrent.yield _ <- client serverAddress testLog "SUCCESS"