{-# LANGUAGE OverloadedStrings #-} module Main where import Test.Tasty import Test.Tasty.HUnit import Test.Tasty.QuickCheck as QC import Data.Attoparsec.ByteString as Atto import Data.ByteString (ByteString) import qualified Data.ByteString.Char8 as B import Data.Either import Data.Word (Word16, Word32) import Data.Hadoop.Types (FileType(..)) import Chmod ------------------------------------------------------------ main = defaultMain tests ------------------------------------------------------------ tests :: TestTree tests = testGroup "Tests" [unitTests] unitTests = testGroup "Unit tests" [ testChmod "755" [SetOctal 493] , testChmod "0755" [SetOctal 493] , testChmod "u=r" [SetEqual Chmod_u [Chmod_r]] , testChmodShouldFail "kittens" , testApplyChmod File [SetEqual Chmod_o [Chmod_r]] (oct 0 0 0) (oct 0 0 4) , testApplyChmod File [SetEqual Chmod_o [Chmod_r, Chmod_w]] (oct 0 0 0) (oct 0 0 6) , testApplyChmod File [SetEqual Chmod_g [Chmod_r]] (oct 0 0 0) (oct 0 4 0) , testApplyChmod File [SetPlus Chmod_o [Chmod_w]] (oct 0 0 4) (oct 0 0 6) , testApplyChmod File [SetPlus Chmod_o [Chmod_w,Chmod_r]] (oct 0 0 1) (oct 0 0 7) , testApplyChmod File [SetMinus Chmod_o [Chmod_w]] (oct 0 0 6) (oct 0 0 4) , testApplyChmod File [SetMinus Chmod_o [Chmod_w,Chmod_r]] (oct 0 0 7) (oct 0 0 1) , testApplyChmod File [SetEqualWho Chmod_g Chmod_o] (oct 0 0 1) (oct 0 1 1) , testApplyChmod File [SetPlusWho Chmod_g Chmod_o] (oct 0 2 1) (oct 0 3 1) , testApplyChmod File [SetMinusWho Chmod_g Chmod_o] (oct 0 3 1) (oct 0 2 1) , testApplyChmod File [SetMinusWho Chmod_g Chmod_o] (oct 0 3 1) (oct 0 2 1) , testApplyChmod File [SetEqual Chmod_a [Chmod_r]] (oct 0 0 0) (oct 4 4 4) , testApplyChmod File [SetPlus Chmod_a [Chmod_r]] (oct 0 1 0) (oct 4 5 4) , testApplyChmod File [SetMinus Chmod_a [Chmod_x]] (oct 7 5 5) (oct 6 4 4) , testApplyChmod File [SetEqualWho Chmod_a Chmod_u] (oct 6 4 4) (oct 6 6 6) , testApplyChmod File [SetPlusWho Chmod_a Chmod_u] (oct 7 5 5) (oct 7 7 7) , testApplyChmod File [SetMinusWho Chmod_a Chmod_o] (oct 7 5 5) (oct 2 0 0) , testApplyChmod File [SetPlus Chmod_o [Chmod_X]] (oct 0 1 0) (oct 0 1 1) , testApplyChmod Dir [SetPlus Chmod_o [Chmod_X]] (oct 0 0 0) (oct 0 0 1) , testApplyChmod Dir [SetPlus Chmod_o [Chmod_X]] (oct 0 1 0) (oct 0 1 1) ] oct u g o = u*64 + g*8 + o testChmod :: ByteString -> [Chmod] -> TestTree testChmod input expected = testCase (unwords ["Parse chmod", B.unpack input]) $ parseOnly parseChmod input @?= Right expected testChmodShouldFail :: ByteString -> TestTree testChmodShouldFail input = testCase (unwords ["Parse chmod", B.unpack input]) $ assertBool "Failed to catch invalid chmod" (isLeft $ parseOnly parseChmod input) testApplyChmod :: FileType -> [Chmod] -> Word16 -> Word16 -> TestTree testApplyChmod filetype input old expected = testCase (unwords ["Apply chmod", show input, "to", show old]) $ applyChmod filetype input old @?= expected