packages feed

cabal-cache-1.0.6.0: test/HaskellWorks/CabalCache/IntegrationSpec.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications  #-}

{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}

module HaskellWorks.CabalCache.IntegrationSpec
  ( spec
  ) where

import Control.Monad              (forM_)
import System.FilePath            ((</>))
import Test.Hspec                 (Spec, describe, it)

import qualified Data.List                    as L
import qualified Data.Time.Clock              as DT
import qualified Data.Time.Format             as DT
import qualified HaskellWorks.Hspec.Hedgehog  as H
import qualified Hedgehog                     as H
import qualified Hedgehog.Extras.Test.Base    as H
import qualified System.Directory             as IO
import qualified System.Environment           as IO
import qualified System.FilePath.Glob         as IO
import qualified Test.Base                    as H

{- HLINT ignore "Redundant do"        -}
{- HLINT ignore "Reduce duplication"  -}
{- HLINT ignore "Redundant bracket"   -}

spec :: Spec
spec = describe "HaskellWorks.CabalCache.IntegrationSpec" do
  it "local" $ H.require . H.withTests 1 $ H.integration $ H.runFinallies . H.workspace "local" $ \tempAbsBasePath' -> do
    cwd <- H.noteIO $ IO.getCurrentDirectory
    let archivePath = tempAbsBasePath' </> "archive"
    let storePath   = tempAbsBasePath' </> "store"
    let buildPath   = cwd </> "dist-newstyle"

    H.execCabalCache_
      [ "sync-to-archive"
      , "--archive-uri"
      , archivePath
      , "--build-path"
      , buildPath
      ]

    H.execCabalCache_
      [ "sync-from-archive"
      , "--archive-uri"
      , archivePath
      , "--store-path"
      , tempAbsBasePath' </> "store"
      , "--build-path"
      , buildPath
      ]

    archivedPackages <- H.noteShowIO $ IO.globDir1 (IO.compile "**/*.tar.gz") archivePath
    restoredPackages <- H.noteShowIO $ IO.globDir1 (IO.compile "**/cabal-hash.txt") storePath

    H.assert $ L.length archivedPackages > 20 -- At least some packages should have been archived
    H.assert $ L.length restoredPackages > 20 -- At least some packages should have been archived

  it "remote" $ H.require . H.withTests 1 $ H.integration $ H.runFinallies . H.workspace "local" $ \tempAbsBasePath' -> do
    cwd <- H.noteIO $ IO.getCurrentDirectory
    mBinaryCacheUri <- H.noteShowIO $ IO.lookupEnv "BINARY_CACHE_URI"

    forM_ mBinaryCacheUri \binaryCacheUri -> do
      now <- H.evalIO DT.getCurrentTime

      let formattedNow  = DT.formatTime DT.defaultTimeLocale "%Y-%m-%dT%H:%M:%S" now
      let storePath     = tempAbsBasePath' </> "store"
      let buildPath     = cwd </> "dist-newstyle"
      let archiveUri    = binaryCacheUri <> "/" <> "cabal-cache-test" <> "/" <> formattedNow

      H.execCabalCache_
        [ "sync-to-archive"
        , "--archive-uri"
        , archiveUri
        , "--build-path"
        , buildPath
        ]

      H.execCabalCache_
        [ "sync-from-archive"
        , "--archive-uri"
        , archiveUri
        , "--store-path"
        , tempAbsBasePath' </> "store"
        , "--build-path"
        , buildPath
        ]

      restoredPackages <- H.noteShowIO $ IO.globDir1 (IO.compile "**/cabal-hash.txt") storePath

      H.assert $ L.length restoredPackages > 20 -- At least some packages should have been archived