Skip to content

Commit

Permalink
Samples introduced. Testing framework purified from sample domain types.
Browse files Browse the repository at this point in the history
  • Loading branch information
graninas committed Dec 8, 2018
1 parent dc44ff4 commit 7a7bbac
Show file tree
Hide file tree
Showing 89 changed files with 531 additions and 496 deletions.
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,8 @@ Run slow and unreliable tests:

# Node code sample

* Server logic: [Enecuum.Assets.Nodes.TstNodes.PingPong.PingServer](./src/Enecuum/Assets/Nodes/TstNodes/PingPong/PingServer.hs)
* Client logic: [Enecuum.Assets.Nodes.TstNodes.PingPong.PongClient](./src/Enecuum/Assets/Nodes/TstNodes/PingPong/PongClient.hs)
* Server logic: [Enecuum.Samples.Assets.Nodes.TstNodes.PingPong.PingServer](./src/Enecuum/Samples/Assets/Nodes/TstNodes/PingPong/PingServer.hs)
* Client logic: [Enecuum.Samples.Assets.Nodes.TstNodes.PingPong.PongClient](./src/Enecuum/Samples/Assets/Nodes/TstNodes/PingPong/PongClient.hs)
* Configs:
- [./configs/tst_ping_server.json](./configs/tst_ping_server.json)
- [./configs/tst_pong_client1.json](./configs/tst_pong_client1.json)
Expand All @@ -144,15 +144,15 @@ In this sample, two nodes interact via network sending UDP messages.
- Listens UDP port for `Ping` messages.
- Sends `Pons` message back to the client.
- Manages a concurrent internal state (counter of pings).

`stack exec enq-test-node-haskell singlenode ./configs/tst_ping_server.json`

* Pong client node
- Sends `Ping` messages to the server periodically.
- Accepts `Pong` messages from the server.

`stack exec enq-test-node-haskell singlenode ./configs/tst_pong_client1.json`

`stack exec enq-test-node-haskell singlenode ./configs/tst_pong_client2.json`

### Network messages
Expand Down
4 changes: 2 additions & 2 deletions app/Enecuum/Main.hs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module Main where

import Enecuum.Assets.GenConfigs (genConfigs)
import Enecuum.Assets.Initialization (initialize)
import Enecuum.Samples.Assets.GenConfigs (genConfigs)
import Enecuum.Samples.Assets.Initialization (initialize)
import Enecuum.Config (withConfig)
import Enecuum.Prelude

Expand Down
22 changes: 0 additions & 22 deletions src/Enecuum/Assets/Nodes/Methods.hs

This file was deleted.

15 changes: 0 additions & 15 deletions src/Enecuum/Assets/TstScenarios.hs

This file was deleted.

6 changes: 0 additions & 6 deletions src/Enecuum/Blockchain/DB.hs

This file was deleted.

11 changes: 0 additions & 11 deletions src/Enecuum/Blockchain/DB/Entities.hs

This file was deleted.

12 changes: 0 additions & 12 deletions src/Enecuum/Blockchain/Domain.hs

This file was deleted.

8 changes: 0 additions & 8 deletions src/Enecuum/Blockchain/Language.hs

This file was deleted.

2 changes: 0 additions & 2 deletions src/Enecuum/Blockchain/Language/Transaction.hs

This file was deleted.

21 changes: 19 additions & 2 deletions src/Enecuum/Framework/Domain/Node.hs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

module Enecuum.Framework.Domain.Node where

import qualified Data.Aeson as J
import Data.Aeson.Extra (noLensPrefixJsonConfig)
import Enecuum.Core.Types (StringHash)
import Data.Aeson.Extra (noLensPrefixJsonConfig)
import qualified Data.Aeson as J
import Enecuum.Framework.Domain.Networking
import Enecuum.Prelude
import Network.Socket (PortNumber)
Expand Down Expand Up @@ -38,3 +38,20 @@ instance FromJSON NodeAddress where parseJSON = J.genericParseJSON noLensPrefixJ
-- TODO: get rid of it.
newtype NodeID = NodeID Text
deriving (Show, Eq)

-- | Common
data SuccessMsg = SuccessMsg
deriving (Show, Eq, Generic, ToJSON, FromJSON)

newtype IsDead = IsDead StringHash
deriving (Show, Eq, Generic, ToJSON, FromJSON)

-- | Network messages
data Ping = Ping
deriving (Show, Eq, Generic, ToJSON, FromJSON)

data Pong = Pong
deriving (Show, Eq, Generic, ToJSON, FromJSON)

data Stop = Stop
deriving (Show, Eq, Generic, ToJSON, FromJSON)
2 changes: 1 addition & 1 deletion src/Enecuum/Framework/Runtime.hs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import qualified Network.Socket as S
import qualified Enecuum.Domain as D
import Enecuum.Prelude
import qualified Enecuum.Core.Runtime as R
import Enecuum.Blockchain.Domain as D
import Enecuum.Samples.Blockchain.Domain as D

class AsNativeConnection a where
data family NativeConnection a
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE RecordWildCards #-}

module Enecuum.Assets.Blockchain.Generation where
module Enecuum.Samples.Assets.Blockchain.Generation where

import Data.HGraph.StringHashable (StringHash (..), toHash)
import Data.List (delete)
import Enecuum.Assets.Blockchain.Wallet
import Enecuum.Blockchain.Domain
import qualified Enecuum.Blockchain.Lens as Lens
import Enecuum.Samples.Assets.Blockchain.Wallet
import Enecuum.Samples.Blockchain.Domain
import qualified Enecuum.Samples.Blockchain.Lens as Lens
import qualified Enecuum.Domain as D
import qualified Enecuum.Language as L
import Enecuum.Prelude hiding (Ordering)
import Enecuum.Blockchain.Domain as D
import Enecuum.Samples.Blockchain.Domain as D

-- | Order for key blocks
data Ordering = InOrder | RandomOrder
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DuplicateRecordFields #-}
module Enecuum.Assets.Blockchain.Keys where
module Enecuum.Samples.Assets.Blockchain.Keys where

import qualified Data.Aeson as A
import Data.ByteString.Extra ()
import Enecuum.Assets.System.Directory (keysFilePath)
import Enecuum.Samples.Assets.System.Directory (keysFilePath)
import qualified Enecuum.Domain as D
import qualified Enecuum.Language as L
import Enecuum.Prelude
import qualified Enecuum.Blockchain.Domain as D
import qualified Enecuum.Samples.Blockchain.Domain as D

type Password = String
data PasswordSource = Manual Password deriving (Show, Eq, Generic, ToJSON, FromJSON)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{-# LANGUAGE DeriveAnyClass #-}
module Enecuum.Assets.Blockchain.Wallet where
module Enecuum.Samples.Assets.Blockchain.Wallet where

import qualified Enecuum.Blockchain.Domain as D
import qualified Enecuum.Samples.Blockchain.Domain as D
import Enecuum.Prelude

-- | Wallets and keys for demo purpose
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module Enecuum.Assets.ConfigParsing where
module Enecuum.Samples.Assets.ConfigParsing where

import Data.Yaml (ParseException, prettyPrintParseException)
import qualified Enecuum.Assets.TstScenarios as Tst
import qualified Enecuum.Samples.Assets.TstScenarios as Tst
import qualified Enecuum.Config as Cfg
import Enecuum.Prelude

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeInType #-}

module Enecuum.Assets.GenConfigs where
module Enecuum.Samples.Assets.GenConfigs where

import Data.Aeson.Encode.Pretty (encodePretty)
import qualified Data.ByteString.Lazy as B
import qualified Enecuum.Assets.TstScenarios as Tst
import qualified Enecuum.Samples.Assets.TstScenarios as Tst
import qualified Enecuum.Config as Cfg
import qualified Enecuum.Domain as D
import Enecuum.Prelude
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeInType #-}

module Enecuum.Assets.Initialization where
module Enecuum.Samples.Assets.Initialization where

import qualified Data.Map as M
import Enecuum.Assets.ConfigParsing (parseConfig)
import qualified Enecuum.Assets.Nodes.Address as A
import Enecuum.Assets.System.Directory (clientStory)
import qualified Enecuum.Assets.TstScenarios as Tst
import Enecuum.Samples.Assets.ConfigParsing (parseConfig)
import qualified Enecuum.Samples.Assets.Nodes.Address as A
import Enecuum.Samples.Assets.System.Directory (clientStory)
import qualified Enecuum.Samples.Assets.TstScenarios as Tst
import qualified Enecuum.Config as Cfg
import qualified Enecuum.Core.Lens as Lens
import qualified Enecuum.Domain as D
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE UndecidableInstances #-}

module Enecuum.Assets.Nodes.Address where
module Enecuum.Samples.Assets.Nodes.Address where

import Data.HGraph.StringHashable
import Enecuum.Domain (Address (..), NodeAddress (..), NodeId, NodePorts (..))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
{-# LANGUAGE TemplateHaskell #-}

-- | Lenses for node configs.
module Enecuum.Assets.Nodes.CLens where
module Enecuum.Samples.Assets.Nodes.CLens where

import Control.Lens (makeFieldsNoPrefix)
import Enecuum.Prelude

import Enecuum.Assets.Nodes.GraphService.Config
import Enecuum.Samples.Assets.Nodes.GraphService.Config
import Enecuum.Config
import qualified Enecuum.Domain as D

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DuplicateRecordFields #-}

module Enecuum.Assets.Nodes.Client
module Enecuum.Samples.Assets.Nodes.Client
( clientNode
, ClientNode(..)
, NodeConfig (..)
Expand All @@ -16,18 +16,18 @@ import qualified Data.Map as Map
import Data.Set (union, (\\))
import qualified Data.Set as Set
import Data.Text hiding (map)
import Enecuum.Assets.Blockchain.Keys
import qualified Enecuum.Assets.Blockchain.Wallet as A
import qualified Enecuum.Assets.Nodes.Address as A
import qualified Enecuum.Assets.Nodes.Messages as M
import Enecuum.Samples.Assets.Blockchain.Keys
import qualified Enecuum.Samples.Assets.Blockchain.Wallet as A
import qualified Enecuum.Samples.Assets.Nodes.Address as A
import qualified Enecuum.Samples.Assets.Nodes.Messages as M
import Enecuum.Config
import qualified Enecuum.Domain as D
import Enecuum.Framework.Domain.Error
import qualified Enecuum.Framework.Lens as Lens
import qualified Enecuum.Language as L
import Enecuum.Prelude hiding (map, unpack)
import qualified Enecuum.Blockchain.Language as L
import qualified Enecuum.Blockchain.Domain as D
import qualified Enecuum.Samples.Blockchain.Language as L
import qualified Enecuum.Samples.Blockchain.Domain as D

data ClientNode = ClientNode
deriving (Show, Generic)
Expand Down Expand Up @@ -90,7 +90,7 @@ data CLITransaction = CLITransaction

sendSuccessRequest :: forall a. (ToJSON a, Typeable a) => D.Address -> a -> L.NodeL Text
sendSuccessRequest address request = do
res :: Either Text M.SuccessMsg <- L.makeRpcRequest address request
res :: Either Text D.SuccessMsg <- L.makeRpcRequest address request
pure . eitherToText $ res

startForeverChainGenerationHandler :: StartForeverChainGeneration -> L.NodeL Text
Expand Down Expand Up @@ -141,17 +141,17 @@ transform tx = do
createTransaction :: CreateTransaction -> L.NodeL Text
createTransaction (CreateTransaction tx address) = do
transaction <- transform tx
res :: Either Text M.SuccessMsg <- L.makeRpcRequest address (M.CreateTransaction transaction)
res :: Either Text D.SuccessMsg <- L.makeRpcRequest address (M.CreateTransaction transaction)
pure . eitherToText $ res

dumpToDB :: DumpToDB -> L.NodeL Text
dumpToDB (DumpToDB address) = do
res :: Either Text M.SuccessMsg <- L.makeRpcRequest address M.DumpToDB
res :: Either Text D.SuccessMsg <- L.makeRpcRequest address M.DumpToDB
pure . eitherToText $ res

restoreFromDB :: RestoreFromDB -> L.NodeL Text
restoreFromDB (RestoreFromDB address) = do
res :: Either Text M.SuccessMsg <- L.makeRpcRequest address M.RestoreFromDB
res :: Either Text D.SuccessMsg <- L.makeRpcRequest address M.RestoreFromDB
pure . eitherToText $ res

getLengthOfChain :: GetLengthOfChain -> L.NodeL Text
Expand All @@ -163,20 +163,20 @@ getLengthOfChain (GetLengthOfChain address) = do

ping :: Ping -> L.NodeL Text
ping (Ping TCP address) = do
ok <- L.withConnection D.Tcp address $ \conn -> L.send conn M.Ping
ok <- L.withConnection D.Tcp address $ \conn -> L.send conn D.Ping
pure $ case ok of
Just (Right _) -> "Tcp port is available."
Just (Left _) -> "Tcp disconnection."
_ -> "Tcp port is not available."

ping (Ping RPC address) = do
res :: Either Text M.Pong <- L.makeRpcRequest address M.Ping
res :: Either Text D.Pong <- L.makeRpcRequest address D.Ping
pure $ case res of Right _ -> "Rpc port is available."; Left _ -> "Rpc port is not available."

ping (Ping UDP _) = pure "This functionality is not supported."

stopRequest :: StopRequest -> L.NodeL Text
stopRequest (StopRequest address) = sendSuccessRequest address M.Stop
stopRequest (StopRequest address) = sendSuccessRequest address D.Stop

getBlock :: GetBlock -> L.NodeL Text
getBlock (GetBlock hash address) = do
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
module Enecuum.Assets.Nodes.GraphService.Config where
module Enecuum.Samples.Assets.Nodes.GraphService.Config where

import qualified Data.Aeson as A
import Enecuum.Assets.Nodes.Address
import Enecuum.Samples.Assets.Nodes.Address
import Enecuum.Config
import qualified Enecuum.Domain as D
import Enecuum.Blockchain.Domain as D
import Enecuum.Samples.Blockchain.Domain as D
import Enecuum.Prelude

data GraphWindowConfig = GraphWindowConfig
Expand Down
Loading

0 comments on commit 7a7bbac

Please sign in to comment.