|  | {-# LANGUAGE ScopedTypeVariables #-} | 
|  | -- | 
|  | -- 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 Main where | 
|  |  | 
|  |  | 
|  | import qualified Control.Exception | 
|  | import qualified Data.Map as Map | 
|  | import qualified Data.Set as Set | 
|  | import qualified Network | 
|  |  | 
|  | import Thrift | 
|  | import Thrift.Protocol.Binary | 
|  | import Thrift.Server | 
|  | import Thrift.Transport.Handle | 
|  |  | 
|  | import qualified ThriftTestUtils | 
|  |  | 
|  | import qualified ThriftTest | 
|  | import qualified ThriftTest_Client as Client | 
|  | import qualified ThriftTest_Iface as Iface | 
|  | import qualified ThriftTest_Types as Types | 
|  |  | 
|  |  | 
|  | data TestHandler = TestHandler | 
|  | instance Iface.ThriftTest_Iface TestHandler where | 
|  | testVoid _ = return () | 
|  |  | 
|  | testString _ (Just s) = do | 
|  | ThriftTestUtils.serverLog s | 
|  | return s | 
|  |  | 
|  | testString _ Nothing = do | 
|  | error $ "Unsupported testString form" | 
|  |  | 
|  | testByte _ (Just x) = do | 
|  | ThriftTestUtils.serverLog $ show x | 
|  | return x | 
|  |  | 
|  | testByte _ Nothing = do | 
|  | error $ "Unsupported testByte form" | 
|  |  | 
|  | testI32 _ (Just x) = do | 
|  | ThriftTestUtils.serverLog $ show x | 
|  | return x | 
|  |  | 
|  | testI32 _ Nothing = do | 
|  | error $ "Unsupported testI32 form" | 
|  |  | 
|  | testI64 _ (Just x) = do | 
|  | ThriftTestUtils.serverLog $ show x | 
|  | return x | 
|  |  | 
|  | testI64 _ Nothing = do | 
|  | error $ "Unsupported testI64 form" | 
|  |  | 
|  | testDouble _ (Just x) = do | 
|  | ThriftTestUtils.serverLog $ show x | 
|  | return x | 
|  |  | 
|  | testDouble _ Nothing = do | 
|  | error $ "Unsupported testDouble form" | 
|  |  | 
|  | testStruct _ (Just x) = do | 
|  | ThriftTestUtils.serverLog $ show x | 
|  | return x | 
|  |  | 
|  | testStruct _ Nothing = do | 
|  | error $ "Unsupported testStruct form" | 
|  |  | 
|  | testNest _ (Just x) = do | 
|  | ThriftTestUtils.serverLog $ show x | 
|  | return x | 
|  |  | 
|  | testNest _ Nothing = do | 
|  | error $ "Unsupported testNest form" | 
|  |  | 
|  | testMap _ (Just x) = do | 
|  | ThriftTestUtils.serverLog $ show x | 
|  | return x | 
|  |  | 
|  | testMap _ Nothing = do | 
|  | error $ "Unsupported testMap form" | 
|  |  | 
|  | testStringMap _ (Just x) = do | 
|  | ThriftTestUtils.serverLog $ show x | 
|  | return x | 
|  |  | 
|  | testStringMap _ Nothing = do | 
|  | error $ "Unsupported testMap form" | 
|  |  | 
|  | testSet _ (Just x) = do | 
|  | ThriftTestUtils.serverLog $ show x | 
|  | return x | 
|  |  | 
|  | testSet _ Nothing = do | 
|  | error $ "Unsupported testSet form" | 
|  |  | 
|  | testList _ (Just x) = do | 
|  | ThriftTestUtils.serverLog $ show x | 
|  | return x | 
|  |  | 
|  | testList _ Nothing = do | 
|  | error $ "Unsupported testList form" | 
|  |  | 
|  | testEnum _ (Just x) = do | 
|  | ThriftTestUtils.serverLog $ show x | 
|  | return x | 
|  |  | 
|  | testEnum _ Nothing = do | 
|  | error $ "Unsupported testEnum form" | 
|  |  | 
|  | testTypedef _ (Just x) = do | 
|  | ThriftTestUtils.serverLog $ show x | 
|  | return x | 
|  |  | 
|  | testTypedef _ Nothing = do | 
|  | error $ "Unsupported testTypedef form" | 
|  |  | 
|  | testMapMap _ (Just _) = do | 
|  | return (Map.fromList [(1, Map.fromList [(2, 2)])]) | 
|  |  | 
|  | testMapMap _ Nothing = do | 
|  | error $ "Unsupported testMapMap form" | 
|  |  | 
|  | testInsanity _ (Just x) = do | 
|  | return (Map.fromList [(1, Map.fromList [(Types.ONE, x)])]) | 
|  |  | 
|  | testInsanity _ Nothing = do | 
|  | error $ "Unsupported testInsanity form" | 
|  |  | 
|  | testMulti _ _ _ _ _ _ _ = do | 
|  | return (Types.Xtruct Nothing Nothing Nothing Nothing) | 
|  |  | 
|  | testException _ _ = do | 
|  | Control.Exception.throw (Types.Xception (Just 1) (Just "bya")) | 
|  |  | 
|  | testMultiException _ _ _ = do | 
|  | Control.Exception.throw (Types.Xception (Just 1) (Just "xyz")) | 
|  |  | 
|  | testOneway _ (Just i) = do | 
|  | ThriftTestUtils.serverLog $ show i | 
|  |  | 
|  | testOneway _ Nothing = do | 
|  | error $ "Unsupported testOneway form" | 
|  |  | 
|  |  | 
|  | client :: (String, Network.PortID) -> IO () | 
|  | client addr = do | 
|  | to <- hOpen addr | 
|  | let ps = (BinaryProtocol to, BinaryProtocol to) | 
|  |  | 
|  | v1 <- Client.testString ps "bya" | 
|  | ThriftTestUtils.clientLog v1 | 
|  |  | 
|  | v2 <- Client.testByte ps 8 | 
|  | ThriftTestUtils.clientLog $ show v2 | 
|  |  | 
|  | v3 <- Client.testByte ps (-8) | 
|  | ThriftTestUtils.clientLog $ show v3 | 
|  |  | 
|  | v4 <- Client.testI32 ps 32 | 
|  | ThriftTestUtils.clientLog $ show v4 | 
|  |  | 
|  | v5 <- Client.testI32 ps (-32) | 
|  | ThriftTestUtils.clientLog $ show v5 | 
|  |  | 
|  | v6 <- Client.testI64 ps 64 | 
|  | ThriftTestUtils.clientLog $ show v6 | 
|  |  | 
|  | v7 <- Client.testI64 ps (-64) | 
|  | ThriftTestUtils.clientLog $ show v7 | 
|  |  | 
|  | v8 <- Client.testDouble ps 3.14 | 
|  | ThriftTestUtils.clientLog $ show v8 | 
|  |  | 
|  | v9 <- Client.testDouble ps (-3.14) | 
|  | ThriftTestUtils.clientLog $ show v9 | 
|  |  | 
|  | v10 <- Client.testMap ps (Map.fromList [(1,1),(2,2),(3,3)]) | 
|  | ThriftTestUtils.clientLog $ show v10 | 
|  |  | 
|  | v11 <- Client.testStringMap ps (Map.fromList [("a","123"),("a b","with spaces "),("same","same"),("0","numeric key")]) | 
|  | ThriftTestUtils.clientLog $ show v11 | 
|  |  | 
|  | v12 <- Client.testList ps [1,2,3,4,5] | 
|  | ThriftTestUtils.clientLog $ show v12 | 
|  |  | 
|  | v13 <- Client.testSet ps (Set.fromList [1,2,3,4,5]) | 
|  | ThriftTestUtils.clientLog $ show v13 | 
|  |  | 
|  | v14 <- Client.testStruct ps (Types.Xtruct (Just "hi") (Just 4) (Just 5) Nothing) | 
|  | ThriftTestUtils.clientLog $ show v14 | 
|  |  | 
|  | (testException ps "bad") `Control.Exception.catch` testExceptionHandler | 
|  |  | 
|  | (testMultiException ps "ok") `Control.Exception.catch` testMultiExceptionHandler1 | 
|  | (testMultiException ps "bad") `Control.Exception.catch` testMultiExceptionHandler2 `Control.Exception.catch` testMultiExceptionHandler3 | 
|  |  | 
|  | -- (  (Client.testMultiException ps "e" "e2">> ThriftTestUtils.clientLog "bad") `Control.Exception.catch` | 
|  |  | 
|  | tClose to | 
|  | where testException ps msg = do | 
|  | Client.testException ps "e" | 
|  | ThriftTestUtils.clientLog msg | 
|  | return () | 
|  |  | 
|  | testExceptionHandler (e :: Types.Xception) = do | 
|  | ThriftTestUtils.clientLog $ show e | 
|  |  | 
|  | testMultiException ps msg = do | 
|  | _ <- Client.testMultiException ps "e" "e2" | 
|  | ThriftTestUtils.clientLog msg | 
|  | return () | 
|  |  | 
|  | testMultiExceptionHandler1 (e :: Types.Xception) = do | 
|  | ThriftTestUtils.clientLog $ show e | 
|  |  | 
|  | testMultiExceptionHandler2 (e :: Types.Xception2) = do | 
|  | ThriftTestUtils.clientLog $ show e | 
|  |  | 
|  | testMultiExceptionHandler3 (_ :: Control.Exception.SomeException) = do | 
|  | ThriftTestUtils.clientLog "ok" | 
|  |  | 
|  |  | 
|  | server :: Network.PortNumber -> IO () | 
|  | server port = do | 
|  | ThriftTestUtils.serverLog "Ready..." | 
|  | (runBasicServer TestHandler ThriftTest.process port) | 
|  | `Control.Exception.catch` | 
|  | (\(TransportExn s _) -> error $ "FAILURE: " ++ s) | 
|  |  | 
|  |  | 
|  | main :: IO () | 
|  | main = ThriftTestUtils.runTest server client |