On 28 Dec 2021, at 21:51, Albus Matt Piroglu wrote:
Note I have opened an issue on gitlab, but I know it's an overkill to open issues for questions. I couldn't find an appropriate channel until I found this mailing list. I'll close the issue, and here is my question for your consideration:
Hi, I'm trying to test a functionality that depends on loading systems. Thusly I ended up writing some tests that need to load a "test-system" during the tests, and I clear the system afterwards.
A simplified code for the test in question is:
(test check-the-system-is-loaded-as-expected () (asdf:load-system "my-test-system-under-test-folder") (is --check that the system loaded as expected--) (asdf:clear-system "my-test-system-under-test-folder") (delete-package "PACKAGE-FROM-TEST-SYSTEM"))
and, to clarify, another test relies on the same system not being loaded, so I don't think a dependency would solve the issue, it is rather a dynamic decision to load or not.
Now, I know that this feature is deprecated and may not work. What I'm wondering if there's a safer way to achieve this. Wouldn't some tests for asdf itself need loading some test systems for example? (hmm it actually might be a good idea to go check them now). OK, for example there's a hello-world-example.asd in test, which looks similar to my my-test-system-under-test-folder.
So, instead of asdf:load-system in the above test code, should I be using a lower-level operation call?
I'm not entirely sure what you mean by "test" in the above. If you look at the tests in ASDF (in the test/ subdirectory), you will see that these are typically run from the shell, and so don't have any lasting effects. Lisp starts, the test is run, lisp exits. So typically we don't have to worry about clearing systems.
If you want to understand better how ASDF does its testing, a good resource is to read the file test/script-support.lisp which has the testing utilities. (If you would like to submit a merge request with additional comments and/or docstrings for this file, that would be welcome!)
You will see that this file contains a def-test-system macro (unfortunately, without a docstring) that can be used in tests to create a system without needing an asd file. See, for example, test/test-sysdef-asdf.script for uses of def-test-system
This file also has an example of the use of CLEAR-SYSTEM, which is exported by ASDF and is defined as follows:
"Clear the entry for a SYSTEM in the database of systems
previously defined. However if the system was registered as PRELOADED (which it is if it is IMMUTABLE), then a new system with the same name will be defined and registered in its place from which build details will have been cleared. Note that this does NOT in any way cause any of the code of the system to be unloaded. Returns T if system was or is now undefined, NIL if a new preloaded system was redefined."
Note from the above that you cannot unload a system. Loading a system has arbitrary effects on the running lisp image, and those effects cannot, in general, be undone. This is part of the reason that each ASDF test is run in a separate lisp process.
As for testing whether or not a system has been loaded, typically what is done is to define a package and a variable in that package in the test system, and then check for that variable having the expected value in order to see if the system has been loaded.