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
This commit is contained in:
Alice Domage 2023-06-23 13:24:24 +02:00 committed by Christian Helmuth
parent 0622446f09
commit 3f661a75e4

View File

@ -90,74 +90,112 @@ proc install_test_config { args } {
close $fd close $fd
} }
proc depot_state { } { proc pkg_path { name } {
return [depot_user]/pkg/$name/[_current_depot_archive_version pkg $name] }
set archives_to_keep {} proc collect_pkg_dependencies { path } {
foreach dir [glob -type d [run_dir]/genode/depot/[depot_user]/pkg/*] { set fd [open [run_dir]/genode/depot/$path/archives r]
set pkg_path [depot_user]/pkg/[file tail $dir]/[_current_depot_archive_version pkg [file tail $dir]] set pkg_deps [split [string trim [read $fd]]]
close $fd
set fd [open [run_dir]/genode/depot/$pkg_path/archives r] return $pkg_deps
set pkg_deps [split [string trim [read $fd]]] }
close $fd
foreach dependency $pkg_deps {
set idx [lsearch -exact $archives_to_keep $dependency]
if { $idx == -1 } {
lappend archives_to_keep $dependency
}
}
lappend archives_to_keep $pkg_path
}
proc build_depot_context { } {
set context [dict create] set context [dict create]
dict set context pkg "" dict set context archives_to_delete { }
dict set context archives_to_delete {} dict set context archives_to_keep { }
dict set context archives_to_keep $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 return $context
} }
proc depot_state_for_pkg { archive } { proc mark_pkg_for_deletion { context name } {
set archive_path [depot_user]/pkg/$archive/[_current_depot_archive_version pkg $archive]
# Dependencies of $archive are archives to delete # collect pkg versioned path and its dependencies
set fd [open [run_dir]/genode/depot/$archive_path/archives r] set path [pkg_path $name]
set archives_to_delete [split [string trim [read $fd]]] set archives [collect_pkg_dependencies $path]
close $fd lappend archives $path
set archives_to_keep {} # 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
foreach dir [glob -type d [run_dir]/genode/depot/[depot_user]/pkg/*] { set pkg_path [pkg_path [file tail $dir]]
set pkg_dependencies [collect_pkg_dependencies $pkg_path]
if { [file tail $dir] != $archive } { foreach archive $archives {
set idx [lsearch -exact $pkg_dependencies $archive]
set pkg_path [depot_user]/pkg/[file tail $dir]/[_current_depot_archive_version pkg [file tail $dir]] # remove the archive from deletion list if listed in other PKG dependencies
if { $idx != -1 } {
set fd [open [run_dir]/genode/depot/$pkg_path/archives r] set archive_idx [lsearch -exact $archives $archive]
set pkg_deps [split [string trim [read $fd]]] set archives [lreplace $archives $archive_idx $archive_idx]
close $fd
foreach dependency $archives_to_delete {
set idx [lsearch -exact $pkg_deps $dependency]
if { $idx != -1 } {
lappend archives_to_keep $dependency
}
} }
} }
} }
# Remove archive to keep from archive to delete # remove archives to delete from keep list and put them into deletion list
foreach dependency $archives_to_keep { foreach archive $archives {
set idx [lsearch -exact $archives_to_delete $dependency] dict with context {
set archives_to_delete [lreplace $archives_to_delete $idx $idx] 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
}
}
} }
set context [dict create] return $context
dict set context pkg "$archive_path" }
dict set context archives_to_delete $archives_to_delete
dict set context archives_to_keep $archives_to_keep
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 return $context
} }
@ -191,24 +229,18 @@ proc check_depot_state { context } {
} }
} }
if { [dict get $context pkg] != "" && [file isdirectory [run_dir]/genode/depot/[dict get $context pkg]] } {
puts "ERROR: [dict get $context pkg] is present but shoud have been deleted."
return 1
}
return 0 return 0
} }
## TEST 1 --- Delete nano3d --------------------------------------------------- puts "\n--------------- TEST 1 --- Delete nano3d"
set context [depot_state_for_pkg "nano3d"] set context [mark_pkg_for_deletion [build_depot_context] "nano3d"]
install_test_config { install_test_config {
<config arch="} [depot_spec] {" report="yes"> <config arch="} [depot_spec] {" report="yes">
<remove user="} [depot_user] {" pkg="nano3d"/> <remove user="} [depot_user] {" pkg="nano3d"/>
<vfs> <dir name="depot"> <fs/> </dir> </vfs> <vfs> <dir name="depot"> <fs/> </dir> </vfs>
</config> </config>}
}
run_genode_until ".*</removed_archives>" 10 run_genode_until ".*</removed_archives>" 10
@ -218,17 +250,15 @@ if { [check_depot_state $context] } {
} }
puts " TEST 1 --- Delete nano3d -- SUCCESS" puts " TEST 1 --- Delete nano3d -- SUCCESS"
puts "\n--------------- TEST 2 --- Delete non existing archive"
## TEST 2 --- Delete non existing archive ------------------------------------- set context [build_depot_context]
set context [depot_state]
install_test_config { install_test_config {
<config arch="} [depot_spec] {" report="yes"> <config arch="} [depot_spec] {" report="yes">
<remove user="} [depot_user] {" pkg="nano3d"/> <remove user="} [depot_user] {" pkg="nano3d"/>
<vfs> <dir name="depot"> <fs/> </dir> </vfs> <vfs> <dir name="depot"> <fs/> </dir> </vfs>
</config> </config>}
}
run_genode_until ".*<removed_archives/>" 10 run_genode_until ".*<removed_archives/>" 10
@ -239,16 +269,15 @@ if { [check_depot_state $context] } {
puts " TEST 2 --- Delete non existing archive -- SUCCESS" puts " TEST 2 --- Delete non existing archive -- SUCCESS"
## TEST 3 --- Delete a PKG archive with deps to keep -------------------------- puts "\n--------------- TEST 3 --- Delete a PKG archive with deps to keep"
set context [depot_state_for_pkg "fonts_fs"] set context [mark_pkg_for_deletion [build_depot_context] "fonts_fs"]
install_test_config { install_test_config {
<config arch="} [depot_spec] {" report="yes"> <config arch="} [depot_spec] {" report="yes">
<remove user="} [depot_user] {" pkg="fonts_fs"/> <remove user="} [depot_user] {" pkg="fonts_fs"/>
<vfs> <dir name="depot"> <fs/> </dir> </vfs> <vfs> <dir name="depot"> <fs/> </dir> </vfs>
</config> </config>}
}
run_genode_until ".*</removed_archives>" 10 run_genode_until ".*</removed_archives>" 10
@ -259,9 +288,10 @@ if { [check_depot_state $context] } {
puts " TEST 3 --- Delete a PKG archive with deps to keep --- SUCCESS" puts " TEST 3 --- Delete a PKG archive with deps to keep --- SUCCESS"
## TEST 4 --- Remove all, keep themed_decorator PKG -------------------------- puts "\n--------------- TEST 4 --- Remove all, keep themed_decorator PKG"
set context [depot_state_for_pkg "themed_decorator"] set context [mark_all_for_deletion [build_depot_context]]
set context [mark_pkg_to_keep $context "themed_decorator"]
install_test_config { install_test_config {
<config arch="} [depot_spec] {" report="yes"> <config arch="} [depot_spec] {" report="yes">
@ -269,12 +299,11 @@ install_test_config {
<keep user="} [depot_user] {" pkg="themed_decorator"/> <keep user="} [depot_user] {" pkg="themed_decorator"/>
</remove-all> </remove-all>
<vfs> <dir name="depot"> <fs/> </dir> </vfs> <vfs> <dir name="depot"> <fs/> </dir> </vfs>
</config> </config>}
}
run_genode_until ".*</removed_archives>" 10 run_genode_until ".*</removed_archives>" 10
if { ![check_depot_state $context] } { if { [check_depot_state $context] } {
puts " TEST 4 --- Remove all, keep themed_decorator PKG --- ERROR" puts " TEST 4 --- Remove all, keep themed_decorator PKG --- ERROR"
exit 1 exit 1
} }