X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=cmd%2Fsafcm%2Fmain_sync_test.go;h=642e9839e79017dc8fe403405e4f71505aca5919;hb=HEAD;hp=1f53e4b338902d8f243053752a852d4b1929cc5a;hpb=79a01721cf86d424dbf76ce91d8fa66fbff2f480;p=safcm%2Fsafcm.git diff --git a/cmd/safcm/main_sync_test.go b/cmd/safcm/main_sync_test.go index 1f53e4b..642e983 100644 --- a/cmd/safcm/main_sync_test.go +++ b/cmd/safcm/main_sync_test.go @@ -1,17 +1,5 @@ -// Copyright (C) 2021 Simon Ruderich -// -// 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 3 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, see . +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright (C) 2021-2024 Simon Ruderich package main_test @@ -26,7 +14,7 @@ import ( "testing" "time" - ft "ruderich.org/simon/safcm/cmd/safcm-remote/sync/filetest" + ft "ruderich.org/simon/safcm/remote/sync/filetest" "ruderich.org/simon/safcm/testutil" ) @@ -35,7 +23,7 @@ func TestSyncSshEndToEnd(t *testing.T) { if err != nil { t.Fatal(err) } - defer os.Chdir(cwd) + defer os.Chdir(cwd) //nolint:errcheck var suffix string // Needs different options in sshd_config @@ -56,7 +44,7 @@ func TestSyncSshEndToEnd(t *testing.T) { if err != nil { t.Fatal(err) } - defer sshCmd.Process.Kill() + defer sshCmd.Process.Kill() //nolint:errcheck // Wait until SSH server is ready (up to 30 seconds) for i := 0; i < 30; i++ { @@ -177,14 +165,13 @@ func TestSyncSshEndToEnd(t *testing.T) { `[info] [no-changes.example.org] remote helper upload in progress [verbose] [no-changes.example.org] host groups: all no-changes.example.org [verbose] [no-changes.example.org] host group priorities (descending): no-changes.example.org -[debug] [no-changes.example.org] sync remote: files: "/" (no-changes.example.org): unchanged -[debug] [no-changes.example.org] sync remote: files: "/etc" (no-changes.example.org): unchanged -[debug] [no-changes.example.org] sync remote: files: "/tmp" (no-changes.example.org): unchanged +[debug] [no-changes.example.org] files: "/" (no-changes.example.org): unchanged +[debug] [no-changes.example.org] files: "/etc" (no-changes.example.org): unchanged +[debug] [no-changes.example.org] files: "/tmp" (no-changes.example.org): unchanged [info] [no-changes.example.org] no changes `, nil, }, - { "no changes", skipUnlessCiRun, @@ -203,13 +190,145 @@ func TestSyncSshEndToEnd(t *testing.T) { `[info] [no-changes.example.org] remote helper upload in progress [verbose] [no-changes.example.org] host groups: all no-changes.example.org [verbose] [no-changes.example.org] host group priorities (descending): no-changes.example.org -[debug] [no-changes.example.org] sync remote: files: "/" (no-changes.example.org): unchanged -[debug] [no-changes.example.org] sync remote: files: "/etc" (no-changes.example.org): unchanged -[debug] [no-changes.example.org] sync remote: files: "/tmp" (no-changes.example.org): unchanged +[debug] [no-changes.example.org] files: "/" (no-changes.example.org): unchanged +[debug] [no-changes.example.org] files: "/etc" (no-changes.example.org): unchanged +[debug] [no-changes.example.org] files: "/tmp" (no-changes.example.org): unchanged [info] [no-changes.example.org] no changes `, nil, }, + + { + "no effect commands (dry-run)", + false, + true, + []string{"-n", "no-effect-commands.example.org"}, + `[info] [no-effect-commands.example.org] remote helper upload in progress +[info] [no-effect-commands.example.org] +will execute 2 command(s): (dry-run) +"echo this is a command" +"true" +`, + nil, + }, + { + "no effect commands (dry-run)", + false, + true, + []string{"-n", "-log", "debug2", "no-effect-commands.example.org"}, + `[info] [no-effect-commands.example.org] remote helper upload in progress +[verbose] [no-effect-commands.example.org] host groups: all no-effect-commands.example.org +[verbose] [no-effect-commands.example.org] host group priorities (descending): no-effect-commands.example.org +[info] [no-effect-commands.example.org] +will execute 2 command(s): (dry-run) +"echo this is a command" +"true" +`, + nil, + }, + { + "no effect commands", + false, + true, + []string{"no-effect-commands.example.org"}, + `[info] [no-effect-commands.example.org] remote helper upload in progress +[info] [no-effect-commands.example.org] +executed 2 command(s): +"echo this is a command": + > this is a command +"true" +`, + nil, + }, + { + "no effect commands (debug2)", + false, + true, + []string{"-log", "debug2", "no-effect-commands.example.org"}, + `[info] [no-effect-commands.example.org] remote helper upload in progress +[verbose] [no-effect-commands.example.org] host groups: all no-effect-commands.example.org +[verbose] [no-effect-commands.example.org] host group priorities (descending): no-effect-commands.example.org +[verbose] [no-effect-commands.example.org] commands: running "/bin/sh" "-c" "echo this is a command" (no-effect-commands.example.org) +[debug2] [no-effect-commands.example.org] commands: command output: +this is a command +[verbose] [no-effect-commands.example.org] commands: running "/bin/sh" "-c" "true" (no-effect-commands.example.org) +[info] [no-effect-commands.example.org] +executed 2 command(s): +"echo this is a command": + > this is a command +"true" +`, + nil, + }, + + { + "no effect commands failing (dry-run)", + false, + true, + []string{"-n", "no-effect-commands-failing.example.org"}, + `[info] [no-effect-commands-failing.example.org] remote helper upload in progress +[info] [no-effect-commands-failing.example.org] +will execute 2 command(s): (dry-run) +"echo this is a command" +"echo failing; false" +`, + nil, + }, + { + "no effect commands failing (dry-run)", + false, + true, + []string{"-n", "-log", "debug2", "no-effect-commands-failing.example.org"}, + `[info] [no-effect-commands-failing.example.org] remote helper upload in progress +[verbose] [no-effect-commands-failing.example.org] host groups: all no-effect-commands-failing.example.org +[verbose] [no-effect-commands-failing.example.org] host group priorities (descending): no-effect-commands-failing.example.org +[info] [no-effect-commands-failing.example.org] +will execute 2 command(s): (dry-run) +"echo this is a command" +"echo failing; false" +`, + nil, + }, + { + "no effect commands failing", + false, + true, + []string{"no-effect-commands-failing.example.org"}, + `[info] [no-effect-commands-failing.example.org] remote helper upload in progress +[info] [no-effect-commands-failing.example.org] +executed 2 command(s): +"echo this is a command": + > this is a command +"echo failing; false", failed: "exit status 1": + > failing +[error] [no-effect-commands-failing.example.org] commands: "echo failing; false" failed: exit status 1 +`, + fmt.Errorf("exit status 1"), + }, + { + "no effect commands failing (debug2)", + false, + true, + []string{"-log", "debug2", "no-effect-commands-failing.example.org"}, + `[info] [no-effect-commands-failing.example.org] remote helper upload in progress +[verbose] [no-effect-commands-failing.example.org] host groups: all no-effect-commands-failing.example.org +[verbose] [no-effect-commands-failing.example.org] host group priorities (descending): no-effect-commands-failing.example.org +[verbose] [no-effect-commands-failing.example.org] commands: running "/bin/sh" "-c" "echo this is a command" (no-effect-commands-failing.example.org) +[debug2] [no-effect-commands-failing.example.org] commands: command output: +this is a command +[verbose] [no-effect-commands-failing.example.org] commands: running "/bin/sh" "-c" "echo failing; false" (no-effect-commands-failing.example.org) +[debug2] [no-effect-commands-failing.example.org] commands: command output: +failing +[info] [no-effect-commands-failing.example.org] +executed 2 command(s): +"echo this is a command": + > this is a command +"echo failing; false", failed: "exit status 1": + > failing +[error] [no-effect-commands-failing.example.org] commands: "echo failing; false" failed: exit status 1 +`, + fmt.Errorf("exit status 1"), + }, } remotePath := fmt.Sprintf("/tmp/safcm-remote-%d", os.Getuid()) @@ -217,6 +336,20 @@ func TestSyncSshEndToEnd(t *testing.T) { logRegexp := regexp.MustCompile(`^\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2} `) detectedRegexp := regexp.MustCompile(`detected_\S+`) + t.Run("error before connection is established", func(t *testing.T) { + // Fake $PATH so safcm cannot find the `ssh` binary. + path := os.Getenv("PATH") + os.Setenv("PATH", "") + defer os.Setenv("PATH", path) + + cmd := exec.Command("../../../../../safcm", + "sync", "-n", "no-settings.example.org") + _, err := cmd.CombinedOutput() + if err == nil { + t.Errorf("err = nil") + } + }) + for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { if tc.remove {