genode/repos/gems/run/depot_remove.run
Alice Domage 3f661a75e4 depot_remove.run: make test functions more intuitive
This commits introduces improvements to the test functions to avoid
code duplication, and renames these functions to reflect better what they
are used for.

Issue genodelabs#4866
2023-09-29 12:15:05 +02:00

313 lines
8.5 KiB
Plaintext

assert_spec linux
create_boot_directory
import_from_depot [depot_user]/src/[base_src] \
[depot_user]/src/report_rom \
[depot_user]/src/vfs \
[depot_user]/src/lx_fs \
[depot_user]/src/vfs_import \
[depot_user]/src/init
create_tar_from_depot_binaries [run_dir]/genode/depot.tar \
[depot_user]/pkg/chroot \
[depot_user]/pkg/system_shell \
[depot_user]/pkg/fonts_fs \
[depot_user]/pkg/wm \
[depot_user]/pkg/nano3d \
[depot_user]/pkg/window_layouter \
[depot_user]/pkg/motif_decorator \
[depot_user]/pkg/themed_decorator \
[depot_user]/pkg/sticks_blue_backdrop
if { [get_cmd_switch --autopilot] } {
import_from_depot [depot_user]/src/depot_remove
} else {
build { app/depot_remove }
}
install_config {
<config>
<parent-provides>
<service name="ROM"/>
<service name="IRQ"/>
<service name="IO_MEM"/>
<service name="IO_PORT"/>
<service name="PD"/>
<service name="RM"/>
<service name="CPU"/>
<service name="LOG"/>
</parent-provides>
<default-route>
<any-service> <parent/> <any-child/> </any-service>
</default-route>
<default caps="100"/>
<start name="timer">
<resource name="RAM" quantum="1M"/>
<provides> <service name="Timer"/> </provides>
</start>
<start name="report_rom">
<resource name="RAM" quantum="100M"/>
<provides> <service name="Report"/> <service name="ROM"/> </provides>
<config verbose="yes"/>
</start>
<start name="lx_fs" ld="no">
<resource name="RAM" quantum="100M"/>
<provides> <service name="File_system"/> </provides>
<config>
<policy label="depot_remove -> " root="/depot" writeable="yes"/>
</config>
</start>
<start name="depot_remove">
<resource name="RAM" quantum="2M"/>
<route>
<service name="ROM" label="config"> <parent label="depot_remove_config"/> </service>
<service name="File_system"> <child name="lx_fs"/> </service>
<any-service> <parent/> <any-child/> </any-service>
</route>
</start>
</config>}
exec mkdir [run_dir]/genode/depot
exec tar xvf [run_dir]/genode/depot.tar -C [run_dir]/genode/depot
exec chmod -R +r [run_dir]/genode/depot
if { [get_cmd_switch --autopilot] } {
build_boot_image {}
} else {
build_boot_image [build_artifacts]
}
proc install_test_config { args } {
set fd [open [run_dir]/genode/depot_remove_config w]
puts $fd "[join $args {}]"
close $fd
}
proc pkg_path { name } {
return [depot_user]/pkg/$name/[_current_depot_archive_version pkg $name] }
proc collect_pkg_dependencies { path } {
set fd [open [run_dir]/genode/depot/$path/archives r]
set pkg_deps [split [string trim [read $fd]]]
close $fd
return $pkg_deps
}
proc build_depot_context { } {
set context [dict create]
dict set context archives_to_delete { }
dict set context archives_to_keep { }
# collect every PKGs and dependencies in the keep list
foreach dir [glob -type d "[run_dir]/genode/depot/[depot_user]/pkg/*"] {
dict with context {
set path [pkg_path [file tail $dir]]
set dependencies [collect_pkg_dependencies $path]
foreach dependency $dependencies {
set idx [lsearch -exact $archives_to_keep $dependency]
if { $idx == -1 } {
lappend archives_to_keep $dependency
}
}
lappend archives_to_keep $path
}
}
return $context
}
proc mark_pkg_for_deletion { context name } {
# collect pkg versioned path and its dependencies
set path [pkg_path $name]
set archives [collect_pkg_dependencies $path]
lappend archives $path
# compute archive(s) still referenced by another PKG that must be kept
foreach dir [glob -type d "[run_dir]/genode/depot/[depot_user]/pkg/*"] {
if { [file tail $dir] == $name } continue
set pkg_path [pkg_path [file tail $dir]]
set pkg_dependencies [collect_pkg_dependencies $pkg_path]
foreach archive $archives {
set idx [lsearch -exact $pkg_dependencies $archive]
# remove the archive from deletion list if listed in other PKG dependencies
if { $idx != -1 } {
set archive_idx [lsearch -exact $archives $archive]
set archives [lreplace $archives $archive_idx $archive_idx]
}
}
}
# remove archives to delete from keep list and put them into deletion list
foreach archive $archives {
dict with context {
set idx [lsearch -exact $archives_to_keep $archive]
if { $idx != -1 } {
set archives_to_keep [lreplace $archives_to_keep $idx $idx]
}
set idx [lsearch -exact $archives_to_delete $archive]
if { $idx == -1 } {
lappend archives_to_delete $archive
}
}
}
return $context
}
proc mark_pkg_to_keep { context name } {
# collect pkg versioned path and its dependencies
set path [pkg_path $name]
set dependencies [collect_pkg_dependencies $path]
lappend dependencies $path
# ensure archives are not into deletion list but in keep list
foreach archive $dependencies {
dict with context {
set idx [lsearch -exact $archives_to_delete $archive]
if { $idx != -1 } {
set archives_to_delete [lreplace $archives_to_delete $idx $idx]
}
set idx [lsearch -exact $archives_to_keep $archive]
if { $idx == -1 } {
lappend archives_to_keep $archive
}
}
}
return $context
}
proc mark_all_for_deletion { context } {
dict with context {
set archives_to_delete [concat $archives_to_delete $archives_to_keep]
set archives_to_keep { }
}
return $context
}
proc check_depot_state { context } {
foreach archive [dict get $context archives_to_delete] {
regexp [_depot_archive_versioned_path_pattern] $archive dummy archive_user archive_type archive_name
if { $archive_type == "src" } {
set archive $archive_user/bin/[depot_spec]/$archive_name/[_current_depot_archive_version src $archive_name]
}
if { [file isdirectory [run_dir]/genode/depot/$archive] } {
puts "ERROR: $archive is present but should has been deleted."
return 1
}
}
foreach archive [dict get $context archives_to_keep] {
regexp [_depot_archive_versioned_path_pattern] $archive dummy archive_user archive_type archive_name
if { $archive_type == "src" } {
set archive $archive_user/bin/[depot_spec]/$archive_name/[_current_depot_archive_version src $archive_name]
}
if { ![file isdirectory [run_dir]/genode/depot/$archive] } {
puts "ERROR: $archive should still be there but it has been deleted."
return 1
}
}
return 0
}
puts "\n--------------- TEST 1 --- Delete nano3d"
set context [mark_pkg_for_deletion [build_depot_context] "nano3d"]
install_test_config {
<config arch="} [depot_spec] {" report="yes">
<remove user="} [depot_user] {" pkg="nano3d"/>
<vfs> <dir name="depot"> <fs/> </dir> </vfs>
</config>}
run_genode_until ".*</removed_archives>" 10
if { [check_depot_state $context] } {
puts " TEST 1 --- Delete nano3d -- ERROR"
exit 1
}
puts " TEST 1 --- Delete nano3d -- SUCCESS"
puts "\n--------------- TEST 2 --- Delete non existing archive"
set context [build_depot_context]
install_test_config {
<config arch="} [depot_spec] {" report="yes">
<remove user="} [depot_user] {" pkg="nano3d"/>
<vfs> <dir name="depot"> <fs/> </dir> </vfs>
</config>}
run_genode_until ".*<removed_archives/>" 10
if { [check_depot_state $context] } {
puts " TEST 2 --- Delete non existing archive -- ERROR"
exit 1
}
puts " TEST 2 --- Delete non existing archive -- SUCCESS"
puts "\n--------------- TEST 3 --- Delete a PKG archive with deps to keep"
set context [mark_pkg_for_deletion [build_depot_context] "fonts_fs"]
install_test_config {
<config arch="} [depot_spec] {" report="yes">
<remove user="} [depot_user] {" pkg="fonts_fs"/>
<vfs> <dir name="depot"> <fs/> </dir> </vfs>
</config>}
run_genode_until ".*</removed_archives>" 10
if { [check_depot_state $context] } {
puts " TEST 3 --- Delete a PKG archive with deps to keep --- ERROR"
exit 1
}
puts " TEST 3 --- Delete a PKG archive with deps to keep --- SUCCESS"
puts "\n--------------- TEST 4 --- Remove all, keep themed_decorator PKG"
set context [mark_all_for_deletion [build_depot_context]]
set context [mark_pkg_to_keep $context "themed_decorator"]
install_test_config {
<config arch="} [depot_spec] {" report="yes">
<remove-all>
<keep user="} [depot_user] {" pkg="themed_decorator"/>
</remove-all>
<vfs> <dir name="depot"> <fs/> </dir> </vfs>
</config>}
run_genode_until ".*</removed_archives>" 10
if { [check_depot_state $context] } {
puts " TEST 4 --- Remove all, keep themed_decorator PKG --- ERROR"
exit 1
}
puts " TEST 4 --- Remove all, keep themed_decorator PKG --- SUCCESS"