packages feed

second-transfer-0.10.0.2: tests/tests-hs-src/Tests/HTTP1Parse.hs

{-# LANGUAGE OverloadedStrings #-}
module Tests.HTTP1Parse where

import           Control.Lens
import           Control.Concurrent                  hiding (yield)

--import qualified Data.ByteString                     as B
import qualified Data.ByteString.Lazy                as LB
import qualified Data.ByteString.Builder             as Bu
--import           Data.Maybe                          (isJust)
import           Data.Conduit
import qualified Data.Conduit.List                   as DCL

import           Test.HUnit

import           SecondTransfer.IOCallbacks.Types
import           SecondTransfer.IOCallbacks.Coupling

import           SecondTransfer                      (Headers)
import           SecondTransfer.Http1.Parse
import           SecondTransfer.Http1.Types
import           SecondTransfer.Http1.Proxy
import qualified SecondTransfer.Utils.HTTPHeaders    as He


testParse :: Test
testParse = TestCase $ do
    let
        headers_text                       = "GET /helo.html HTTP/1.1\r\nHost: www.auther.com \r\n\r\n"
        headers_text2                      = "POST /helo.html HTTP/1.1\r\nHost: www.auther.com \r\nContent-Length: 1\r\n\r\np"
        a0                                 = newIncrementalHttp1Parser
        isDone (OnlyHeaders_H1PC _ _)      = True
        isDone _                           = False
        a1                                 = addBytes a0 headers_text
        (OnlyHeaders_H1PC h0 leftovers)    = a1
        (HeadersAndBody_H1PC h1 cond0 l2)  = addBytes a0 headers_text2
        --waitForBodyOk (HeadersAndBody_H1PC _ _ _)   = True
        --waitForBodyOk _ = False
    assertBool "testParse.IsDone" (isDone a1)
    assertEqual "testParse.NoLeftovers" leftovers ""
    assertEqual "testParse.YesLeftovers" l2 "p"
    assertEqual "testParse.FinishWellSeen" (UseBodyLength_BSC 1) cond0


testGenerate :: Test
testGenerate = TestCase $ do
    let
        headers_list :: Headers
        headers_list = [
            (":status", "200"),
            ("host", "www.example.com"),
            ("etag", "afrh")
            ]
        fragments = ["hello world"]
        serialized = serializeHTTPResponse headers_list fragments
    assertEqual "testGenerate.1"
        "HTTP/1.1 200 OK\r\ncontent-length: 11\r\nhost: www.example.com\r\netag: afrh\r\n\r\nhello world"
        serialized


testCombineAuthorityAndHost :: Test
testCombineAuthorityAndHost = TestCase $ do
    let
        headers_list :: Headers
        headers_list = [
            (":status", "200"),
            ("host", "www.example.com"),
            (":authority", "www.exampl.com"),
            ("etag", "afrh")
            ]
        he1 = He.fromList headers_list
        he2 = He.combineAuthorityAndHost he1
        h2 = He.toList he2
        fragments = ["hello world"]
        serialized = serializeHTTPResponse h2 fragments
    assertEqual "testGenerate.1"
        "HTTP/1.1 200 OK\r\n:authority: www.exampl.com\r\n:status: 200\r\ncontent-length: 11\r\netag: afrh\r\n\r\nhello world"
        serialized


testCombineAuthorityAndHost2 :: Test
testCombineAuthorityAndHost2 = TestCase $ do
    let
        headers_list :: Headers
        headers_list = [
            (":status", "200"),
            ("host", "www.example.com"),
            ("etag", "afrh")
            ]
        he1 = He.fromList headers_list
        he2 = He.combineAuthorityAndHost he1
        h2 = He.toList he2
        fragments = ["hello world"]
        serialized = serializeHTTPResponse h2 fragments
    assertEqual "testGenerate.1"
        "HTTP/1.1 200 OK\r\ncontent-length: 11\r\nhost: www.example.com\r\netag: afrh\r\n\r\nhello world"
        serialized


testHeadersToRequest :: Test
testHeadersToRequest = TestCase $ do
    let
        headers_list :: Headers
        headers_list = [
            (":status", "200"),
            ("host", "www.example.com"),
            ("etag", "afrh")
            ]
        serialized = LB.toStrict . Bu.toLazyByteString $ headerListToHTTP1RequestText headers_list
    assertEqual "testGenerate.1"
        "GET * HTTP/1.1\r\nhost:www.example.com\r\netag:afrh\r\n"
        serialized


testHeadersToRequest2 :: Test
testHeadersToRequest2 = TestCase $ do
    let
        headers_list :: Headers
        headers_list = [
            (":status", "200"),
            (":authority", "www.example.com"),
            (":path", "/important"),
            (":method", "HEAD"),
            ("etag", "afrh")
            ]
        serialized = LB.toStrict . Bu.toLazyByteString $ headerListToHTTP1RequestText headers_list
    assertEqual "testGenerate.1"
        "HEAD /important HTTP/1.1\r\nhost:www.example.com\r\netag:afrh\r\n"
        serialized


testCycle :: Test
testCycle = TestCase $ do
    let
        headers_list :: Headers
        headers_list = [
            (":authority", "www.example.com"),
            (":path", "/interesting"),
            (":method", "POST"),
            ("etag", "afrh")
            ]
        rqsource = yield "Hello world"
        request = HttpRequest {
            _headers_Rq = headers_list
          , _body_Rq = rqsource
            }
    (ioap, iobp) <- popIOCallbacksIntoExistance
    ioa <- handshake ioap
    iob <- handshake iobp

    let
        controller =  ioa

    finished <- newEmptyMVar
    _ <- forkIO $ do
        request_text <- (iob ^. pullAction_IOC) 74
        --putStrLn . show $ request_text
        assertEqual "test.Request" "POST /interesting HTTP/1.1\r\nhost:www.example.com\r\netag:afrh\r\n\r\nHello world" request_text
        (iob ^. pushAction_IOC)  "HTTP/1.1 200 OK\r\ncontent-length: 11\r\nhost: www.example.com\r\netag: afrh\r\n\r\nhello world"
        putMVar finished ()

    (response, _) <- ioProxyToConnection controller request
    assertEqual "test.Response" (response ^. headers_Rp ) [(":status","200"),("content-length","11"),("host","www.example.com"),("etag","afrh")]
    contents <- (response ^. body_Rp) $$ DCL.consume
    assertEqual "test.rp1Txt" "hello world" (mconcat contents)