 d88721e440
			
		
	
	
		d88721e440
		
			
		
	
	
	
	
		
			
			This is based on a prototype Nicolas B. Pierron worked on during a discussion we had at FOSDEM. A new version with a workaround for problems of the reverted original. Discussion: https://github.com/NixOS/nixpkgs/commit/3f2566689
		
			
				
	
	
		
			141 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/sh
 | |
| #
 | |
| # This script is used to test that the module system is working as expected.
 | |
| # By default it test the version of nixpkgs which is defined in the NIX_PATH.
 | |
| 
 | |
| cd ./modules
 | |
| 
 | |
| pass=0
 | |
| fail=0
 | |
| 
 | |
| evalConfig() {
 | |
|     local attr=$1
 | |
|     shift;
 | |
|     local script="import ./default.nix { modules = [ $@ ];}"
 | |
|     nix-instantiate --timeout 1 -E "$script" -A "$attr" --eval-only --show-trace
 | |
| }
 | |
| 
 | |
| reportFailure() {
 | |
|     local attr=$1
 | |
|     shift;
 | |
|     local script="import ./default.nix { modules = [ $@ ];}"
 | |
|     echo 2>&1 "$ nix-instantiate -E '$script' -A '$attr' --eval-only"
 | |
|     evalConfig "$attr" "$@"
 | |
|     fail=$((fail + 1))
 | |
| }
 | |
| 
 | |
| checkConfigOutput() {
 | |
|     local outputContains=$1
 | |
|     shift;
 | |
|     if evalConfig "$@" 2>/dev/null | grep --silent "$outputContains" ; then
 | |
|         pass=$((pass + 1))
 | |
|         return 0;
 | |
|     else
 | |
|         echo 2>&1 "error: Expected result matching '$outputContains', while evaluating"
 | |
|         reportFailure "$@"
 | |
|         return 1
 | |
|     fi
 | |
| }
 | |
| 
 | |
| checkConfigError() {
 | |
|     local errorContains=$1
 | |
|     local err=""
 | |
|     shift;
 | |
|     if err==$(evalConfig "$@" 2>&1 >/dev/null); then
 | |
|         echo 2>&1 "error: Expected error code, got exit code 0, while evaluating"
 | |
|         reportFailure "$@"
 | |
|         return 1
 | |
|     else
 | |
|         if echo "$err" | grep --silent "$errorContains" ; then
 | |
|             pass=$((pass + 1))
 | |
|             return 0;
 | |
|         else
 | |
|             echo 2>&1 "error: Expected error matching '$errorContains', while evaluating"
 | |
|             reportFailure "$@"
 | |
|             return 1
 | |
|         fi
 | |
|     fi
 | |
| }
 | |
| 
 | |
| # Check boolean option.
 | |
| checkConfigOutput "false" config.enable ./declare-enable.nix
 | |
| checkConfigError 'The option .* defined in .* does not exist.' config.enable ./define-enable.nix
 | |
| 
 | |
| # Check mkForce without submodules.
 | |
| set -- config.enable ./declare-enable.nix ./define-enable.nix
 | |
| checkConfigOutput "true" "$@"
 | |
| checkConfigOutput "false" "$@" ./define-force-enable.nix
 | |
| checkConfigOutput "false" "$@" ./define-enable-force.nix
 | |
| 
 | |
| # Check mkForce with option and submodules.
 | |
| checkConfigError 'attribute .*foo.* .* not found' config.loaOfSub.foo.enable ./declare-loaOfSub-any-enable.nix
 | |
| checkConfigOutput 'false' config.loaOfSub.foo.enable ./declare-loaOfSub-any-enable.nix ./define-loaOfSub-foo.nix
 | |
| set -- config.loaOfSub.foo.enable ./declare-loaOfSub-any-enable.nix ./define-loaOfSub-foo-enable.nix
 | |
| checkConfigOutput 'true' "$@"
 | |
| checkConfigOutput 'false' "$@" ./define-force-loaOfSub-foo-enable.nix
 | |
| checkConfigOutput 'false' "$@" ./define-loaOfSub-force-foo-enable.nix
 | |
| checkConfigOutput 'false' "$@" ./define-loaOfSub-foo-force-enable.nix
 | |
| checkConfigOutput 'false' "$@" ./define-loaOfSub-foo-enable-force.nix
 | |
| 
 | |
| # Check overriding effect of mkForce on submodule definitions.
 | |
| checkConfigError 'attribute .*bar.* .* not found' config.loaOfSub.bar.enable ./declare-loaOfSub-any-enable.nix ./define-loaOfSub-foo.nix
 | |
| checkConfigOutput 'false' config.loaOfSub.bar.enable ./declare-loaOfSub-any-enable.nix ./define-loaOfSub-foo.nix ./define-loaOfSub-bar.nix
 | |
| set -- config.loaOfSub.bar.enable ./declare-loaOfSub-any-enable.nix ./define-loaOfSub-foo.nix ./define-loaOfSub-bar-enable.nix
 | |
| checkConfigOutput 'true' "$@"
 | |
| checkConfigError 'attribute .*bar.* .* not found' "$@" ./define-force-loaOfSub-foo-enable.nix
 | |
| checkConfigError 'attribute .*bar.* .* not found' "$@" ./define-loaOfSub-force-foo-enable.nix
 | |
| checkConfigOutput 'true' "$@" ./define-loaOfSub-foo-force-enable.nix
 | |
| checkConfigOutput 'true' "$@" ./define-loaOfSub-foo-enable-force.nix
 | |
| 
 | |
| # Check mkIf with submodules.
 | |
| checkConfigError 'attribute .*foo.* .* not found' config.loaOfSub.foo.enable ./declare-enable.nix ./declare-loaOfSub-any-enable.nix
 | |
| set -- config.loaOfSub.foo.enable ./declare-enable.nix ./declare-loaOfSub-any-enable.nix
 | |
| checkConfigError 'attribute .*foo.* .* not found' "$@" ./define-if-loaOfSub-foo-enable.nix
 | |
| checkConfigError 'attribute .*foo.* .* not found' "$@" ./define-loaOfSub-if-foo-enable.nix
 | |
| checkConfigError 'attribute .*foo.* .* not found' "$@" ./define-loaOfSub-foo-if-enable.nix
 | |
| checkConfigOutput 'false' "$@" ./define-loaOfSub-foo-enable-if.nix
 | |
| checkConfigOutput 'true' "$@" ./define-enable.nix ./define-if-loaOfSub-foo-enable.nix
 | |
| checkConfigOutput 'true' "$@" ./define-enable.nix ./define-loaOfSub-if-foo-enable.nix
 | |
| checkConfigOutput 'true' "$@" ./define-enable.nix ./define-loaOfSub-foo-if-enable.nix
 | |
| checkConfigOutput 'true' "$@" ./define-enable.nix ./define-loaOfSub-foo-enable-if.nix
 | |
| 
 | |
| # Check disabledModules with config definitions and option declarations.
 | |
| set -- config.enable ./define-enable.nix ./declare-enable.nix
 | |
| checkConfigOutput "true" "$@"
 | |
| checkConfigOutput "false" "$@" ./disable-define-enable.nix
 | |
| checkConfigError "The option .*enable.* defined in .* does not exist" "$@" ./disable-declare-enable.nix
 | |
| checkConfigError "attribute .*enable.* in selection path .*config.enable.* not found" "$@" ./disable-define-enable.nix ./disable-declare-enable.nix
 | |
| checkConfigError "attribute .*enable.* in selection path .*config.enable.* not found" "$@" ./disable-enable-modules.nix
 | |
| 
 | |
| # Check _module.args.
 | |
| set -- config.enable ./declare-enable.nix ./define-enable-with-custom-arg.nix
 | |
| checkConfigError 'while evaluating the module argument .*custom.* in .*define-enable-with-custom-arg.nix.*:' "$@"
 | |
| checkConfigOutput "true" "$@" ./define-_module-args-custom.nix
 | |
| 
 | |
| # Check that using _module.args on imports cause infinite recursions, with
 | |
| # the proper error context.
 | |
| set -- "$@" ./define-_module-args-custom.nix ./import-custom-arg.nix
 | |
| checkConfigError 'while evaluating the module argument .*custom.* in .*import-custom-arg.nix.*:' "$@"
 | |
| checkConfigError 'infinite recursion encountered' "$@"
 | |
| 
 | |
| # Check _module.check.
 | |
| set -- config.enable ./declare-enable.nix ./define-enable.nix ./define-loaOfSub-foo.nix
 | |
| checkConfigError 'The option .* defined in .* does not exist.' "$@"
 | |
| checkConfigOutput "true" "$@" ./define-module-check.nix
 | |
| 
 | |
| # Check coerced value.
 | |
| checkConfigOutput "\"42\"" config.value ./declare-coerced-value.nix
 | |
| checkConfigOutput "\"24\"" config.value ./declare-coerced-value.nix ./define-value-string.nix
 | |
| checkConfigError 'The option value .* in .* is not a string or integer.' config.value ./declare-coerced-value.nix ./define-value-list.nix
 | |
| 
 | |
| cat <<EOF
 | |
| ====== module tests ======
 | |
| $pass Pass
 | |
| $fail Fail
 | |
| EOF
 | |
| 
 | |
| if test $fail -ne 0; then
 | |
|     exit 1
 | |
| fi
 | |
| exit 0
 |