1{-# LANGUAGE DeriveDataTypeable #-}
2{-# LANGUAGE OverloadedStrings #-}
3{-# OPTIONS_GHC -fno-warn-missing-fields #-}
4{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
5{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
6{-# OPTIONS_GHC -fno-warn-unused-imports #-}
7{-# OPTIONS_GHC -fno-warn-unused-matches #-}
8
9-----------------------------------------------------------------
10-- Autogenerated by Thrift
11--                                                             --
12-- DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
13--  @generated
14-----------------------------------------------------------------
15
16module My.Namespacing.Extend.Test.ExtendTestService_Fuzzer (main) where
17import qualified My.Namespacing.Extend.Test.Extend_Types
18import qualified My.Namespacing.Extend.Test.ExtendTestService_Client as Client
19import qualified My.Namespacing.Test.Hsmodule_Types
20
21import Prelude ( Bool(..), Enum, Float, IO, Double, String, Maybe(..),
22                 Eq, Show, Ord,
23                 concat, error, fromIntegral, fromEnum, length, map,
24                 maybe, not, null, otherwise, return, show, toEnum,
25                 enumFromTo, Bounded, minBound, maxBound, seq, succ,
26                 pred, enumFrom, enumFromThen, enumFromThenTo,
27                 (.), (&&), (||), (==), (++), ($), (-), (>>=), (>>))
28
29import qualified Control.Applicative as Applicative (ZipList(..))
30import Control.Applicative ( (<*>) )
31import qualified Control.DeepSeq as DeepSeq
32import qualified Control.Exception as Exception
33import qualified Control.Monad as Monad ( liftM, ap, when )
34import qualified Data.ByteString.Lazy as BS
35import Data.Functor ( (<$>) )
36import qualified Data.Hashable as Hashable
37import qualified Data.Int as Int
38import Data.List
39import qualified Data.Maybe as Maybe (catMaybes)
40import qualified Data.Text.Lazy.Encoding as Encoding ( decodeUtf8, encodeUtf8 )
41import qualified Data.Text.Lazy as LT
42import qualified Data.Typeable as Typeable ( Typeable )
43import qualified Data.HashMap.Strict as Map
44import qualified Data.HashSet as Set
45import qualified Data.Vector as Vector
46import qualified Test.QuickCheck.Arbitrary as Arbitrary ( Arbitrary(..) )
47import qualified Test.QuickCheck as QuickCheck ( elements )
48
49import qualified Thrift
50import qualified Thrift.Types as Types
51import qualified Thrift.Serializable as Serializable
52import qualified Thrift.Arbitraries as Arbitraries
53
54import qualified My.Namespacing.Test.Hsmodule_Types as Hsmodule_Types
55
56import Prelude ((>>), print)
57import qualified Prelude as P
58import Control.Monad (forM)
59import qualified Data.List as L
60import Data.Maybe (fromJust)
61import qualified Data.Map as Map
62import GHC.Int (Int64, Int32)
63import Data.ByteString.Lazy (ByteString)
64import System.Environment (getArgs)
65import Test.QuickCheck (arbitrary)
66import Test.QuickCheck.Gen (Gen(..))
67import Thrift.FuzzerSupport
68
69
70handleOptions :: ([Options -> Options], [String], [String]) -> Options
71handleOptions (transformers, (serviceName:[]), []) | serviceName `P.elem` serviceNames
72    = (P.foldl (P.flip ($)) defaultOptions transformers) { opt_service = serviceName }
73handleOptions (_, (serviceName:[]), []) | P.otherwise
74    = P.error $ usage ++ "\nUnknown serviceName " ++ serviceName ++ ", should be one of " ++ (P.show serviceNames)
75handleOptions (_, [], _) = P.error $ usage ++ "\nMissing mandatory serviceName to fuzz."
76handleOptions (_, _a, []) = P.error $ usage ++ "\nToo many serviceNames, pick one."
77handleOptions (_, _, e) = P.error $ usage ++ (P.show e)
78
79main :: IO ()
80main = do
81    args <- getArgs
82    let config = handleOptions (getOptions args)
83    fuzz config
84
85selectFuzzer :: Options -> (Options -> IO ())
86selectFuzzer (Options _host _port service _timeout _framed _verbose)
87    = fromJust $ P.lookup service fuzzerFunctions
88
89fuzz :: Options -> IO ()
90fuzz config = (selectFuzzer config) config
91
92-- Dynamic content
93
94-- Configuration via command-line parsing
95
96serviceNames :: [String]
97serviceNames = ["check"]
98
99fuzzerFunctions :: [(String, (Options -> IO ()))]
100fuzzerFunctions = [("check", check_fuzzer)]
101
102-- Random data generation
103inf_Hsmodule_Types_HsFoo :: IO [Hsmodule_Types.HsFoo]
104inf_Hsmodule_Types_HsFoo = infexamples (Arbitrary.arbitrary :: Gen Hsmodule_Types.HsFoo)
105
106-- Fuzzers and exception handlers
107check_fuzzer :: Options -> IO ()
108check_fuzzer opts = do
109  a1 <- Applicative.ZipList <$> inf_Hsmodule_Types_HsFoo
110  _ <- forM (Applicative.getZipList a1) check_fuzzFunc
111  return ()
112  where
113  check_fuzzFunc a1 = let param = (a1) in
114    if opt_framed opts
115    then withThriftDo opts (withFramedTransport opts) (check_fuzzOnce param) (check_exceptionHandler param)
116    else withThriftDo opts (withHandle opts) (check_fuzzOnce param) (check_exceptionHandler param)
117
118check_exceptionHandler :: (Show a1) => (a1) -> IO ()
119check_exceptionHandler (a1) = do
120  P.putStrLn $ "Got exception on data:"
121  P.putStrLn $ "(" ++ show a1 ++ ")"
122check_fuzzOnce (a1) client = Client.check client a1 >> return ()
123
124