aboutsummaryrefslogtreecommitdiff
path: root/test/fpm_test/test_installer.f90
diff options
context:
space:
mode:
Diffstat (limited to 'test/fpm_test/test_installer.f90')
-rw-r--r--test/fpm_test/test_installer.f90168
1 files changed, 168 insertions, 0 deletions
diff --git a/test/fpm_test/test_installer.f90 b/test/fpm_test/test_installer.f90
new file mode 100644
index 0000000..1235ba5
--- /dev/null
+++ b/test/fpm_test/test_installer.f90
@@ -0,0 +1,168 @@
+!> Define tests for the `fpm_installer` module
+!>
+!> The tests here setup a mock environment to allow testing for Unix and Windows
+!> platforms at the same time.
+module test_installer
+ use testsuite, only : new_unittest, unittest_t, error_t, test_failed, &
+ & check_string
+ use fpm_environment, only : OS_WINDOWS, OS_LINUX
+ use fpm_filesystem, only : join_path
+ use fpm_installer
+ implicit none
+ private
+
+ public :: collect_installer
+
+
+ type, extends(installer_t) :: mock_installer_t
+ character(len=:), allocatable :: expected_dir
+ character(len=:), allocatable :: expected_run
+ contains
+ procedure :: make_dir
+ procedure :: run
+ end type mock_installer_t
+
+contains
+
+ !> Collect all exported unit tests
+ subroutine collect_installer(testsuite)
+ !> Collection of tests
+ type(unittest_t), allocatable, intent(out) :: testsuite(:)
+
+ testsuite = [ &
+ & new_unittest("install-lib", test_install_lib), &
+ & new_unittest("install-pkgconfig", test_install_pkgconfig), &
+ & new_unittest("install-sitepackages", test_install_sitepackages), &
+ & new_unittest("install-mod", test_install_mod), &
+ & new_unittest("install-exe-unix", test_install_exe_unix), &
+ & new_unittest("install-exe-win", test_install_exe_win)]
+
+ end subroutine collect_installer
+
+ subroutine test_install_exe_unix(error)
+ !> Error handling
+ type(error_t), allocatable, intent(out) :: error
+
+ type(mock_installer_t) :: mock
+ type(installer_t) :: installer
+
+ call new_installer(installer, prefix="PREFIX", verbosity=0, copy="mock")
+ mock%installer_t = installer
+ mock%os = OS_LINUX
+ mock%expected_dir = "PREFIX/bin"
+ mock%expected_run = 'mock "name" "'//mock%expected_dir//'"'
+
+ call mock%install_executable("name", error)
+
+ end subroutine test_install_exe_unix
+
+ subroutine test_install_exe_win(error)
+ !> Error handling
+ type(error_t), allocatable, intent(out) :: error
+
+ type(mock_installer_t) :: mock
+ type(installer_t) :: installer
+
+ call new_installer(installer, prefix="PREFIX", verbosity=0, copy="mock")
+ mock%installer_t = installer
+ mock%os = OS_WINDOWS
+ mock%expected_dir = "PREFIX\bin"
+ mock%expected_run = 'mock "name.exe" "'//mock%expected_dir//'"'
+
+ call mock%install_executable("name", error)
+
+ end subroutine test_install_exe_win
+
+ subroutine test_install_lib(error)
+ !> Error handling
+ type(error_t), allocatable, intent(out) :: error
+
+ type(mock_installer_t) :: mock
+ type(installer_t) :: installer
+
+ call new_installer(installer, prefix="PREFIX", verbosity=0, copy="mock")
+ mock%installer_t = installer
+ mock%expected_dir = join_path("PREFIX", "lib")
+ mock%expected_run = 'mock "name" "'//join_path("PREFIX", "lib")//'"'
+
+ call mock%install_library("name", error)
+
+ end subroutine test_install_lib
+
+ subroutine test_install_pkgconfig(error)
+ !> Error handling
+ type(error_t), allocatable, intent(out) :: error
+
+ type(mock_installer_t) :: mock
+ type(installer_t) :: installer
+
+ call new_installer(installer, prefix="PREFIX", verbosity=0, copy="mock")
+ mock%installer_t = installer
+ mock%os = OS_WINDOWS
+ mock%expected_dir = "PREFIX\lib\pkgconfig"
+ mock%expected_run = 'mock "name" "'//mock%expected_dir//'"'
+
+ call mock%install("name", "lib/pkgconfig", error)
+
+ end subroutine test_install_pkgconfig
+
+ subroutine test_install_sitepackages(error)
+ !> Error handling
+ type(error_t), allocatable, intent(out) :: error
+
+ type(mock_installer_t) :: mock
+ type(installer_t) :: installer
+
+ call new_installer(installer, prefix="PREFIX", verbosity=0, copy="mock")
+ mock%installer_t = installer
+ mock%os = OS_LINUX
+ mock%expected_dir = "PREFIX/lib/python3.7/site-packages"
+ mock%expected_run = 'mock "name" "'//mock%expected_dir//'"'
+
+ call mock%install("name", join_path("lib", "python3.7", "site-packages"), &
+ error)
+
+ end subroutine test_install_sitepackages
+
+ subroutine test_install_mod(error)
+ !> Error handling
+ type(error_t), allocatable, intent(out) :: error
+
+ type(mock_installer_t) :: mock
+ type(installer_t) :: installer
+
+ call new_installer(installer, prefix="PREFIX", verbosity=0, copy="mock")
+ mock%installer_t = installer
+ mock%expected_dir = join_path("PREFIX", "include")
+ mock%expected_run = 'mock "name" "'//join_path("PREFIX", "include")//'"'
+
+ call mock%install_header("name", error)
+
+ end subroutine test_install_mod
+
+ !> Create a new directory in the prefix
+ subroutine make_dir(self, dir, error)
+ !> Instance of the installer
+ class(mock_installer_t), intent(inout) :: self
+ !> Directory to be created
+ character(len=*), intent(in) :: dir
+ !> Error handling
+ type(error_t), allocatable, intent(out) :: error
+
+ call check_string(error, self%expected_dir, dir, "dir")
+
+ end subroutine make_dir
+
+ !> Run an installation command
+ subroutine run(self, command, error)
+ !> Instance of the installer
+ class(mock_installer_t), intent(inout) :: self
+ !> Command to be launched
+ character(len=*), intent(in) :: command
+ !> Error handling
+ type(error_t), allocatable, intent(out) :: error
+
+ call check_string(error, self%expected_run, command, "run")
+ end subroutine run
+
+end module test_installer