on iko/ghcjs-patch-master help sign in
Add some test cases for the component builder
commita384c9a8a5023459ae5041feba94a894ed4e9c1c authorRodney Lorrimar <rodney.lorrimar@iohk.io> dateThu 20 Dec 2018, 11:59 (8 years ago) parent9a5101e
15 files changed+327
test/README.md+6 test/cabal-22/Main.hs+6 test/cabal-22/Setup.hs+2 test/cabal-22/default.nix+50 test/cabal-22/lib/Lib.hs+4 test/cabal-22/plan.nix+19 test/cabal-22/project.cabal+31 test/cabal-22/project.nix+41 test/cabal-simple/Main.hs+4 test/cabal-simple/Setup.hs+2 test/cabal-simple/cabal-simple.cabal+31 test/cabal-simple/cabal-simple.nix+38 test/cabal-simple/default.nix+49 test/cabal-simple/plan.nix+19 test/default.nix+25
test/README.mdnew file+6
@@ -0,0 +1,6 @@
1+### Haskell infrastructure test cases
2+
3+To execute the test cases, build from this directory:
4+
5+ nix-build --no-out-link default.nix
6+
test/cabal-22/Main.hsnew file+6
@@ -0,0 +1,6 @@
1+module Main where
2+
3+import Lib (message)
4+
5+main :: IO ()
6+main = putStrLn message
test/cabal-22/Setup.hsnew file+2
@@ -0,0 +1,2 @@
1+import Distribution.Simple
2+main = defaultMain
test/cabal-22/default.nixnew file+50
@@ -0,0 +1,50 @@
1+{ pkgs
2+, haskell
3+, stdenv
4+}:
5+
6+with stdenv.lib;
7+
8+let
9+ pkgSet = haskell.mkNewPkgSet {
10+ inherit pkgs;
11+ pkg-def = import ./plan.nix;
12+ pkg-def-overlays = [
13+ { project = ./project.nix; }
14+ ];
15+ modules = [ ];
16+ };
17+
18+ packages = pkgSet.config.hsPkgs;
19+
20+in
21+ stdenv.mkDerivation {
22+ name = "cabal-22-test";
23+
24+ buildCommand = ''
25+ exe="${packages.project.components.exes.project}/bin/project"
26+
27+ size=$(command stat --format '%s' "$exe")
28+ printf "size of executable $exe is $size. \n" >& 2
29+
30+ # fixme: run on target platform when cross-compiled
31+ printf "checking whether executable runs... " >& 2
32+ "$exe"
33+
34+ # fixme: linux-specific
35+ printf "checking that executable is dynamically linked to system libraries... " >& 2
36+ ldd "$exe" | grep libpthread
37+
38+ # fixme: posix-specific
39+ printf "checking that dynamic library is produced... " >& 2
40+ sofile=$(find "${packages.project.components.library}" | grep -e '\.so$')
41+ echo "$sofile"
42+
43+ printf "checking that dynamic library is dynamically linked to base... " >& 2
44+ ldd "$sofile" | grep libHSbase
45+
46+ touch $out
47+ '';
48+
49+ meta.platforms = platforms.all;
50+} // { inherit (packages) project; }
test/cabal-22/lib/Lib.hsnew file+4
@@ -0,0 +1,4 @@
1+module Lib (message) where
2+
3+message :: String
4+message = "Hello, Haskell!"
test/cabal-22/plan.nixnew file+19
@@ -0,0 +1,19 @@
1+hackage:
2+ {
3+ packages = {
4+ "ghc-prim".revision = hackage."ghc-prim"."0.5.2.0".revisions.default;
5+ "rts".revision = hackage."rts"."1.0".revisions.default;
6+ "base".revision = hackage."base"."4.11.1.0".revisions.default;
7+ "integer-gmp".revision = hackage."integer-gmp"."1.0.2.0".revisions.default;
8+ };
9+ compiler = {
10+ version = "8.4.4";
11+ nix-name = "ghc844";
12+ packages = {
13+ "ghc-prim" = "0.5.2.0";
14+ "rts" = "1.0";
15+ "base" = "4.11.1.0";
16+ "integer-gmp" = "1.0.2.0";
17+ };
18+ };
19+ }
test/cabal-22/project.cabalnew file+31
@@ -0,0 +1,31 @@
1+cabal-version: 2.2
2+-- Initial package description 'project.cabal' generated by 'cabal init'.
3+-- For further documentation, see http://haskell.org/cabal/users-guide/
4+
5+name: project
6+version: 0.1.0.0
7+-- synopsis:
8+-- description:
9+-- bug-reports:
10+license: NONE
11+author: Rodney Lorrimar
12+maintainer: rodney.lorrimar@iohk.io
13+-- copyright:
14+-- category:
15+
16+library
17+ exposed-modules: Lib
18+ -- other-modules:
19+ -- other-extensions:
20+ build-depends: base ^>=4.11.1.0
21+ hs-source-dirs: lib
22+ default-language: Haskell2010
23+
24+executable project
25+ main-is: Main.hs
26+ -- other-modules:
27+ -- other-extensions:
28+ build-depends: base ^>=4.11.1.0
29+ , project
30+ -- hs-source-dirs:
31+ default-language: Haskell2010
test/cabal-22/project.nixnew file+41
@@ -0,0 +1,41 @@
1+{ system
2+, compiler
3+, flags
4+, pkgs
5+, hsPkgs
6+, pkgconfPkgs
7+, ... }:
8+ {
9+ flags = {};
10+ package = {
11+ specVersion = "2.2";
12+ identifier = {
13+ name = "project";
14+ version = "0.1.0.0";
15+ };
16+ license = "NONE";
17+ copyright = "";
18+ maintainer = "rodney.lorrimar@iohk.io";
19+ author = "Rodney Lorrimar";
20+ homepage = "";
21+ url = "";
22+ synopsis = "";
23+ description = "";
24+ buildType = "Simple";
25+ };
26+ components = {
27+ "library" = {
28+ depends = [ (hsPkgs.base) ];
29+ };
30+ exes = {
31+ "project" = {
32+ depends = [
33+ (hsPkgs.base)
34+ (hsPkgs.project)
35+ ];
36+ };
37+ };
38+ };
39+ } // rec {
40+ src = pkgs.lib.mkDefault ./.;
41+ }
test/cabal-simple/Main.hsnew file+4
@@ -0,0 +1,4 @@
1+module Main where
2+
3+main :: IO ()
4+main = putStrLn "Hello, Haskell!"
test/cabal-simple/Setup.hsnew file+2
@@ -0,0 +1,2 @@
1+import Distribution.Simple
2+main = defaultMain
test/cabal-simple/cabal-simple.cabalnew file+31
@@ -0,0 +1,31 @@
1+cabal-version: >=1.10
2+-- Initial package description 'cabal-simple.cabal' generated by 'cabal
3+-- init'. For further documentation, see
4+-- http://haskell.org/cabal/users-guide/
5+
6+name: cabal-simple
7+version: 0.1.0.0
8+-- synopsis:
9+-- description:
10+-- bug-reports:
11+license: PublicDomain
12+author: Rodney Lorrimar
13+maintainer: rodney.lorrimar@iohk.io
14+-- category:
15+build-type: Simple
16+
17+library
18+ -- exposed-modules:
19+ -- other-modules:
20+ -- other-extensions:
21+ build-depends: base >=4.11 && <4.12
22+ -- hs-source-dirs:
23+ default-language: Haskell2010
24+
25+executable cabal-simple
26+ main-is: Main.hs
27+ -- other-modules:
28+ -- other-extensions:
29+ build-depends: base >=4.11 && <4.12
30+ -- hs-source-dirs:
31+ default-language: Haskell2010
test/cabal-simple/cabal-simple.nixnew file+38
@@ -0,0 +1,38 @@
1+{ system
2+, compiler
3+, flags
4+, pkgs
5+, hsPkgs
6+, pkgconfPkgs
7+, ... }:
8+ {
9+ flags = {};
10+ package = {
11+ specVersion = "1.10";
12+ identifier = {
13+ name = "cabal-simple";
14+ version = "0.1.0.0";
15+ };
16+ license = "LicenseRef-PublicDomain";
17+ copyright = "";
18+ maintainer = "rodney.lorrimar@iohk.io";
19+ author = "Rodney Lorrimar";
20+ homepage = "";
21+ url = "";
22+ synopsis = "";
23+ description = "";
24+ buildType = "Simple";
25+ };
26+ components = {
27+ "library" = {
28+ depends = [ (hsPkgs.base) ];
29+ };
30+ exes = {
31+ "cabal-simple" = {
32+ depends = [ (hsPkgs.base) ];
33+ };
34+ };
35+ };
36+ } // rec {
37+ src = pkgs.lib.mkDefault ./.;
38+ }
test/cabal-simple/default.nixnew file+49
@@ -0,0 +1,49 @@
1+# Test a package set
2+{ pkgs
3+, haskell
4+, stdenv
5+}:
6+
7+with stdenv.lib;
8+
9+let
10+ pkgSet = haskell.mkNewPkgSet {
11+ inherit pkgs;
12+ pkg-def = import ./plan.nix;
13+ pkg-def-overlays = [
14+ { cabal-simple = ./cabal-simple.nix;
15+ }
16+ ];
17+ modules = [ ];
18+ };
19+
20+ packages = pkgSet.config.hsPkgs;
21+
22+in
23+ stdenv.mkDerivation {
24+ name = "cabal-simple-test";
25+
26+ buildCommand = ''
27+ exe="${packages.cabal-simple.components.exes.cabal-simple}/bin/cabal-simple"
28+
29+ size=$(command stat --format '%s' "$exe")
30+ printf "size of executable $exe is $size. \n" >& 2
31+
32+ # fixme: run on target platform when cross-compiled
33+ printf "checking whether executable runs... " >& 2
34+ $exe
35+
36+ # fixme: linux-specific
37+ printf "checking that executable is dynamically linked to system libraries... " >& 2
38+ ldd $exe | grep libpthread
39+
40+ touch $out
41+ '';
42+
43+ meta.platforms = platforms.all;
44+} // { inherit (packages) cabal-simple; }
45+
46+## steps to generate local files
47+# 1. cabal-to-nix cabal-simple.cabal > cabal-simple.nix
48+# 2. cabal new-build
49+# 3. plan-to-nix ./dist-newstyle/cache/plan.json > plan.nix
test/cabal-simple/plan.nixnew file+19
@@ -0,0 +1,19 @@
1+hackage:
2+ {
3+ packages = {
4+ "ghc-prim".revision = hackage."ghc-prim"."0.5.2.0".revisions.default;
5+ "rts".revision = hackage."rts"."1.0".revisions.default;
6+ "base".revision = hackage."base"."4.11.1.0".revisions.default;
7+ "integer-gmp".revision = hackage."integer-gmp"."1.0.2.0".revisions.default;
8+ };
9+ compiler = {
10+ version = "8.4.4";
11+ nix-name = "ghc844";
12+ packages = {
13+ "ghc-prim" = "0.5.2.0";
14+ "rts" = "1.0";
15+ "base" = "4.11.1.0";
16+ "integer-gmp" = "1.0.2.0";
17+ };
18+ };
19+ }
test/default.nixnew file+25
@@ -0,0 +1,25 @@
1+{ pkgs ? import <nixpkgs> { } }:
2+
3+with pkgs;
4+
5+let
6+ # all packages from hackage as nix expressions
7+ hackage = import (fetchFromGitHub { owner = "angerman";
8+ repo = "hackage.nix";
9+ rev = "66c28064da46525711722b75b4adb2ac878897d3";
10+ sha256 = "12ffzzjgirwzha3ngxbniccgn19406iryxspq19kgi4kz9lz6bpr";
11+ name = "hackage-exprs-source"; });
12+
13+ # The new Haskell infra applied to nix representation of Hackage
14+ haskell = import ../. hackage;
15+
16+in {
17+ cabal-simple = callPackage ./cabal-simple { inherit haskell; };
18+ cabal-22 = callPackage ./cabal-22 { inherit haskell; };
19+}
20+
21+## possible test cases
22+# 1. fully static linking
23+# 2. presence of haddock
24+# 3. cabal 2.4 stuff
25+# 4. multiple libraries in a cabal project