packages feed

ethereum-client-haskell-0.0.1: test/Main.hs

module Main where

import Control.Monad
import Control.Monad.IO.Class
import Control.Monad.Trans.Resource
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as BC
import Data.Default
import Data.Functor
import Data.List
import Data.Monoid
import qualified Data.Set as S
import System.Exit
import Test.Framework
import Test.Framework.Providers.HUnit
import Test.HUnit

import qualified Data.NibbleString as N

import Data.Address
import Format
import DB.ModifyStateDB
import Database.MerklePatricia
import Data.RLP
import SHA
import Util

putKeyVals::MPDB->[(N.NibbleString, B.ByteString)]->ResourceT IO MPDB
putKeyVals db [(k,v)] = putKeyVal db k (rlpEncode v)
putKeyVals db ((k, v):rest) = do
  db'<- putKeyVal db k $ rlpEncode v
  putKeyVals db' rest

verifyDBDataIntegrity::MPDB->[(N.NibbleString, B.ByteString)]->ResourceT IO ()
verifyDBDataIntegrity db valuesIn = do
    db2 <- initializeBlankStateDB db
    db3 <- putKeyVals db2 valuesIn
    --return (db, stateRoot2)
    valuesOut <- getKeyVals db3 (N.EvenNibbleString B.empty)
    liftIO $ assertEqual "empty db didn't match" (S.fromList $ fmap rlpEncode <$> valuesIn) (S.fromList valuesOut)
    return ()

testShortcutNodeDataInsert::Assertion
testShortcutNodeDataInsert = do
  runResourceT $ do
    db <- openDBs False
    verifyDBDataIntegrity db
        [
          (N.EvenNibbleString $ BC.pack "abcd", BC.pack "abcd"),
          (N.EvenNibbleString $ BC.pack "aefg", BC.pack "aefg")
        ]

testFullNodeDataInsert::Assertion
testFullNodeDataInsert = do
  runResourceT $ do
    db <- openDBs False
    verifyDBDataIntegrity db
        [
          (N.EvenNibbleString $ BC.pack "abcd", BC.pack "abcd"),
          (N.EvenNibbleString $ BC.pack "bb", BC.pack "bb"),
          (N.EvenNibbleString $ BC.pack "aefg", BC.pack "aefg")
        ]

main::IO ()
main = 
  defaultMainWithOpts 
  [
   testCase "ShortcutNodeData Insert" testShortcutNodeDataInsert,
   testCase "FullNodeData Insert" testFullNodeDataInsert
  ] mempty