import Test.Hspec import Control.Monad.Extra import Data.Version.Extra --import Distribution.RPM.Build.Graph import Distribution.RPM.Build.Order import SimpleCmd import System.Directory (withCurrentDirectory) import System.Posix.Files main :: IO () main = do setupSymlinks -- rpmspec < 4.15.1 does not support "--with" rpmver <- readVersion . last . words <$> cmd "rpmspec" ["--version"] hspec (spec rpmver) pkg :: FilePath -> FilePath pkg = ("test/pkgs/" ++) -- FIXME refactor to test both subdir and withCurrentDirectory spec :: Version -> Spec spec rpmver = do describe "sort" $ do it "A B" $ both dependencySort [pkg "A", pkg "B"] >>= (`shouldBe` [pkg "B", pkg "A"]) it "1 2" $ both dependencySort [pkg "1", pkg "2"] >>= (`shouldBe` [pkg "2", pkg "1"]) it "A/ B/" $ both dependencySort [pkg "A/", pkg "B/"] >>= (`shouldBe` [pkg "B/", pkg "A/"]) it "1/ 2/" $ both dependencySort [pkg "1/", pkg "2/"] >>= (`shouldBe` [pkg "2/", pkg "1/"]) it "A.spec B.spec" $ both dependencySort [pkg "A/A.spec", pkg "B/B.spec"] >>= (`shouldBe` [pkg "B/B.spec", pkg "A/A.spec"]) it "1.spec 2.spec" $ both dependencySort [pkg "1/A.spec", pkg "2/B.spec"] >>= (`shouldBe` [pkg "2/B.spec", pkg "1/A.spec"]) it "A/ B.spec" $ both dependencySort [pkg "A/", pkg "B/B.spec"] >>= (`shouldBe` [pkg "B/B.spec", pkg "A/"]) it "circular A B C" $ both dependencySort [pkg "A", pkg "B", pkg "C"] `shouldThrow` anyException it "A B D1.0" $ dependencySort [pkg "A", pkg "B/", pkg "D1.0"] >>= (`shouldBe` [pkg "B/", pkg "D1.0", pkg "A"]) it "A D" $ indy dependencySort [pkg "A", pkg "D1.0"] >>= (`shouldBe` [pkg "A", pkg "D1.0"]) it "C D" $ indy dependencySort [pkg "C", pkg "D1.0"] >>= (`shouldBe` [pkg "C", pkg "D1.0"]) it "pkgconf" $ both dependencySort [pkg "pkgconf/C", pkg "pkgconf/A"] >>= (`shouldBe` [pkg "pkgconf/C", pkg "pkgconf/A"]) it "cmake" $ both dependencySort [pkg "cmake/A", pkg "cmake/B"] >>= (`shouldBe` [pkg "cmake/B", pkg "cmake/A"]) when (rpmver > makeVersion [4,15,0]) $ it "dynbr A B" $ both dependencySort [pkg "dynbr/A", pkg "B"] >>= (`shouldBe` [pkg "B", pkg "dynbr/A"]) when (rpmver > makeVersion [4,15,1]) $ it "circular A B C boot" $ both (dependencySortRpmOpts ["--with=boot"]) [pkg "A", pkg "B", pkg "C"] >>= (`shouldBe` [pkg "C", pkg "B", pkg "A"]) describe "layers" $ it "A B" $ dependencyLayers [pkg "A", pkg "B"] >>= (`shouldBe` [[pkg "B"], [pkg "A"]]) describe "leaves" $ it "A B D" $ leafPackages [pkg "A", pkg "B", pkg "D1.0"] >>= (`shouldBe` [pkg "A", pkg "D1.0"]) let rpmbuildOrder f c = fmap f . cmd "rpmbuild-order" . (c:) describe "rpmbuild-order" $ do it "sort A B" $ both (rpmbuildOrder words "sort") [pkg "A", pkg "B"] >>= (`shouldBe` [pkg "B", pkg "A"]) it "sort A D" $ indy (rpmbuildOrder lines "sort") [pkg "A", pkg "D1.0"] >>= (`shouldBe` [pkg "D1.0", "", pkg "A"]) it "sort pkgconf" $ both (rpmbuildOrder words "sort") [pkg "pkgconf/A", pkg "pkgconf/C"] >>= (`shouldBe` [pkg "pkgconf/C", pkg "pkgconf/A"]) it "sort cmake" $ both (rpmbuildOrder words "sort") [pkg "cmake/A", pkg "cmake/B"] >>= (`shouldBe` [pkg "cmake/B", pkg "cmake/A"]) it "deps A" $ withCurrentDirectory "test/pkgs" $ cmd "rpmbuild-order" ["deps", "-x", "dynbr", "-x", "pkgconf", "-x", "1", "-x", "2", "-x", "C","-x", "cmake", "A"] >>= (`shouldBe` unwords ["B", "A"]) where both :: ([FilePath] -> IO [FilePath]) -> [FilePath] -> IO [FilePath] both io fs = do r <- io fs r' <- io $ reverse fs r `shouldBe` r' return r indy :: ([FilePath] -> IO [FilePath]) -> [FilePath] -> IO [FilePath] indy io fs = do r <- io fs r' <- io $ reverse fs r `shouldBe` reverse r' return r' setupSymlinks :: IO () setupSymlinks = forM_ [("1","A"),("2","B")] $ \ (l,f) -> unlessM (fileExist $ pkg l) $ createSymbolicLink f (pkg l)