packages feed

mysql-haskell-0.1.0.0: test/BinLog.hs

{-# LANGUAGE NegativeLiterals    #-}
{-# LANGUAGE ScopedTypeVariables #-}

module BinLog where

import           Control.Applicative
import           Control.Exception
import           Control.Monad
import           Data.Text.Encoding    (encodeUtf8)
import           Data.Time.Clock.POSIX
import           Data.Time.Format
import           Data.Time.LocalTime
import           Database.MySQL.Base
import           Database.MySQL.BinLog
import qualified System.IO.Streams     as Stream
import           Test.Tasty.HUnit

eventProducer :: IO ()
eventProducer = do
    c <- connect defaultConnectInfo {ciUser = "testMySQLHaskell", ciDatabase = "testMySQLHaskell"}
    execute_ c q1
    execute_ c q2
    return ()

tests :: MySQLConn -> Assertion
tests c = do
    Just blt <- getLastBinLogTracker c
    x@(fd, _, _) <- dumpBinLog c 1002 blt False
    rowEventStream <- decodeRowBinLogEvent x

    let Just t = parseTimeM True defaultTimeLocale  "%F %T" "2016-08-08 17:25:59" :: Maybe LocalTime
    z <- getCurrentTimeZone
    let timestamp = round $ utcTimeToPOSIXSeconds (localTimeToUTC z t)

    Just (RowUpdateEvent _ tme ue) <- Stream.read rowEventStream
    assertEqual "decode update event cloumn" (updateColumnCnt ue) 30
    assertEqual "decode update event rows" (updateRowData ue)
        [
            (
                [ BinLogLong 0
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                , BinLogNull
                ], [ BinLogLong 0
                , BinLogBit 224
                , BinLogTiny (-128)
                , BinLogTiny (-1)
                , BinLogShort (-32768)
                , BinLogShort (-1)
                , BinLogInt24 (-8388608)
                , BinLogInt24 (-1)
                , BinLogLong (-2147483648)
                , BinLogLong (-1)
                , BinLogLongLong (-9223372036854775808)
                , BinLogLongLong (-1)
                , BinLogNewDecimal 1.2345678900123456789e9
                , BinLogFloat 3.14159
                , BinLogDouble 3.1415926535
                , BinLogDate 2016 8 8
                , BinLogDateTime 2016 8 8 17 25 59
                , BinLogTimeStamp timestamp
                , BinLogTime 0 199 59 59
                , BinLogYear 1999
                , BinLogBytes "12345678"
                , BinLogBytes (encodeUtf8 "韩冬真赞")
                , BinLogBytes "12345678"
                , BinLogBytes "12345678"
                , BinLogBytes "12345678"
                , BinLogBytes (encodeUtf8 "韩冬真赞")
                , BinLogBytes "12345678"
                , BinLogBytes (encodeUtf8 "韩冬真赞")
                , BinLogEnum 1
                , BinLogSet 3
                ]
            )
        ]

    Just (RowUpdateEvent _ tme ue) <- Stream.read rowEventStream
    assertEqual "decode update event rows" (updateRowData ue)
        [
            (
                [ BinLogLong 0
                , BinLogBit 224   -- 0b11100000
                , BinLogTiny (-128)
                , BinLogTiny (-1)
                , BinLogShort (-32768)
                , BinLogShort (-1)
                , BinLogInt24 (-8388608)
                , BinLogInt24 (-1)
                , BinLogLong (-2147483648)
                , BinLogLong (-1)
                , BinLogLongLong (-9223372036854775808)
                , BinLogLongLong (-1)
                , BinLogNewDecimal 1.2345678900123456789e9
                , BinLogFloat 3.14159
                , BinLogDouble 3.1415926535
                , BinLogDate 2016 8 8
                , BinLogDateTime 2016 8 8 17 25 59
                , BinLogTimeStamp timestamp
                , BinLogTime 0 199 59 59
                , BinLogYear 1999
                , BinLogBytes "12345678"
                , BinLogBytes (encodeUtf8 "韩冬真赞")
                , BinLogBytes "12345678"
                , BinLogBytes "12345678"
                , BinLogBytes "12345678"
                , BinLogBytes (encodeUtf8 "韩冬真赞")
                , BinLogBytes "12345678"
                , BinLogBytes (encodeUtf8 "韩冬真赞")
                , BinLogEnum 1
                , BinLogSet 3
                ],  [ BinLogLong 0
                , BinLogBit 57514   -- 0b1110000010101010
                , BinLogTiny (-1)
                , BinLogTiny (-1)
                , BinLogShort (-32768)
                , BinLogShort (-1)
                , BinLogInt24 (-1)
                , BinLogInt24 (-1)
                , BinLogLong (-1)
                , BinLogLong (-1)
                , BinLogLongLong (-9223372036854775808)
                , BinLogLongLong (-1)
                , BinLogNewDecimal -1.2345678900123456789e9
                , BinLogFloat -3.14159
                , BinLogDouble -3.1415926535
                , BinLogDate 1800 8 8
                , BinLogDateTime 1800 8 8 17 25 59
                , BinLogTimeStamp timestamp
                , BinLogTime 1 199 59 59
                , BinLogYear 1901
                , BinLogBytes "12345678"
                , BinLogBytes (encodeUtf8 "韩冬真赞")
                , BinLogBytes "12345678"
                , BinLogBytes "12345678"
                , BinLogBytes "12345678"
                , BinLogBytes (encodeUtf8 "韩冬真赞")
                , BinLogBytes "12345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123"
                , BinLogBytes (encodeUtf8 "韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞")
                , BinLogEnum 1
                , BinLogSet 3
                ]
            )
        ]
q1 :: Query
q1 =  "UPDATE test SET \
            \__bit        = b'11100000'                            ,\
            \__tinyInt    = -128                                   ,\
            \__tinyIntU   = 255                                    ,\
            \__smallInt   = -32768                                 ,\
            \__smallIntU  = 65535                                  ,\
            \__mediumInt  = -8388608                               ,\
            \__mediumIntU = 16777215                               ,\
            \__int        = -2147483648                            ,\
            \__intU       = 4294967295                             ,\
            \__bigInt     = -9223372036854775808                   ,\
            \__bigIntU    = 18446744073709551615                   ,\
            \__decimal    = 1234567890.0123456789                  ,\
            \__float      = 3.14159                                ,\
            \__double     = 3.1415926535                           ,\
            \__date       = '2016-08-08'                           ,\
            \__datetime   = '2016-08-08 17:25:59'                  ,\
            \__timestamp  = '2016-08-08 17:25:59'                  ,\
            \__time       = '-199:59:59'                           ,\
            \__year       = 1999                                   ,\
            \__char       = '12345678'                             ,\
            \__varchar    = '韩冬真赞'                             ,\
            \__binary     = '12345678'                             ,\
            \__varbinary  = '12345678'                             ,\
            \__tinyblob   = '12345678'                             ,\
            \__tinytext   = '韩冬真赞'                             ,\
            \__blob       = '12345678'                             ,\
            \__text       = '韩冬真赞'                             ,\
            \__enum       = 'foo'                                  ,\
            \__set        = 'foo,bar' WHERE __id=0"


q2 :: Query
q2 =  "UPDATE test SET \
            \__bit        = b'1110000010101010'                    ,\
            \__tinyInt    = -1                                     ,\
            \__tinyIntU   = 255                                    ,\
            \__smallInt   = -32768                                 ,\
            \__smallIntU  = 65535                                  ,\
            \__mediumInt  = -1                                     ,\
            \__mediumIntU = 16777215                               ,\
            \__int        = -1                                     ,\
            \__intU       = 4294967295                             ,\
            \__bigInt     = -9223372036854775808                   ,\
            \__bigIntU    = 18446744073709551615                   ,\
            \__decimal    = -1234567890.0123456789                 ,\
            \__float      = -3.14159                                ,\
            \__double     = -3.1415926535                           ,\
            \__date       = '1800-08-08'                           ,\
            \__datetime   = '1800-08-08 17:25:59'                  ,\
            \__timestamp  = '2016-08-08 17:25:59'                  ,\
            \__time       = '199:59:59'                            ,\
            \__year       = 1901                                   ,\
            \__char       = '12345678'                             ,\
            \__varchar    = '韩冬真赞'                             ,\
            \__binary     = '12345678'                             ,\
            \__varbinary  = '12345678'                             ,\
            \__tinyblob   = '12345678'                             ,\
            \__tinytext   = '韩冬真赞'                             ,\
            \__blob       = '12345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123'                             ,\
            \__text       = '韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞韩冬真赞'                              ,\
            \__enum       = 'foo'                                  ,\
            \__set        = 'foo,bar' WHERE __id=0"