From af3a58ca52a97e81302396502d16c90d5177db2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikola=20Forr=C3=B3?= Date: Mon, 25 Oct 2021 17:45:05 +0200 Subject: [PATCH] Add upstream tests as a gating test - related: #2006964 --- .gdisk.metadata | 1 + gating.yaml | 2 +- gdisk.spec | 6 +- tests/gdisk/README | 1 + tests/gdisk/gdisk_test.sh | 402 ++++++++++++++++++++++++++++++++++++++ tests/tests.yml | 11 ++ tests/upstream-tests | 26 +++ 7 files changed, 447 insertions(+), 2 deletions(-) create mode 100644 .gdisk.metadata create mode 100644 tests/gdisk/README create mode 100755 tests/gdisk/gdisk_test.sh create mode 100644 tests/tests.yml create mode 100755 tests/upstream-tests diff --git a/.gdisk.metadata b/.gdisk.metadata new file mode 100644 index 0000000..0079c95 --- /dev/null +++ b/.gdisk.metadata @@ -0,0 +1 @@ +406ab2596e1911c916dce677ce7e903076d94c6d gptfdisk-1.0.7.tar.gz diff --git a/gating.yaml b/gating.yaml index 4124226..648918d 100644 --- a/gating.yaml +++ b/gating.yaml @@ -3,4 +3,4 @@ product_versions: - rhel-9 decision_context: osci_compose_gate rules: - - !PassingTestCaseRule {test_case_name: desktop-qe.desktop-ci.tier1-gating.functional} + - !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional} diff --git a/gdisk.spec b/gdisk.spec index 3d549c4..db77b04 100644 --- a/gdisk.spec +++ b/gdisk.spec @@ -1,7 +1,7 @@ Summary: An fdisk-like partitioning tool for GPT disks Name: gdisk Version: 1.0.7 -Release: 4%{?dist} +Release: 5%{?dist} License: GPLv2 URL: http://www.rodsbooks.com/gdisk/ Source0: http://downloads.sourceforge.net/gptfdisk/gptfdisk-%{version}.tar.gz @@ -45,6 +45,10 @@ done %{_mandir}/man8/fixparts.8* %changelog +* Mon Oct 25 2021 Nikola Forró - 1.0.7-5 +- Add upstream tests as a gating test + related: #2006964 + * Wed Sep 29 2021 Nikola Forró - 1.0.7-4 - Fix incorrect byte order of partition names on big-endian systems resolves: #2006964 diff --git a/tests/gdisk/README b/tests/gdisk/README new file mode 100644 index 0000000..6c7f8d1 --- /dev/null +++ b/tests/gdisk/README @@ -0,0 +1 @@ +gdisk tests modified to run against installed gdisk diff --git a/tests/gdisk/gdisk_test.sh b/tests/gdisk/gdisk_test.sh new file mode 100755 index 0000000..24a423c --- /dev/null +++ b/tests/gdisk/gdisk_test.sh @@ -0,0 +1,402 @@ +#!/bin/bash +# test gdisk and sgdisk by creating a dd file +# Copyright (C) 2011 Guillaume Delacour +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# +# Requires: coreutils (mktemp, dd) and 64M of disk space in /tmp (temp dd disk) +# +# This script test gdisk commands through the following scenario: +# - Initialize a new GPT table +# - Create a single Linux partition +# - Change name of partition +# - Change type of partition +# - Backup to file the GPT table +# - Delete the single partition +# - Restore from backup file the GPT table +# - Wipe the GPT table + +# TODO +# Try to generate a wrong GPT table to detect problems (test --verify) +# Create MBR partition table with fdisk and migrate it with gdisk + +GDISK_BIN=/usr/sbin/gdisk +SGDISK_BIN=/usr/sbin/sgdisk + +OPT_CLEAR="o" +OPT_NEW="n" +OPT_CHANGE_NAME="c" +OPT_CHANGE_TYPE="t" +OPT_BACKUP="b" +OPT_DELETE="d" +OPT_ZAP="z" + +# temp disk for testing gdisk +TEMP_DISK=$(mktemp) +# 64 MiB +TEMP_DISK_SIZE=65536 + +# the test partition to create +TEST_PART_TYPE="8300" +TEST_PART_DEFAULT_NAME="Linux filesystem" + +# newname for the partition +TEST_PART_NEWNAME=$(tr -dc "[:alpha:]" < /dev/urandom | head -c 8) +# and new type (swap for example) +TEST_PART_NEWTYPE="8200" + +# GPT data backup to filename +GPT_BACKUP_FILENAME=$(mktemp) + +# Pretty print string (Red if FAILED or green if SUCCESS) +# $1: string to pretty print +pretty_print() { + if [ "$1" = "SUCCESS" ] + then + # green + color="32" + else + # red + color="31" + fi + + printf "\033[0;${color}m**$1**\033[m $2\n" +} + +# Verify that the partition exist and has the given type/name +# $1: Partition type to verify (ex.: 8300) +# $2: Partition name to verify (ex.: Linux filesystem) +# $3: Text to print +verify_part() { + partition=$($GDISK_BIN -l $TEMP_DISK | tail -n 1) + echo $partition | grep -q "$1[[:space:]]$2$" + + if [ $? -eq 0 ] + then + pretty_print "SUCCESS" "$3" + else + pretty_print "FAILED" "$3" + exit 1 + fi +} + + +##################################### +# Get GUID of disk +##################################### +get_diskguid() { + DISK_GUID=$($GDISK_BIN -l $TEMP_DISK | grep "^Disk identifier (GUID):" | awk '{print $4}') + return $DISK_GUID +} + + +##################################### +# Create a new empty table +##################################### +create_table() { + case $1 in + gdisk) + $GDISK_BIN $TEMP_DISK << EOF +$OPT_CLEAR +Y +w +Y +EOF + + ret=$? + if [ $ret -ne 0 ] + then + pretty_print "FAILED" "gdisk return $ret when creating partition table" + exit 1 + fi + ;; + sgdisk) + $SGDISK_BIN $TEMP_DISK -${OPT_CLEAR} + + ret=$? + if [ $ret -ne 0 ] + then + pretty_print "FAILED" "sgdisk return $ret when creating partition table" + exit 1 + fi + ;; + esac + + # verify that the table is empty + # only the columns should appear in the table + verify_part "Code" "Name" "Create new empty GPT table" + echo "" +} + + + +##################################### +# First create a new partition +##################################### +create_partition() { + case $1 in + gdisk) + $GDISK_BIN $TEMP_DISK << EOF +$OPT_NEW +1 + + +$TEST_PART_TYPE +w +Y +EOF + ;; + + sgdisk) + $SGDISK_BIN $TEMP_DISK -${OPT_NEW} 1 -${OPT_CHANGE_NAME} 1:"${TEST_PART_DEFAULT_NAME}" -${OPT_CHANGE_TYPE} 1:$TEST_PART_TYPE + ;; + esac + + verify_part "$TEST_PART_TYPE" "$TEST_PART_DEFAULT_NAME" "Create new partition" + echo "" +} + + +##################################### +# Change name of partition +##################################### +change_partition_name() { + case $1 in + gdisk) + $GDISK_BIN $TEMP_DISK << EOF +$OPT_CHANGE_NAME +$TEST_PART_NEWNAME +w +Y +EOF + ;; + + sgdisk) + $SGDISK_BIN $TEMP_DISK -${OPT_CHANGE_NAME} 1:${TEST_PART_NEWNAME} + ;; + esac + + verify_part "$TEST_PART_TYPE" "$TEST_PART_NEWNAME" "Change partition 1 name ($TEST_PART_DEFAULT_NAME -> $TEST_PART_NEWNAME)" + echo "" +} + + +change_partition_type() { +##################################### +# Change type of partition +##################################### + case $1 in + gdisk) + $GDISK_BIN $TEMP_DISK << EOF +$OPT_CHANGE_TYPE +$TEST_PART_NEWTYPE +w +Y +EOF + ;; + + sgdisk) + $SGDISK_BIN $TEMP_DISK -${OPT_CHANGE_TYPE} 1:${TEST_PART_NEWTYPE} + ;; + esac + + verify_part "$TEST_PART_NEWTYPE" "$TEST_PART_NEWNAME" "Change partition 1 type ($TEST_PART_TYPE -> $TEST_PART_NEWTYPE)" + echo "" +} + + +##################################### +# Backup GPT data to file +##################################### +backup_table() { + case $1 in + gdisk) + $GDISK_BIN $TEMP_DISK << EOF +$OPT_BACKUP +$GPT_BACKUP_FILENAME +q +EOF +echo "" + ;; + + sgdisk) + $SGDISK_BIN $TEMP_DISK -${OPT_BACKUP} ${GPT_BACKUP_FILENAME} + ;; + esac + + # if exist and not empty; we will test it after + if [ -s $GPT_BACKUP_FILENAME ] + then + pretty_print "SUCCESS" "GPT data backuped sucessfully" + else + pretty_print "FAILED" "Unable to create GPT backup file !" + exit 1 + fi +} + + +##################################### +# Now, we can delete the partition +##################################### +delete_partition() { + case $1 in + gdisk) + $GDISK_BIN $TEMP_DISK << EOF +$OPT_DELETE +w +Y +EOF + ;; + + sgdisk) + $SGDISK_BIN $TEMP_DISK -${OPT_DELETE} 1 + ;; + esac + + # verify that the table is empty (just one partition): + # only the columns should appear in the table + verify_part "Code" "Name" "Delete partition 1" + echo "" +} + + +##################################### +# Restore GPT table +##################################### +restore_table() { + $GDISK_BIN $TEMP_DISK << EOF +r +r +l +$GPT_BACKUP_FILENAME +w +Y +EOF + + verify_part "$TEST_PART_NEWTYPE" "$TEST_PART_NEWNAME" "Restore the GPT backup" + echo "" +} + + +##################################### +# Change UID of disk +##################################### +change_disk_uid() { + + # get UID of disk before changing it + GUID=get_diskguid + + + case $1 in + gdisk) + $GDISK_BIN $TEMP_DISK << EOF +x +g +R +w +Y +EOF + ;; + + sgdisk) + $SGDISK_BIN $TEMP_DISK -U=R + ;; + esac + + # get GUID after change + NEW_DISK_GUID=get_diskguid + + # compare them + if [ "$DISK_GUID" != "$NEW_DISK_GUID" ] + then + pretty_print "SUCCESS" "GUID of disk has been sucessfully changed" + else + pretty_print "FAILED" "GUID of disk is the same as the previous one" + exit 1 + fi +} + +##################################### +# Wipe GPT table +##################################### +wipe_table() { + case $1 in + gdisk) + $GDISK_BIN $TEMP_DISK << EOF +x +$OPT_ZAP +Y +Y +EOF + ;; + + sgdisk) + $SGDISK_BIN $TEMP_DISK -${OPT_ZAP} + esac + + # verify that the table is empty (just one partition): + # only the columns should appear in the table + verify_part "Code" "Name" "Wipe GPT table" + echo "" +} + +##################################### +# Test stdin EOF +##################################### +eof_stdin() { + $SGDISK_BIN $TEMP_DISK << EOF +^D +EOF + pretty_print "SUCCESS" "EOF successfully exit gdisk" +} + +################################### +# Main +################################### + +# create a file to simulate a real device +dd if=/dev/zero of=$TEMP_DISK bs=1024 count=$TEMP_DISK_SIZE > /dev/null 2>&1 + +if [ -s $TEMP_DISK ] +then + pretty_print "SUCCESS" "Temp disk sucessfully created" +else + pretty_print "FAILED" "Unable to create temp disk !" + exit 1 +fi + +# test gdisk and sgdisk +for binary in gdisk sgdisk +do + echo "" + printf "\033[0;34m**Testing $binary binary**\033[m\n" + echo "" + create_table "$binary" + create_partition "$binary" + change_partition_name "$binary" + change_partition_type "$binary" + backup_table "$binary" + delete_partition "$binary" + restore_table # only with gdisk + change_disk_uid "$binary" + wipe_table "$binary" + eof_stdin # only with gdisk +done + +# remove temp files +rm -f $TEMP_DISK $GPT_BACKUP_FILENAME + +exit 0 diff --git a/tests/tests.yml b/tests/tests.yml new file mode 100644 index 0000000..6c16caa --- /dev/null +++ b/tests/tests.yml @@ -0,0 +1,11 @@ +- hosts: localhost + roles: + - role: standard-test-beakerlib + tags: + - atomic + - classic + - container + tests: + - upstream-tests + required_packages: + - gdisk diff --git a/tests/upstream-tests b/tests/upstream-tests new file mode 100755 index 0000000..7b1a81a --- /dev/null +++ b/tests/upstream-tests @@ -0,0 +1,26 @@ +#!/bin/bash + +. /usr/share/beakerlib/beakerlib.sh + +TEST="/AppStream/gdisk/Sanity/upstream-tests" + +PACKAGES=${PACKAGES:-"gdisk"} + +rlJournalStart + rlPhaseStartSetup + rlAssertRpm --all + rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory" + rlRun "cp -r gdisk/* $TmpDir/." 0 "Copying test suite" + rlRun "pushd $TmpDir" + rlPhaseEnd + + rlPhaseStartTest + rlRun "/bin/sh gdisk_test.sh" 0 "Running tests" + rlPhaseEnd + + rlPhaseStartCleanup + rlRun "popd" + rlRun "rm -r $TmpDir" 0 "Removing tmp directory" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd