packages feed

toxcore-0.2.11: test/Network/Tox/DHT/DhtPacketSpec.hs

{-# LANGUAGE Trustworthy #-}
module Network.Tox.DHT.DhtPacketSpec where

import           Test.Hspec
import           Test.QuickCheck

import           Data.Binary                   (Binary)
import qualified Data.Binary                   as Binary (get, put)
import qualified Data.Binary.Get               as Binary (runGet)
import qualified Data.Binary.Put               as Binary (runPut)
import           Data.Proxy                    (Proxy (..))
import           Network.Tox.Crypto.Key        (Nonce)
import           Network.Tox.Crypto.KeyPair    (KeyPair (..))
import           Network.Tox.DHT.DhtPacket     (DhtPacket (..))
import qualified Network.Tox.DHT.DhtPacket     as DhtPacket
import           Network.Tox.EncodingSpec
import           Network.Tox.NodeInfo.NodeInfo (NodeInfo)


encodeAndDecode :: (Binary a, Binary b) => KeyPair -> KeyPair -> Nonce -> a -> Maybe b
encodeAndDecode senderKeyPair receiverKeyPair nonce payload =
  let
    KeyPair _ receiverPublicKey = receiverKeyPair
    packet = DhtPacket.encode senderKeyPair receiverPublicKey nonce payload
    packet' = Binary.runGet Binary.get $ Binary.runPut $ Binary.put packet
  in
  DhtPacket.decode receiverKeyPair packet'


encodeAndDecodeString :: KeyPair -> KeyPair -> Nonce -> String -> Maybe String
encodeAndDecodeString = encodeAndDecode


encodeCharAndDecodeString :: KeyPair -> KeyPair -> Nonce -> Char -> Maybe String
encodeCharAndDecodeString = encodeAndDecode


encodeIntAndDecodeNodeInfo :: KeyPair -> KeyPair -> Nonce -> Int -> Maybe NodeInfo
encodeIntAndDecodeNodeInfo = encodeAndDecode


spec :: Spec
spec = do
  rpcSpec (Proxy :: Proxy DhtPacket)
  binarySpec (Proxy :: Proxy DhtPacket)
  readShowSpec (Proxy :: Proxy DhtPacket)

  it "encodes and decodes packets" $
    property $ \senderKeyPair receiverKeyPair nonce payload ->
      encodeAndDecodeString senderKeyPair receiverKeyPair nonce payload `shouldBe` Just payload

  it "fails to decode packets with the wrong secret key" $
    property $ \senderKeyPair (KeyPair _ receiverPublicKey) badSecretKey nonce payload ->
      encodeAndDecodeString senderKeyPair (KeyPair badSecretKey receiverPublicKey) nonce payload `shouldBe` Nothing

  it "fails to decode packets with the wrong payload type (Partial)" $
    property $ \senderKeyPair receiverKeyPair nonce payload ->
      encodeCharAndDecodeString senderKeyPair receiverKeyPair nonce payload `shouldBe` Nothing

  it "fails to decode packets with the wrong payload type (Fail)" $
    property $ \senderKeyPair receiverKeyPair nonce payload ->
      encodeIntAndDecodeNodeInfo senderKeyPair receiverKeyPair nonce payload `shouldBe` Nothing

  it "should decode empty CipherText correctly" $
    expectDecoded
      [ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      , 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      , 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
      ] $
      DhtPacket
        (read "\"0000000000000000000000000000000000000000000000000000000000000000\"")
        (read "\"000000000000000000000000000000000000000000000000\"")
        (read "\"00000000000000000000000000000000\"")