|
5 | 5 | "encoding/json" |
6 | 6 | "errors" |
7 | 7 | "os" |
| 8 | + "path/filepath" |
8 | 9 | "testing" |
9 | 10 |
|
10 | 11 | "github.com/docker/cli/cli/config/credentials" |
@@ -609,15 +610,46 @@ func TestParseEnvConfig(t *testing.T) { |
609 | 610 | } |
610 | 611 |
|
611 | 612 | func TestSave(t *testing.T) { |
612 | | - configFile := New("test-save") |
613 | | - defer os.Remove("test-save") |
614 | | - err := configFile.Save() |
| 613 | + err := New("").Save() |
| 614 | + assert.ErrorContains(t, err, "empty filename") |
| 615 | + |
| 616 | + configDir := t.TempDir() |
| 617 | + |
| 618 | + // MkdirAll fails due to the parent directory being read-only. |
| 619 | + err = os.Chmod(configDir, 0o500) // read-only |
615 | 620 | assert.NilError(t, err) |
616 | | - cfg, err := os.ReadFile("test-save") |
| 621 | + t.Cleanup(func() { |
| 622 | + _ = os.Chmod(configDir, 0o755) |
| 623 | + }) |
| 624 | + |
| 625 | + configFile := New(filepath.Join(configDir, "foo", "test-save")) |
| 626 | + err = configFile.Save() |
| 627 | + assert.Check(t, os.IsPermission(err)) |
| 628 | + |
| 629 | + // Successfully write an empty config. |
| 630 | + err = os.Chmod(configDir, 0o700) // writeable again |
| 631 | + assert.NilError(t, err) |
| 632 | + configFile = New(filepath.Join(configDir, "test-save")) |
| 633 | + err = configFile.Save() |
| 634 | + assert.NilError(t, err) |
| 635 | + cfg, err := os.ReadFile(configFile.Filename) |
617 | 636 | assert.NilError(t, err) |
618 | 637 | assert.Equal(t, string(cfg), `{ |
619 | 638 | "auths": {} |
620 | 639 | }`) |
| 640 | + |
| 641 | + // Create a permission denied error on the parent directory. |
| 642 | + err = os.Chmod(configDir, 0o500) // read-only |
| 643 | + assert.NilError(t, err) |
| 644 | + err = configFile.Save() |
| 645 | + assert.Check(t, os.IsPermission(err)) |
| 646 | + |
| 647 | + // Ensure we didn't leave anything temp file behind in our configDir and |
| 648 | + // still only have "test-save" in there. |
| 649 | + files, err := os.ReadDir(configDir) |
| 650 | + assert.NilError(t, err) |
| 651 | + assert.Check(t, is.Equal(len(files), 1)) |
| 652 | + assert.Check(t, is.Equal(files[0].Name(), "test-save")) |
621 | 653 | } |
622 | 654 |
|
623 | 655 | func TestSaveCustomHTTPHeaders(t *testing.T) { |
|
0 commit comments