{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ConstraintKinds #-}
module Test.Sandwich.WebDriver.Internal.Types where
import Control.Concurrent.MVar
import Control.Exception
import Data.Default
import Data.IORef
import qualified Data.Map as M
import Data.String.Interpolate
import Data.Text (Text)
import Network.HTTP.Client (Manager)
import System.Process
import Test.Sandwich
import Test.Sandwich.WebDriver.Internal.Binaries.Ffmpeg
import Test.Sandwich.WebDriver.Internal.Binaries.Xvfb
import qualified Test.WebDriver as W
import qualified Test.WebDriver.Session as W
import UnliftIO.Async
type Session = String
webdriver :: Label "webdriver" WebDriver
webdriver :: Label "webdriver" WebDriver
webdriver = Label "webdriver" WebDriver
forall {k} (l :: Symbol) (a :: k). Label l a
Label
webdriverSession :: Label "webdriverSession" WebDriverSession
webdriverSession :: Label "webdriverSession" WebDriverSession
webdriverSession = Label "webdriverSession" WebDriverSession
forall {k} (l :: Symbol) (a :: k). Label l a
Label
type ToolsRoot = FilePath
data WhenToSave = Always | OnException | Never deriving (Int -> WhenToSave -> ShowS
[WhenToSave] -> ShowS
WhenToSave -> String
(Int -> WhenToSave -> ShowS)
-> (WhenToSave -> String)
-> ([WhenToSave] -> ShowS)
-> Show WhenToSave
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> WhenToSave -> ShowS
showsPrec :: Int -> WhenToSave -> ShowS
$cshow :: WhenToSave -> String
show :: WhenToSave -> String
$cshowList :: [WhenToSave] -> ShowS
showList :: [WhenToSave] -> ShowS
Show, WhenToSave -> WhenToSave -> Bool
(WhenToSave -> WhenToSave -> Bool)
-> (WhenToSave -> WhenToSave -> Bool) -> Eq WhenToSave
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: WhenToSave -> WhenToSave -> Bool
== :: WhenToSave -> WhenToSave -> Bool
$c/= :: WhenToSave -> WhenToSave -> Bool
/= :: WhenToSave -> WhenToSave -> Bool
Eq)
data RunMode =
Normal
| RunHeadless HeadlessConfig
| RunInXvfb XvfbConfig
data WdOptions = WdOptions {
WdOptions -> Capabilities
capabilities :: W.Capabilities
, WdOptions -> WhenToSave
saveSeleniumMessageHistory :: WhenToSave
, WdOptions -> RunMode
runMode :: RunMode
, WdOptions -> Maybe Manager
httpManager :: Maybe Manager
, WdOptions -> Int
httpRetryCount :: Int
}
data OnDemandOptions = OnDemandOptions {
OnDemandOptions -> FfmpegToUse
ffmpegToUse :: FfmpegToUse
, OnDemandOptions -> XvfbToUse
xvfbToUse :: XvfbToUse
}
defaultOnDemandOptions :: OnDemandOptions
defaultOnDemandOptions = OnDemandOptions {
ffmpegToUse :: FfmpegToUse
ffmpegToUse = FfmpegToUse
UseFfmpegFromPath
, xvfbToUse :: XvfbToUse
xvfbToUse = XvfbToUse
UseXvfbFromPath
}
data HeadlessConfig = HeadlessConfig {
HeadlessConfig -> Maybe (Int, Int)
headlessResolution :: Maybe (Int, Int)
}
defaultHeadlessConfig :: HeadlessConfig
defaultHeadlessConfig :: HeadlessConfig
defaultHeadlessConfig = Maybe (Int, Int) -> HeadlessConfig
HeadlessConfig Maybe (Int, Int)
forall a. Maybe a
Nothing
data XvfbConfig = XvfbConfig {
XvfbConfig -> Maybe (Int, Int)
xvfbResolution :: Maybe (Int, Int)
, XvfbConfig -> Bool
xvfbStartFluxbox :: Bool
}
defaultXvfbConfig :: XvfbConfig
defaultXvfbConfig :: XvfbConfig
defaultXvfbConfig = Maybe (Int, Int) -> Bool -> XvfbConfig
XvfbConfig Maybe (Int, Int)
forall a. Maybe a
Nothing Bool
False
defaultWdOptions :: WdOptions
defaultWdOptions :: WdOptions
defaultWdOptions = WdOptions {
capabilities :: Capabilities
capabilities = Capabilities
forall a. Default a => a
def
, saveSeleniumMessageHistory :: WhenToSave
saveSeleniumMessageHistory = WhenToSave
OnException
, runMode :: RunMode
runMode = RunMode
Normal
, httpManager :: Maybe Manager
httpManager = Maybe Manager
forall a. Maybe a
Nothing
, httpRetryCount :: Int
httpRetryCount = Int
0
}
data OnDemand a =
OnDemandNotStarted
| OnDemandInProgress (Async a)
| OnDemandReady a
| OnDemandErrored Text
data WebDriver = WebDriver {
WebDriver -> String
wdName :: String
, WebDriver -> (ProcessHandle, Maybe XvfbSession)
wdWebDriver :: (ProcessHandle, Maybe XvfbSession)
, WebDriver -> WdOptions
wdOptions :: WdOptions
, WebDriver -> MVar (Map String WDSession)
wdSessionMap :: MVar (M.Map Session W.WDSession)
, WebDriver -> WDConfig
wdConfig :: W.WDConfig
, WebDriver -> String
wdDownloadDir :: FilePath
, WebDriver -> FfmpegToUse
wdFfmpegToUse :: FfmpegToUse
, WebDriver -> MVar (OnDemand String)
wdFfmpeg :: MVar (OnDemand FilePath)
, WebDriver -> XvfbToUse
wdXvfbToUse :: XvfbToUse
, WebDriver -> MVar (OnDemand String)
wdXvfb :: MVar (OnDemand FilePath)
}
data InvalidLogsException = InvalidLogsException [W.LogEntry]
deriving (Int -> InvalidLogsException -> ShowS
[InvalidLogsException] -> ShowS
InvalidLogsException -> String
(Int -> InvalidLogsException -> ShowS)
-> (InvalidLogsException -> String)
-> ([InvalidLogsException] -> ShowS)
-> Show InvalidLogsException
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> InvalidLogsException -> ShowS
showsPrec :: Int -> InvalidLogsException -> ShowS
$cshow :: InvalidLogsException -> String
show :: InvalidLogsException -> String
$cshowList :: [InvalidLogsException] -> ShowS
showList :: [InvalidLogsException] -> ShowS
Show)
instance Exception InvalidLogsException
data XvfbSession = XvfbSession {
XvfbSession -> Int
xvfbDisplayNum :: Int
, XvfbSession -> String
xvfbXauthority :: FilePath
, XvfbSession -> (Int, Int)
xvfbDimensions :: (Int, Int)
, XvfbSession -> ProcessHandle
xvfbProcess :: ProcessHandle
, XvfbSession -> Maybe ProcessHandle
xvfbFluxboxProcess :: Maybe ProcessHandle
}
type WebDriverSession = (Session, IORef W.WDSession)
getWdOptions :: WebDriver -> WdOptions
getWdOptions :: WebDriver -> WdOptions
getWdOptions = WebDriver -> WdOptions
wdOptions
getDisplayNumber :: WebDriver -> Maybe Int
getDisplayNumber :: WebDriver -> Maybe Int
getDisplayNumber (WebDriver {wdWebDriver :: WebDriver -> (ProcessHandle, Maybe XvfbSession)
wdWebDriver=(ProcessHandle
_, Just (XvfbSession {Int
xvfbDisplayNum :: XvfbSession -> Int
xvfbDisplayNum :: Int
xvfbDisplayNum}))}) = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
xvfbDisplayNum
getDisplayNumber WebDriver
_ = Maybe Int
forall a. Maybe a
Nothing
getXvfbSession :: WebDriver -> Maybe XvfbSession
getXvfbSession :: WebDriver -> Maybe XvfbSession
getXvfbSession (WebDriver {wdWebDriver :: WebDriver -> (ProcessHandle, Maybe XvfbSession)
wdWebDriver=(ProcessHandle
_, Just XvfbSession
sess)}) = XvfbSession -> Maybe XvfbSession
forall a. a -> Maybe a
Just XvfbSession
sess
getXvfbSession WebDriver
_ = Maybe XvfbSession
forall a. Maybe a
Nothing
getDownloadDirectory :: WebDriver -> FilePath
getDownloadDirectory :: WebDriver -> String
getDownloadDirectory = WebDriver -> String
wdDownloadDir
getWebDriverName :: WebDriver -> String
getWebDriverName :: WebDriver -> String
getWebDriverName (WebDriver {String
wdName :: WebDriver -> String
wdName :: String
wdName}) = String
wdName
instance Show XvfbSession where
show :: XvfbSession -> String
show (XvfbSession {Int
xvfbDisplayNum :: XvfbSession -> Int
xvfbDisplayNum :: Int
xvfbDisplayNum}) = [i|<XVFB session with server num #{xvfbDisplayNum}>|]