{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Monad
import System.Environment
import Test.Framework
import Test.Framework.Providers.HUnit
import Test.HUnit hiding (Test)
import Network.BitcoinRPC
import Network.BitcoinRPC.EventsTest
import Network.BitcoinRPC.MarkerAddressesTest
includeMoneyTests = False
auth :: RPCAuth
auth = RPCAuth "http://127.0.0.1:8332" "rpcuser" "localaccessonly"
genesisBlockHash = BlockHash "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"
test1 :: Test
test1 = testCase "getblockcount" $ do
_ <- getBlockCountR Nothing auth
return ()
test2 :: Test
test2 = testCase "getblockhash" $ do
hash <- getBlockHashR Nothing auth 0
assertEqual "Hash of genesis block is not returned correctly."
genesisBlockHash hash
return ()
test3 :: Test
test3 = testCase "gettransaction" $ do
r <- getTransactionR Nothing auth (TransactionID "invalidtransactionid")
case r of
Just _ -> assertFailure "invalid transaction id was not rejected"
Nothing -> return ()
test4 :: Test
test4 = testCase "getorigins" $ do
r <- getOriginsR Nothing auth (TransactionID "invalidtransactionid")
case r of
Just _ -> assertFailure "invalid transaction id was not rejected"
Nothing -> return ()
test5 :: Test
test5 = testCase "getnewaddress" $ do
_ <- getNewAddressR Nothing auth
return ()
test6 :: Test
test6 = testCase "getbalance" $ do
b1 <- getBalanceR Nothing auth 0 True
b2 <- getBalanceR Nothing auth 6 True
when (b1 < b2) $
assertFailure "getbalance reports less unconfirmed funds\
\ than confirmed ones (?)"
test7 :: Test
test7 = testCase "validateaddress" $ do
c1 <- validateAddressR Nothing auth (BitcoinAddress "invalidaddress")
when (baiIsValid c1) $
assertFailure "invalid address is not rejected"
c2 <-validateAddressR Nothing auth
(BitcoinAddress "14Z1mazY4HfysZyMaKudFr63EwHqQT2njz")
unless (baiIsValid c2) $
assertFailure "valid address is rejected"
myAddr <- getNewAddressR Nothing auth
c3 <- validateAddressR Nothing auth myAddr
unless (baiIsMine c3) $
assertFailure "newly created address is not recognized as own"
test8 :: Test
test8 = testCase "sendtoaddress (1)" $ do
let nullAmount = BitcoinAmount 0
largeAmount = BitcoinAmount $ 21000000 * 10 ^ (6::Integer)
s1 <- sendToAddress auth (BitcoinAddress "invalidaddress") largeAmount
case s1 of
Right (Left InvalidAddress) -> return ()
_ -> assertFailure "invalid address is not rejected"
myAddr <- getNewAddressR Nothing auth
s2 <- sendToAddress auth myAddr nullAmount
case s2 of
Right (Left InvalidAmount) -> return ()
_ -> assertFailure "amount of zero is not rejected"
s3 <- sendToAddress auth myAddr largeAmount
case s3 of
Right (Left InsufficientFunds) -> return ()
_ -> assertFailure "insufficient funds are not detected"
test9 :: Test
test9 = testCase "listsinceblock (1)" $ do
_ <- listSinceBlockR Nothing auth Nothing
return ()
test10 :: Test
test10 = testCase "getrawtransaction" $ do
r <- getRawTransactionR Nothing auth (TransactionID "deadc0de")
case r of
Just _ -> assertFailure "invalid transaction id was not rejected"
Nothing -> return ()
test11 :: Test
test11 = testCase "getbalance, filtered green coins" $ do
b1 <- getBalanceR Nothing auth 0 False
b2 <- getBalanceR Nothing auth 0 True
when (b1 < b2) $
assertFailure "the balance without green coins is\
\ less than the total balance (?)"
testA :: Test
testA = testCase "sendtoaddress (2)" $ do
let smallAmount = BitcoinAmount 10000
fee = BitcoinAmount 10000
b <- getBalanceR Nothing auth 1 True
myAddr <- getNewAddressR Nothing auth
when (b >= smallAmount + fee) $ do
s <- sendToAddress auth myAddr smallAmount
case s of
Right (Right _) -> return ()
_ -> assertFailure "sendtoaddress failed, even though\
\ sufficient funds should be available"
main :: IO ()
main = do
tests <- if includeMoneyTests
then return $ freeTests ++ moneyTests
else putStrLn "Omitting some tests - set includeMoneyTests\
\ in TestSuite.hs for full test suite."
>> return freeTests
defaultMain tests
freeTests :: [Test]
freeTests = [ test1
, test2
, test3
, test4
, test5
, test6
, test7
, test8
, test9
, test10
, test11
] ++
eventsTests
++ markerAdressesTests
moneyTests = [ testA ]