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 TestService_Fuzzer (main) where
17import qualified Module_Types
18import qualified TestService_Client as Client
19
20import Prelude ( Bool(..), Enum, Float, IO, Double, String, Maybe(..),
21                 Eq, Show, Ord,
22                 concat, error, fromIntegral, fromEnum, length, map,
23                 maybe, not, null, otherwise, return, show, toEnum,
24                 enumFromTo, Bounded, minBound, maxBound, seq, succ,
25                 pred, enumFrom, enumFromThen, enumFromThenTo,
26                 (.), (&&), (||), (==), (++), ($), (-), (>>=), (>>))
27
28import qualified Control.Applicative as Applicative (ZipList(..))
29import Control.Applicative ( (<*>) )
30import qualified Control.DeepSeq as DeepSeq
31import qualified Control.Exception as Exception
32import qualified Control.Monad as Monad ( liftM, ap, when )
33import qualified Data.ByteString.Lazy as BS
34import Data.Functor ( (<$>) )
35import qualified Data.Hashable as Hashable
36import qualified Data.Int as Int
37import Data.List
38import qualified Data.Maybe as Maybe (catMaybes)
39import qualified Data.Text.Lazy.Encoding as Encoding ( decodeUtf8, encodeUtf8 )
40import qualified Data.Text.Lazy as LT
41import qualified Data.Typeable as Typeable ( Typeable )
42import qualified Data.HashMap.Strict as Map
43import qualified Data.HashSet as Set
44import qualified Data.Vector as Vector
45import qualified Test.QuickCheck.Arbitrary as Arbitrary ( Arbitrary(..) )
46import qualified Test.QuickCheck as QuickCheck ( elements )
47
48import qualified Thrift
49import qualified Thrift.Types as Types
50import qualified Thrift.Serializable as Serializable
51import qualified Thrift.Arbitraries as Arbitraries
52
53import Prelude ((>>), print)
54import qualified Prelude as P
55import Control.Monad (forM)
56import qualified Data.List as L
57import Data.Maybe (fromJust)
58import qualified Data.Map as Map
59import GHC.Int (Int64, Int32)
60import Data.ByteString.Lazy (ByteString)
61import System.Environment (getArgs)
62import Test.QuickCheck (arbitrary)
63import Test.QuickCheck.Gen (Gen(..))
64import Thrift.FuzzerSupport
65
66
67handleOptions :: ([Options -> Options], [String], [String]) -> Options
68handleOptions (transformers, (serviceName:[]), []) | serviceName `P.elem` serviceNames
69    = (P.foldl (P.flip ($)) defaultOptions transformers) { opt_service = serviceName }
70handleOptions (_, (serviceName:[]), []) | P.otherwise
71    = P.error $ usage ++ "\nUnknown serviceName " ++ serviceName ++ ", should be one of " ++ (P.show serviceNames)
72handleOptions (_, [], _) = P.error $ usage ++ "\nMissing mandatory serviceName to fuzz."
73handleOptions (_, _a, []) = P.error $ usage ++ "\nToo many serviceNames, pick one."
74handleOptions (_, _, e) = P.error $ usage ++ (P.show e)
75
76main :: IO ()
77main = do
78    args <- getArgs
79    let config = handleOptions (getOptions args)
80    fuzz config
81
82selectFuzzer :: Options -> (Options -> IO ())
83selectFuzzer (Options _host _port service _timeout _framed _verbose)
84    = fromJust $ P.lookup service fuzzerFunctions
85
86fuzz :: Options -> IO ()
87fuzz config = (selectFuzzer config) config
88
89-- Dynamic content
90
91-- Configuration via command-line parsing
92
93serviceNames :: [String]
94serviceNames = ["init"]
95
96fuzzerFunctions :: [(String, (Options -> IO ()))]
97fuzzerFunctions = [("init", init_fuzzer)]
98
99-- Random data generation
100inf_Int_Int64 :: IO [Int.Int64]
101inf_Int_Int64 = infexamples (Arbitrary.arbitrary :: Gen Int.Int64)
102
103-- Fuzzers and exception handlers
104init_fuzzer :: Options -> IO ()
105init_fuzzer opts = do
106  a1 <- Applicative.ZipList <$> inf_Int_Int64
107  _ <- forM (Applicative.getZipList a1) init_fuzzFunc
108  return ()
109  where
110  init_fuzzFunc a1 = let param = (a1) in
111    if opt_framed opts
112    then withThriftDo opts (withFramedTransport opts) (init_fuzzOnce param) (init_exceptionHandler param)
113    else withThriftDo opts (withHandle opts) (init_fuzzOnce param) (init_exceptionHandler param)
114
115init_exceptionHandler :: (Show a1) => (a1) -> IO ()
116init_exceptionHandler (a1) = do
117  P.putStrLn $ "Got exception on data:"
118  P.putStrLn $ "(" ++ show a1 ++ ")"
119init_fuzzOnce (a1) client = Client.init client a1 >> return ()
120
121