[
https://issues.apache.org/jira/browse/THRIFT-728?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Aran Donohue updated THRIFT-728:
--------------------------------
Attachment: arbitrary.patch
Include's Iain's feedback and a fix replacing use of the variable "rec" with
"record" to allow compilation on GHC 6.12
> Make generated Haskell code an instance of Arbitrary
> ----------------------------------------------------
>
> Key: THRIFT-728
> URL: https://issues.apache.org/jira/browse/THRIFT-728
> Project: Thrift
> Issue Type: New Feature
> Components: Compiler (Haskell), Library (Haskell)
> Environment: All
> Reporter: Aran Donohue
> Priority: Minor
> Attachments: arbitrary.patch
>
> Original Estimate: 96h
> Remaining Estimate: 96h
>
> The patch
> * Generates Arbitrary instances for Thrift structs, enums and exceptions
> * Provides Arbitrary instances for GHC's Int64, Data.Map.Map and
> Data.Set.Set
> * Makes Thrift enums instances of Bounded and improves the Enum instance
> declaration
> Making a type an instance of Test.QuickCheck.Arbitrary specifies how to
> generate random instances of the struct. This is useful for testing.
> For example, consider the following simple Thrift declaration:
> {code:title=distributed_log.thrift}
> enum LogLevel { DEBUG, INFO, WARNING, ERROR }
>
>
>
> typedef i32 UnixTimeStamp
>
>
>
> struct LogEntry {
>
> 1: LogLevel level,
>
> 2: UnixTimeStamp timestamp,
>
> 3: string message
>
> }
>
>
>
> service Logger {
>
> void log(1: LogEntry entry)
>
> }
> {code}
> With the patch, the following program (import statements elided) is a fuzzer
> for the log service.
> {code:title=LogTest.hs}
> -- ripped from Test.QuickCheck.Gen.sample'
>
> infexamples ∷ Gen a → IO [a]
>
> infexamples (MkGen m) =
>
> do rnd ← newStdGen
>
> let rnds rnd = rnd1 : rnds rnd2 where (rnd1, rnd2) = split rnd
>
> return [(m r n) | (r, n) ← rnds rnd `zip` [0,2..] ]
>
>
>
> infentries = infexamples (arbitrary ∷ Gen LogEntry)
>
>
>
> main = do entries ← infentries
>
> forM entries logAnEntry
>
>
>
> logAnEntry entry = do
>
> transport ← hOpen ("localhost", PortNumber 9090)
>
> let binProto = BinaryProtocol transport
>
> let client = (binProto, binProto)
>
> (Client.log client) entry
>
> tClose transport
>
> `Control.Exception.catch`
>
> (λ(TransportExn s t) → print s)
> --On systems with Haskell we could just generate a fuzzer like this one.
> {code}
> In implementing the Arbitrary instances, it was useful to make Thrift enums
> instances of Bounded and to improve the Enum instance. Specifically, whereas
> before,
> {code}
> [DEBUG .. ]
> {code}
> would throw an exception, now it behaves as expected without an exception.
> I consider the patch incomplete. It's more of a starting point for a
> discussion at this point than a serious candidate for inclusion. If it is of
> interest, I'd appreciate some direction on testing it as well as style, and
> I'd welcome any other comments or thoughts.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.