diff --git a/Hash2Pub/test/FediChordSpec.hs b/Hash2Pub/test/FediChordSpec.hs index dbe699c..596d82d 100644 --- a/Hash2Pub/test/FediChordSpec.hs +++ b/Hash2Pub/test/FediChordSpec.hs @@ -8,9 +8,12 @@ import Data.Maybe (fromJust) import qualified Data.Map.Strict as Map import qualified Data.ByteString as BS import qualified Data.Set as Set +import Data.ASN1.Parse (runParseASN1) +import Data.Time.Clock.POSIX import Hash2Pub.FediChord import Hash2Pub.DHTProtocol +import Hash2Pub.ASN1Coding spec :: Spec spec = do @@ -150,6 +153,82 @@ spec = do let (FORWARD nodeset) = incomingQuery exampleLocalNode nC 3 (toNodeID 11) Set.map (nid . cacheGetNodeStateUnvalidated ) nodeset `shouldBe` Set.fromList [nid4, nid2, nid3] + describe "Messages can be encoded to and decoded from ASN.1" $ do + -- define test messages + let + someNodeIDs = map fromInteger [3..12] + qidReqPayload = QueryIDRequestPayload { + queryTargetID = nid exampleNodeState + , queryLBestNodes = 3 + } + jReqPayload = JoinRequestPayload + lReqPayload = LeaveRequestPayload { + leaveSuccessors = someNodeIDs + , leavePredecessors = someNodeIDs + } + stabReqPayload = StabiliseRequestPayload + pingReqPayload = PingRequestPayload + qidResPayload1 = QueryIDResponsePayload { + queryResult = FOUND $ exampleNodeState + } + qidResPayload2 = QueryIDResponsePayload { + queryResult = FORWARD $ Set.fromList [ + NodeEntry False exampleNodeState (toEnum 23420001) + , NodeEntry True (exampleNodeState {nid = fromInteger (-5)}) (toEnum 0) + ] + } + jResPayload = JoinResponsePayload { + joinSuccessors = someNodeIDs + , joinPredecessors = someNodeIDs + , joinCache = [ + NodeEntry False exampleNodeState (toEnum 23420001) + , NodeEntry True (exampleNodeState {nid = fromInteger (-5)}) (toEnum 0) + ] + } + lResPayload = LeaveResponsePayload + stabResPayload = StabiliseResponsePayload { + stabiliseSuccessors = someNodeIDs + , stabilisePredecessors = [] + } + pingResPayload = PingResponsePayload { + pingNodeStates = [ + exampleNodeState + , exampleNodeState {nid = fromInteger (-5)} + ] + } + requestTemplate = Request { + requestID = 2342 + , sender = exampleNodeState + , parts = 1 + , part = 0 + , action = undefined + , payload = undefined + } + responseTemplate = Response { + responseTo = 2342 + , senderID = nid exampleNodeState + , parts = 1 + , part = 0 + , action = undefined + , payload = undefined + } + requestWith a pa = requestTemplate {action = a, payload = pa} + responseWith a pa = responseTemplate {action = a, payload = pa} + + encodeDecodeAndCheck msg = runParseASN1 parseMessage (encodeMessage msg) `shouldBe` pure msg + it "messages are encoded and decoded correctly from and to ASN1" $ do + encodeDecodeAndCheck $ requestWith QueryID qidReqPayload + encodeDecodeAndCheck $ requestWith Join jReqPayload + encodeDecodeAndCheck $ requestWith Leave lReqPayload + encodeDecodeAndCheck $ requestWith Stabilise stabReqPayload + encodeDecodeAndCheck $ requestWith Ping pingReqPayload + encodeDecodeAndCheck $ responseWith QueryID qidResPayload1 + encodeDecodeAndCheck $ responseWith QueryID qidResPayload2 + encodeDecodeAndCheck $ responseWith Join jResPayload + encodeDecodeAndCheck $ responseWith Leave lResPayload + encodeDecodeAndCheck $ responseWith Stabilise stabResPayload + encodeDecodeAndCheck $ responseWith Ping pingResPayload + -- some example data