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