diff options
| author | George Roman <george.roman.99@gmail.com> | 2018-07-04 00:51:50 +0300 |
|---|---|---|
| committer | Hisham Muhammad <hisham@gobolinux.org> | 2018-07-05 15:51:35 -0300 |
| commit | cfabbfb04ed77647f68689acb0457c8f9e555ad5 (patch) | |
| tree | 2a942d7d2bd6368a3698dcdfd4b68ea5de466e78 | |
| parent | 67a8c5c13f057163273c15dea73491a86f61c676 (diff) | |
| download | luarocks-cfabbfb04ed77647f68689acb0457c8f9e555ad5.tar.gz luarocks-cfabbfb04ed77647f68689acb0457c8f9e555ad5.tar.bz2 luarocks-cfabbfb04ed77647f68689acb0457c8f9e555ad5.zip | |
Tests: unit tests for build.builtin
| -rw-r--r-- | spec/build_spec.lua | 473 |
1 files changed, 454 insertions, 19 deletions
diff --git a/spec/build_spec.lua b/spec/build_spec.lua index c7fd2a22..03f60d18 100644 --- a/spec/build_spec.lua +++ b/spec/build_spec.lua | |||
| @@ -30,6 +30,18 @@ local extra_rocks = { | |||
| 30 | "/validate-args-1.5.4-1.rockspec" | 30 | "/validate-args-1.5.4-1.rockspec" |
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | local c_module_source = [[ | ||
| 34 | #include <lua.h> | ||
| 35 | #include <lauxlib.h> | ||
| 36 | |||
| 37 | int luaopen_c_module(lua_State* L) { | ||
| 38 | lua_newtable(L); | ||
| 39 | lua_pushinteger(L, 1); | ||
| 40 | lua_setfield(L, -2, "c_module"); | ||
| 41 | return 1; | ||
| 42 | } | ||
| 43 | ]] | ||
| 44 | |||
| 33 | describe("LuaRocks build tests #integration", function() | 45 | describe("LuaRocks build tests #integration", function() |
| 34 | 46 | ||
| 35 | before_each(function() | 47 | before_each(function() |
| @@ -60,24 +72,10 @@ describe("LuaRocks build tests #integration", function() | |||
| 60 | } | 72 | } |
| 61 | } | 73 | } |
| 62 | ]], finally) | 74 | ]], finally) |
| 63 | write_file("c_module.c", [[ | 75 | write_file("c_module.c", c_module_source, finally) |
| 64 | #include <lua.h> | ||
| 65 | #include <lauxlib.h> | ||
| 66 | |||
| 67 | int luaopen_c_module(lua_State* L) { | ||
| 68 | lua_newtable(L); | ||
| 69 | lua_pushinteger(L, 1); | ||
| 70 | lua_setfield(L, -2, "c_module"); | ||
| 71 | return 1; | ||
| 72 | } | ||
| 73 | ]], finally) | ||
| 74 | 76 | ||
| 75 | assert.is_true(run.luarocks_bool("build")) | 77 | assert.is_true(run.luarocks_bool("build")) |
| 76 | if test_env.TEST_TARGET_OS == "windows" then | 78 | assert.truthy(lfs.attributes(tmpdir .. "/c_module." .. test_env.lib_extension)) |
| 77 | assert.truthy(lfs.attributes(tmpdir .. "/c_module.dll")) | ||
| 78 | else | ||
| 79 | assert.truthy(lfs.attributes(tmpdir .. "/c_module.so")) | ||
| 80 | end | ||
| 81 | 79 | ||
| 82 | lfs.chdir(olddir) | 80 | lfs.chdir(olddir) |
| 83 | lfs.rmdir(tmpdir) | 81 | lfs.rmdir(tmpdir) |
| @@ -284,9 +282,7 @@ describe("LuaRocks build tests #integration", function() | |||
| 284 | 282 | ||
| 285 | lfs.mkdir("autodetect") | 283 | lfs.mkdir("autodetect") |
| 286 | write_file("autodetect/bla.lua", "return {}", finally) | 284 | write_file("autodetect/bla.lua", "return {}", finally) |
| 287 | write_file("c_module.c", [[ | 285 | write_file("c_module.c", c_module_source, finally) |
| 288 | |||
| 289 | ]], finally) | ||
| 290 | end) | 286 | end) |
| 291 | 287 | ||
| 292 | after_each(function() | 288 | after_each(function() |
| @@ -454,3 +450,442 @@ describe("LuaRocks build tests #integration", function() | |||
| 454 | end) | 450 | end) |
| 455 | 451 | ||
| 456 | end) | 452 | end) |
| 453 | |||
| 454 | test_env.unload_luarocks() | ||
| 455 | test_env.setup_specs() | ||
| 456 | local cfg = require("luarocks.core.cfg") | ||
| 457 | local deps = require("luarocks.deps") | ||
| 458 | local fs = require("luarocks.fs") | ||
| 459 | local path = require("luarocks.path") | ||
| 460 | local rockspecs = require("luarocks.rockspecs") | ||
| 461 | local build_builtin = require("luarocks.build.builtin") | ||
| 462 | |||
| 463 | describe("LuaRocks build tests #unit", function() | ||
| 464 | local runner | ||
| 465 | |||
| 466 | setup(function() | ||
| 467 | runner = require("luacov.runner") | ||
| 468 | runner.init(testing_paths.testrun_dir .. "/luacov.config") | ||
| 469 | runner.tick = true | ||
| 470 | cfg.init() | ||
| 471 | fs.init() | ||
| 472 | deps.check_lua(cfg.variables) | ||
| 473 | end) | ||
| 474 | |||
| 475 | teardown(function() | ||
| 476 | runner.shutdown() | ||
| 477 | end) | ||
| 478 | |||
| 479 | describe("build.builtin", function() | ||
| 480 | describe("builtin.autodetect_external_dependencies", function() | ||
| 481 | it("returns false if the given build table has no external dependencies", function() | ||
| 482 | local build_table = { | ||
| 483 | type = "builtin" | ||
| 484 | } | ||
| 485 | |||
| 486 | assert.falsy(build_builtin.autodetect_external_dependencies(build_table)) | ||
| 487 | end) | ||
| 488 | |||
| 489 | it("returns a table of the external dependencies found in the given build table", function() | ||
| 490 | local build_table = { | ||
| 491 | type = "builtin", | ||
| 492 | modules = { | ||
| 493 | module1 = { | ||
| 494 | libraries = { "foo1", "foo2" }, | ||
| 495 | }, | ||
| 496 | module2 = { | ||
| 497 | libraries = "foo3" | ||
| 498 | }, | ||
| 499 | } | ||
| 500 | } | ||
| 501 | |||
| 502 | local extdeps = build_builtin.autodetect_external_dependencies(build_table) | ||
| 503 | assert.same(extdeps["FOO1"], { library = "foo1" }) | ||
| 504 | assert.same(extdeps["FOO2"], { library = "foo2" }) | ||
| 505 | assert.same(extdeps["FOO3"], { library = "foo3" }) | ||
| 506 | end) | ||
| 507 | |||
| 508 | it("adds proper include and library dirs to the given build table", function() | ||
| 509 | local build_table | ||
| 510 | |||
| 511 | build_table = { | ||
| 512 | type = "builtin", | ||
| 513 | modules = { | ||
| 514 | module1 = { | ||
| 515 | libraries = "foo" | ||
| 516 | } | ||
| 517 | } | ||
| 518 | } | ||
| 519 | build_builtin.autodetect_external_dependencies(build_table) | ||
| 520 | assert.same(build_table, { | ||
| 521 | type = "builtin", | ||
| 522 | modules = { | ||
| 523 | module1 = { | ||
| 524 | libraries = "foo", | ||
| 525 | incdirs = { "$(FOO_INCDIR)" }, | ||
| 526 | libdirs = { "$(FOO_LIBDIR)" } | ||
| 527 | } | ||
| 528 | } | ||
| 529 | }) | ||
| 530 | |||
| 531 | build_table = { | ||
| 532 | type = "builtin", | ||
| 533 | modules = { | ||
| 534 | module1 = { | ||
| 535 | libraries = "foo", | ||
| 536 | incdirs = { "INCDIRS" } | ||
| 537 | } | ||
| 538 | } | ||
| 539 | } | ||
| 540 | build_builtin.autodetect_external_dependencies(build_table) | ||
| 541 | assert.same(build_table, { | ||
| 542 | type = "builtin", | ||
| 543 | modules = { | ||
| 544 | module1 = { | ||
| 545 | libraries = "foo", | ||
| 546 | incdirs = { "INCDIRS" }, | ||
| 547 | libdirs = { "$(FOO_LIBDIR)" } | ||
| 548 | } | ||
| 549 | } | ||
| 550 | }) | ||
| 551 | |||
| 552 | build_table = { | ||
| 553 | type = "builtin", | ||
| 554 | modules = { | ||
| 555 | module1 = { | ||
| 556 | libraries = "foo", | ||
| 557 | libdirs = { "LIBDIRS" } | ||
| 558 | } | ||
| 559 | } | ||
| 560 | } | ||
| 561 | build_builtin.autodetect_external_dependencies(build_table) | ||
| 562 | assert.same(build_table, { | ||
| 563 | type = "builtin", | ||
| 564 | modules = { | ||
| 565 | module1 = { | ||
| 566 | libraries = "foo", | ||
| 567 | incdirs = { "$(FOO_INCDIR)" }, | ||
| 568 | libdirs = { "LIBDIRS" } | ||
| 569 | } | ||
| 570 | } | ||
| 571 | }) | ||
| 572 | |||
| 573 | build_table = { | ||
| 574 | type = "builtin", | ||
| 575 | modules = { | ||
| 576 | module1 = { | ||
| 577 | libraries = "foo", | ||
| 578 | incdirs = { "INCDIRS" }, | ||
| 579 | libdirs = { "LIBDIRS" } | ||
| 580 | } | ||
| 581 | } | ||
| 582 | } | ||
| 583 | build_builtin.autodetect_external_dependencies(build_table) | ||
| 584 | assert.same(build_table, { | ||
| 585 | type = "builtin", | ||
| 586 | modules = { | ||
| 587 | module1 = { | ||
| 588 | libraries = "foo", | ||
| 589 | incdirs = { "INCDIRS" }, | ||
| 590 | libdirs = { "LIBDIRS" } | ||
| 591 | } | ||
| 592 | } | ||
| 593 | }) | ||
| 594 | end) | ||
| 595 | end) | ||
| 596 | |||
| 597 | describe("builtin.autodetect_modules", function() | ||
| 598 | local tmpdir | ||
| 599 | local olddir | ||
| 600 | |||
| 601 | before_each(function() | ||
| 602 | tmpdir = get_tmp_path() | ||
| 603 | olddir = lfs.currentdir() | ||
| 604 | lfs.mkdir(tmpdir) | ||
| 605 | lfs.chdir(tmpdir) | ||
| 606 | fs.change_dir(tmpdir) | ||
| 607 | end) | ||
| 608 | |||
| 609 | after_each(function() | ||
| 610 | if olddir then | ||
| 611 | lfs.chdir(olddir) | ||
| 612 | if tmpdir then | ||
| 613 | lfs.rmdir(tmpdir) | ||
| 614 | end | ||
| 615 | end | ||
| 616 | end) | ||
| 617 | |||
| 618 | local libs = { "foo1", "foo2" } | ||
| 619 | local incdirs = { "$(FOO1_INCDIR)", "$(FOO2_INCDIR)" } | ||
| 620 | local libdirs = { "$(FOO1_LIBDIR)", "$(FOO2_LIBDIR)" } | ||
| 621 | |||
| 622 | it("returns a table of the modules having as location the current directory", function() | ||
| 623 | write_file("module1.lua", "", finally) | ||
| 624 | write_file("module2.c", "", finally) | ||
| 625 | write_file("module3.c", "int luaopen_my_module()", finally) | ||
| 626 | write_file("test.lua", "", finally) | ||
| 627 | write_file("tests.lua", "", finally) | ||
| 628 | |||
| 629 | local modules = build_builtin.autodetect_modules(libs, incdirs, libdirs) | ||
| 630 | assert.same(modules, { | ||
| 631 | module1 = "module1.lua", | ||
| 632 | module2 = { | ||
| 633 | sources = "module2.c", | ||
| 634 | libraries = libs, | ||
| 635 | incdirs = incdirs, | ||
| 636 | libdirs = libdirs | ||
| 637 | }, | ||
| 638 | my_module = { | ||
| 639 | sources = "module3.c", | ||
| 640 | libraries = libs, | ||
| 641 | incdirs = incdirs, | ||
| 642 | libdirs = libdirs | ||
| 643 | } | ||
| 644 | }) | ||
| 645 | end) | ||
| 646 | |||
| 647 | local test_with_location = function(location) | ||
| 648 | lfs.mkdir(location) | ||
| 649 | lfs.mkdir(location .. "/dir1") | ||
| 650 | lfs.mkdir(location .. "/dir1/dir2") | ||
| 651 | |||
| 652 | write_file(location .. "/module1.lua", "", finally) | ||
| 653 | write_file(location .. "/dir1/module2.c", "", finally) | ||
| 654 | write_file(location .. "/dir1/dir2/module3.c", "int luaopen_my_module()", finally) | ||
| 655 | write_file(location .. "/test.lua", "", finally) | ||
| 656 | write_file(location .. "/tests.lua", "", finally) | ||
| 657 | |||
| 658 | local modules = build_builtin.autodetect_modules(libs, incdirs, libdirs) | ||
| 659 | assert.same(modules, { | ||
| 660 | module1 = location .. "/module1.lua", | ||
| 661 | ["dir1.module2"] = { | ||
| 662 | sources = location .. "/dir1/module2.c", | ||
| 663 | libraries = libs, | ||
| 664 | incdirs = incdirs, | ||
| 665 | libdirs = libdirs | ||
| 666 | }, | ||
| 667 | my_module = { | ||
| 668 | sources = location .. "/dir1/dir2/module3.c", | ||
| 669 | libraries = libs, | ||
| 670 | incdirs = incdirs, | ||
| 671 | libdirs = libdirs | ||
| 672 | } | ||
| 673 | }) | ||
| 674 | |||
| 675 | lfs.rmdir(location .. "/dir1/dir2") | ||
| 676 | lfs.rmdir(location .. "/dir1") | ||
| 677 | lfs.rmdir(location) | ||
| 678 | end | ||
| 679 | |||
| 680 | it("returns a table of the modules having as location the src directory", function() | ||
| 681 | test_with_location("src") | ||
| 682 | end) | ||
| 683 | |||
| 684 | it("returns a table of the modules having as location the lua directory", function() | ||
| 685 | test_with_location("lua") | ||
| 686 | end) | ||
| 687 | |||
| 688 | it("returns as second and third argument tables of the bin files and copy directories", function() | ||
| 689 | lfs.mkdir("doc") | ||
| 690 | lfs.mkdir("docs") | ||
| 691 | lfs.mkdir("samples") | ||
| 692 | lfs.mkdir("tests") | ||
| 693 | lfs.mkdir("bin") | ||
| 694 | write_file("bin/binfile", "", finally) | ||
| 695 | |||
| 696 | local _, install, copy_directories = build_builtin.autodetect_modules({}, {}, {}) | ||
| 697 | assert.same(install, { bin = { "bin/binfile" } }) | ||
| 698 | assert.same(copy_directories, { "doc", "docs", "samples", "tests" }) | ||
| 699 | |||
| 700 | lfs.rmdir("doc") | ||
| 701 | lfs.rmdir("docs") | ||
| 702 | lfs.rmdir("samples") | ||
| 703 | lfs.rmdir("tests") | ||
| 704 | lfs.rmdir("bin") | ||
| 705 | end) | ||
| 706 | end) | ||
| 707 | |||
| 708 | describe("builtin.run", function() | ||
| 709 | local tmpdir | ||
| 710 | local olddir | ||
| 711 | |||
| 712 | before_each(function() | ||
| 713 | tmpdir = get_tmp_path() | ||
| 714 | olddir = lfs.currentdir() | ||
| 715 | lfs.mkdir(tmpdir) | ||
| 716 | lfs.chdir(tmpdir) | ||
| 717 | fs.change_dir(tmpdir) | ||
| 718 | path.use_tree(lfs.currentdir()) | ||
| 719 | end) | ||
| 720 | |||
| 721 | after_each(function() | ||
| 722 | if olddir then | ||
| 723 | lfs.chdir(olddir) | ||
| 724 | if tmpdir then | ||
| 725 | lfs.rmdir(tmpdir) | ||
| 726 | end | ||
| 727 | end | ||
| 728 | end) | ||
| 729 | |||
| 730 | it("returns false if the rockspec has no build modules and its format does not support autoextraction", function() | ||
| 731 | local rockspec = { | ||
| 732 | package = "test", | ||
| 733 | version = "1.0-1", | ||
| 734 | source = { | ||
| 735 | url = "http://example.com/test" | ||
| 736 | }, | ||
| 737 | build = {} | ||
| 738 | } | ||
| 739 | |||
| 740 | rockspecs.from_persisted_table("test-1.0-1.rockspec", rockspec) | ||
| 741 | assert.falsy(build_builtin.run(rockspec)) | ||
| 742 | rockspec.rockspec_format = "1.0" | ||
| 743 | assert.falsy(build_builtin.run(rockspec)) | ||
| 744 | end) | ||
| 745 | |||
| 746 | it("returns false if lua.h could not be found", function() | ||
| 747 | local rockspec = { | ||
| 748 | package = "c_module", | ||
| 749 | version = "1.0-1", | ||
| 750 | source = { | ||
| 751 | url = "http://example.com/c_module" | ||
| 752 | }, | ||
| 753 | build = { | ||
| 754 | type = "builtin", | ||
| 755 | modules = { | ||
| 756 | c_module = "c_module.c" | ||
| 757 | } | ||
| 758 | } | ||
| 759 | } | ||
| 760 | write_file("c_module.c", c_module_source, finally) | ||
| 761 | |||
| 762 | rockspecs.from_persisted_table("c_module-1.0-1.rockspec", rockspec) | ||
| 763 | rockspec.variables = { LUA_INCDIR = "invalid" } | ||
| 764 | assert.falsy(build_builtin.run(rockspec)) | ||
| 765 | end) | ||
| 766 | |||
| 767 | it("returns false if the build fails", function() | ||
| 768 | local rockspec = { | ||
| 769 | package = "c_module", | ||
| 770 | version = "1.0-1", | ||
| 771 | source = { | ||
| 772 | url = "http://example.com/c_module" | ||
| 773 | }, | ||
| 774 | build = { | ||
| 775 | type = "builtin", | ||
| 776 | modules = { | ||
| 777 | c_module = "c_module.c" | ||
| 778 | } | ||
| 779 | } | ||
| 780 | } | ||
| 781 | write_file("c_module.c", c_module_source .. "invalid", finally) | ||
| 782 | |||
| 783 | rockspecs.from_persisted_table("c_module-1.0-1.rockspec", rockspec) | ||
| 784 | assert.falsy(build_builtin.run(rockspec)) | ||
| 785 | end) | ||
| 786 | |||
| 787 | it("returns true if the build succeeds with C module", function() | ||
| 788 | local rockspec = { | ||
| 789 | package = "c_module", | ||
| 790 | version = "1.0-1", | ||
| 791 | source = { | ||
| 792 | url = "http://example.com/c_module" | ||
| 793 | }, | ||
| 794 | build = { | ||
| 795 | type = "builtin", | ||
| 796 | modules = { | ||
| 797 | c_module = "c_module.c" | ||
| 798 | } | ||
| 799 | } | ||
| 800 | } | ||
| 801 | write_file("c_module.c", c_module_source, finally) | ||
| 802 | |||
| 803 | rockspecs.from_persisted_table("c_module-1.0-1.rockspec", rockspec) | ||
| 804 | assert.truthy(build_builtin.run(rockspec)) | ||
| 805 | assert.truthy(lfs.attributes("lib/luarocks/rocks-" .. test_env.lua_version .. "/c_module/1.0-1/lib/c_module." .. test_env.lib_extension)) | ||
| 806 | end) | ||
| 807 | |||
| 808 | it("returns true if the build succeeds with Lua module", function() | ||
| 809 | local rockspec = { | ||
| 810 | rockspec_format = "1.0", | ||
| 811 | package = "test", | ||
| 812 | version = "1.0-1", | ||
| 813 | source = { | ||
| 814 | url = "http://example.com/test" | ||
| 815 | }, | ||
| 816 | build = { | ||
| 817 | type = "builtin", | ||
| 818 | modules = { | ||
| 819 | test = "test.lua" | ||
| 820 | } | ||
| 821 | } | ||
| 822 | } | ||
| 823 | write_file("test.lua", "return {}", finally) | ||
| 824 | |||
| 825 | rockspecs.from_persisted_table("test-1.0-1.rockspec", rockspec) | ||
| 826 | assert.truthy(build_builtin.run(rockspec)) | ||
| 827 | assert.truthy(lfs.attributes("lib/luarocks/rocks-" .. test_env.lua_version .. "/test/1.0-1/lua/test.lua")) | ||
| 828 | end) | ||
| 829 | |||
| 830 | it("automatically extracts the modules and libraries if they are not given and builds against any external dependencies", function() | ||
| 831 | local ssllib = "ssl" | ||
| 832 | if test_env.TEST_TARGET_OS == "windows" then | ||
| 833 | if test_env.MINGW then | ||
| 834 | ssllib = "eay32" | ||
| 835 | else | ||
| 836 | ssllib = "ssleay32" | ||
| 837 | end | ||
| 838 | end | ||
| 839 | |||
| 840 | local rockspec = { | ||
| 841 | rockspec_format = "3.0", | ||
| 842 | package = "c_module", | ||
| 843 | version = "1.0-1", | ||
| 844 | source = { | ||
| 845 | url = "http://example.com/c_module" | ||
| 846 | }, | ||
| 847 | external_dependencies = { | ||
| 848 | OPENSSL = { | ||
| 849 | library = ssllib -- Use OpenSSL since it is available on all testing platforms | ||
| 850 | } | ||
| 851 | }, | ||
| 852 | build = { | ||
| 853 | type = "builtin" | ||
| 854 | } | ||
| 855 | } | ||
| 856 | write_file("c_module.c", c_module_source, finally) | ||
| 857 | |||
| 858 | rockspecs.from_persisted_table("c_module-1.0-1.rockspec", rockspec) | ||
| 859 | rockspec.variables["OPENSSL_INCDIR"] = test_env.OPENSSL_INCDIR | ||
| 860 | rockspec.variables["OPENSSL_LIBDIR"] = test_env.OPENSSL_LIBDIR | ||
| 861 | assert.truthy(build_builtin.run(rockspec)) | ||
| 862 | end) | ||
| 863 | |||
| 864 | it("returns false if any external dependency is missing", function() | ||
| 865 | local rockspec = { | ||
| 866 | rockspec_format = "3.0", | ||
| 867 | package = "c_module", | ||
| 868 | version = "1.0-1", | ||
| 869 | source = { | ||
| 870 | url = "https://example.com/c_module" | ||
| 871 | }, | ||
| 872 | external_dependencies = { | ||
| 873 | EXTDEP = { | ||
| 874 | library = "missing" | ||
| 875 | } | ||
| 876 | }, | ||
| 877 | build = { | ||
| 878 | type = "builtin" | ||
| 879 | } | ||
| 880 | } | ||
| 881 | write_file("c_module.c", c_module_source, finally) | ||
| 882 | |||
| 883 | rockspecs.from_persisted_table("c_module-1.0-1.rockspec", rockspec) | ||
| 884 | rockspec.variables["EXTDEP_INCDIR"] = lfs.currentdir() | ||
| 885 | rockspec.variables["EXTDEP_LIBDIR"] = lfs.currentdir() | ||
| 886 | assert.falsy(build_builtin.run(rockspec)) | ||
| 887 | end) | ||
| 888 | end) | ||
| 889 | end) | ||
| 890 | end) | ||
| 891 | |||
