From 221da70d5a70a46e1ddec4a93129293c90d26bdb Mon Sep 17 00:00:00 2001 From: Jan Kubalek Date: Thu, 4 Apr 2024 21:58:54 +0200 Subject: [PATCH 1/2] Better LSB release --- tools/lsb_release/main.go | 50 +++++++++++++------ tools/lsb_release/main_test.go | 42 ++++++++++++++++ tools/lsb_release/test_data/lsb_release.txt | 2 + .../test_data/lsb_release_1804.txt | 4 ++ .../test_data/lsb_release_broken.txt | 2 + 5 files changed, 84 insertions(+), 16 deletions(-) create mode 100644 tools/lsb_release/main_test.go create mode 100644 tools/lsb_release/test_data/lsb_release.txt create mode 100644 tools/lsb_release/test_data/lsb_release_1804.txt create mode 100644 tools/lsb_release/test_data/lsb_release_broken.txt diff --git a/tools/lsb_release/main.go b/tools/lsb_release/main.go index 8c56631..1f27178 100644 --- a/tools/lsb_release/main.go +++ b/tools/lsb_release/main.go @@ -8,8 +8,8 @@ import ( "os" "path" "path/filepath" + "reflect" "regexp" - "strconv" ) // CmdLineArgs @@ -19,10 +19,11 @@ import ( // - build package (package mode) // Exactly one of these modes can be active in a time. type CmdLineArgs struct { - FlagR *bool - FlagS *bool - FlagI *bool - parser *argparse.Parser + FlagR *bool + FlagS *bool + FlagI *bool + FlagValidate *bool + parser *argparse.Parser } func (cmd *CmdLineArgs) InitFlags() { @@ -45,6 +46,12 @@ func (cmd *CmdLineArgs) InitFlags() { Help: "i", }, ) + cmd.FlagValidate = cmd.parser.Flag("", "validate", + &argparse.Options{ + Required: false, + Help: "Validate the input file", + }, + ) } func (cmd *CmdLineArgs) ParseArgs(args []string) error { @@ -57,11 +64,11 @@ func (cmd *CmdLineArgs) ParseArgs(args []string) error { } type DataStruct struct { - ReleaseNumber int + ReleaseNumber string DistributorID string } -func (data *DataStruct) ReadFromFile(filePath string) { +func (data *DataStruct) ReadFromFile(filePath string, validate bool) { var err error file, err := os.Open(filePath) @@ -72,16 +79,27 @@ func (data *DataStruct) ReadFromFile(filePath string) { parseStruct := map[string]func(string){ "^Distributor ID:\t([^\t]+)$": func(s string) { data.DistributorID = s }, - "^Release:\t([^\t]+)$": func(s string) { data.ReleaseNumber, _ = strconv.Atoi(s) }, + "^Release:\t([^\t]+)$": func(s string) { data.ReleaseNumber = s }, } scanner := bufio.NewScanner(file) - for k, callback := range parseStruct { - if !scanner.Scan() { - log.Fatal("cannot scan next line in the input file") + keys := reflect.ValueOf(parseStruct).MapKeys() + + for scanner.Scan() { + line := scanner.Text() + handled := false + for _, key := range keys { + keyString := key.String() + data := parseLine(line, keyString) + if data != "" { + parseStruct[keyString](data) + handled = true + break + } + } + if validate && !handled { + log.Fatalf("Cannot parse line '%s'", line) } - data := parseLine(scanner.Text(), k) - callback(data) } } @@ -92,7 +110,7 @@ func parseLine(line string, regexpStr string) string { } subMatch := regex.FindStringSubmatch(line) if subMatch == nil { - log.Fatalf("Cannot parse '%s' from '%s'", regexpStr, line) + return "" } return subMatch[1] } @@ -115,7 +133,7 @@ func main() { filePath := path.Join(exPath, "lsb_release.txt") var lsbReleaseData DataStruct - lsbReleaseData.ReadFromFile(filePath) + lsbReleaseData.ReadFromFile(filePath, *args.FlagValidate) if *args.FlagS == true { if *args.FlagI { @@ -129,7 +147,7 @@ func main() { fmt.Printf("Distributor ID:\t%s\n", lsbReleaseData.DistributorID) } if *args.FlagR { - fmt.Printf("Release:\t%d\n", lsbReleaseData.ReleaseNumber) + fmt.Printf("Release:\t%s\n", lsbReleaseData.ReleaseNumber) } } } diff --git a/tools/lsb_release/main_test.go b/tools/lsb_release/main_test.go new file mode 100644 index 0000000..99eefea --- /dev/null +++ b/tools/lsb_release/main_test.go @@ -0,0 +1,42 @@ +package main + +import "testing" + +func lsb_release_test(distId string, relNumber string, validate bool, file string, t *testing.T) { + data := DataStruct{} + + data.ReadFromFile(file, validate) + if data.DistributorID != distId { + t.Errorf("Distributor ID is not %s", distId) + } + if data.ReleaseNumber != relNumber { + t.Errorf("Release number is not %s", relNumber) + } +} + +func Test_lsb_release_multipledigit(t *testing.T) { + lsb_release_test("Ubuntu", "18.04", false, "test_data/lsb_release_ubuntu1804.txt", t) +} + +func Test_lsb_release_digit(t *testing.T) { + lsb_release_test("Debian", "11", false, "test_data/lsb_release.txt", t) +} + +func Test_lsb_release_validate_ok(t *testing.T) { + lsb_release_test("Debian", "11", true, "test_data/lsb_release.txt", t) + lsb_release_test("Ubuntu", "18.04", true, "test_data/lsb_release_ubuntu1804.txt", t) +} + +func Test_lsb_release_validate_notok(t *testing.T) { + defer func() { + if r := recover(); r == nil { + t.Errorf("The code did not panic") + } + }() + lsb_release_test("Debian", "11", true, "test_data/lsb_release_broken.txt", t) +} + +func Test_lsb_release_validate_notok_nopanic(t *testing.T) { + data := DataStruct{} + data.ReadFromFile("test_data/lsb_release_broken.txt", false) +} diff --git a/tools/lsb_release/test_data/lsb_release.txt b/tools/lsb_release/test_data/lsb_release.txt new file mode 100644 index 0000000..b2e5577 --- /dev/null +++ b/tools/lsb_release/test_data/lsb_release.txt @@ -0,0 +1,2 @@ +Distributor ID: Debian +Release: 11 diff --git a/tools/lsb_release/test_data/lsb_release_1804.txt b/tools/lsb_release/test_data/lsb_release_1804.txt new file mode 100644 index 0000000..3e6268d --- /dev/null +++ b/tools/lsb_release/test_data/lsb_release_1804.txt @@ -0,0 +1,4 @@ +Distributor ID: Ubuntu +Description: Ubuntu GNU/Linux 18.04 (Bionic Beaver) +Release: 18.04 +Codename: Bionic Beaver \ No newline at end of file diff --git a/tools/lsb_release/test_data/lsb_release_broken.txt b/tools/lsb_release/test_data/lsb_release_broken.txt new file mode 100644 index 0000000..aea9016 --- /dev/null +++ b/tools/lsb_release/test_data/lsb_release_broken.txt @@ -0,0 +1,2 @@ +Distributor ID : Debian +Release: 11 From 8c2546b628ebb1f580512e39bd4b5648070554d4 Mon Sep 17 00:00:00 2001 From: Jan Kubalek Date: Thu, 4 Apr 2024 22:03:25 +0200 Subject: [PATCH 2/2] Version updated to v0.3.1 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index c7f75a7..320f703 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -version=0.3.0 \ No newline at end of file +version=0.3.1 \ No newline at end of file