packages feed

os-release-0.2.0: tests/unit/OsReleaseSpec.hs

{-# LANGUAGE OverloadedStrings #-}
module OsReleaseSpec (spec) where

import           Test.Hspec
import           System.OsRelease
import           Data.Map.Lazy
import           Data.Monoid
import           OsReleaseSpec.Reals
import           System.IO.Temp
import           System.IO

spec :: Spec
spec = do
    describe "parseOs" $ do
        it "parses simple value"                   $ fooBar "foo=bar"
        it "parses simple value with trailing NL"  $ fooBar "foo=bar\n"
        it "parses single quoted value"            $ fooBar "foo='bar'"
        it "parses double quoted value"            $ fooBar "foo=\"bar\""

        it "parses _ var" $ parseCase "f_x=''" [("f_x", "")]

        it "parses quoted space" $ parseCase "f='a b'" [("f", "a b")]
        it "parses quoted -"     $ parseCase "f='a-b'" [("f", "a-b")]

        it "parses special \\" $ specialFooBar "foo='ba\\\\r'" "\\"
        it "parses special `"  $ specialFooBar "foo='ba\\`r'" "`"
        it "parses special '"  $ specialFooBar "foo='ba\\'r'" "'"
        it "parses special $"  $ specialFooBar "foo='ba\\$r'" "$"
        it "parses special \"" $ specialFooBar "foo=\"ba\\\"r\"" "\""

        it "parses multiple values" $ parseCase
            "foo=bar\nqux=quux"
            [("foo", "bar"), ("qux", "quux")]

        it "parses empty val noquotes" $ parseCase "foo=" [("foo", "")]
        it "parses empty val quote \"" $ parseCase "foo=\"\"" [("foo", "")]
        it "parses empty val quote '"  $ parseCase "foo=''" [("foo", "")]

        it "breaks on misquoting 1" $ errCase "foo=\"bar'"
        it "breaks on misquoting 2" $ errCase "foo='bar\""
        it "breaks on unquoted $"   $ errCase "foo='ba$r'"
        it "breaks on unquoted `"   $ errCase "foo='ba`r'"
        it "breaks on unquoted \""  $ errCase "foo=\"ba\"r\""
        it "breaks on unquoted '"   $ errCase "foo='ba'r'"
        it "breaks on unquoted \\"  $ errCase "foo='ba\\r'"
        it "breaks on unquoted val with space"  $ errCase "foo=ba r"
        it "breaks on unquoted val with ;"      $ errCase "foo=ba;r"
        it "breaks on unquoted val with \\"     $ errCase "foo=ba\\r"

        it "parses Gentoo os-release"           $ realCase Gentoo
        it "parses OpenSUSE Factory os-release" $ realCase OpenSUSEFactory
        it "parses Arch os-release"             $ realCase Arch

    describe "readOs'" $ do
        it "reads 1st" $ do
            withSystemTempFile "1st.txt" $ \f1 hf1 -> do
                withSystemTempFile "2nd.txt" $ \f2 hf2 -> do
                    hPutStr hf1 "1"
                    hPutStr hf2 "2"
                    mapM_ hClose [hf1, hf2]

                    xs <- readOs' [f1, f2]
                    case xs of
                        Right x -> x `shouldBe` "1"
                        Left e -> expectationFailure $ show e

        it "reads 2nd" $ do
            withSystemTempFile "a-file.txt" $ \f h -> do
                hPutStr h "1"
                hClose h

                xs <- readOs' ["/oh-well-let's-hope-no-one-makes-this-file", f]
                case xs of
                    Right x -> x `shouldBe` "1"
                    Left e -> expectationFailure $ show e

    where
        fooBar x = parseCase x [("foo", "bar")]

        specialFooBar :: String -> String -> Expectation
        specialFooBar x y = parseCase x [("foo", OsReleaseValue $ "ba" <> y <> "r")]

        realCase x = parseCase (input x) (output x)

        parseCase x y =
            case parseOs x of
                Left  e -> expectationFailure $ show e
                Right z -> z `shouldBe` (fromList y)

        errCase x =
            case parseOs x of
                Left  _ -> ("1"::String) `shouldBe` "1"
                Right z -> expectationFailure (show z)