Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Aug 30, 2024. It is now read-only.
/coder-v1-cliPublic archive

feat: Add update command to coder-cli#417

Merged
johnstcn merged 26 commits intomasterfromcianjohnston/autoupdate
Aug 17, 2021
Merged
Changes from1 commit
Commits
Show all changes
26 commits
Select commitHold shift + click to select a range
d256581
feat: Add update command to coder-cli
johnstcnAug 10, 2021
972847e
internal/cmd/update_test.go: refactor unit tests
johnstcnAug 13, 2021
597afe1
fixup! internal/cmd/update_test.go: refactor unit tests
johnstcnAug 13, 2021
1373e79
internal/cmd/update_test.go: more tests
johnstcnAug 13, 2021
513282a
internal/cmd/update_test.go: create dirs in memfs
johnstcnAug 13, 2021
5bf7f56
internal/cmd/update_test.go: test for windows
johnstcnAug 13, 2021
dabd178
fixup! internal/cmd/update_test.go: test for windows
johnstcnAug 13, 2021
dcfeec1
internal/cmd/update.go: replace semver library
johnstcnAug 13, 2021
0801cfc
internal/cmd/update.go: use /api/private/version instead of sniffing …
johnstcnAug 13, 2021
f6ce76f
gendocs
johnstcnAug 13, 2021
6371084
internal/cmd/update.go: use os.Executable() instead of os.Args[0]
johnstcnAug 13, 2021
bdb998e
internal/cmd/update.go: check path prefixes
johnstcnAug 13, 2021
306686c
lint
johnstcnAug 13, 2021
60a75a1
internal/cmd/update_test.go: assertCLIError helper function for clog.…
johnstcnAug 16, 2021
26984a2
internal/cmd/update.go: allow explicitly specifying version
johnstcnAug 16, 2021
bcaac7b
internal/cmd/update.go: validate we can exec new binary
johnstcnAug 16, 2021
2002876
fixup! internal/cmd/update.go: validate we can exec new binary
johnstcnAug 16, 2021
3ba1bed
internal/cmd/update.go: query github releases api for assets
johnstcnAug 16, 2021
6238053
internal/cmd/update.go: handle copy error from archive
johnstcnAug 17, 2021
24df4f7
internal/cmd/update.go: handle windows-specific behaviours
johnstcnAug 17, 2021
21dd836
fixup! internal/cmd/update.go: handle windows-specific behaviours
johnstcnAug 17, 2021
e064c47
fixup! internal/cmd/update.go: handle windows-specific behaviours
johnstcnAug 17, 2021
eefa2f3
gofmt
johnstcnAug 17, 2021
0e63d2f
internal/cmd/users_test.go: assert CICD user instead of admin
johnstcnAug 17, 2021
60944f0
Revert "internal/cmd/users_test.go: assert CICD user instead of admin"
johnstcnAug 17, 2021
c8943ed
Merge branch 'master' into cianjohnston/autoupdate
johnstcnAug 17, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
PrevPrevious commit
NextNext commit
internal/cmd/update_test.go: create dirs in memfs
  • Loading branch information
@johnstcn
johnstcn committedAug 13, 2021
commit513282af1c9b3ce47bdfea8446bc6579dfda9b1c
83 changes: 44 additions & 39 deletionsinternal/cmd/update_test.go
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@ import (
"net"
"net/http"
"os"
"path/filepath"
"strings"
"testing"

Expand All@@ -18,11 +19,11 @@ import (
)

const (
fakeExePath= "/coder"
fakeCoderURL = "https://my.cdr.dev"
fakeNewVersion = "1.23.4-rc.5+678-gabcdef-12345678"
fakeOldVersion = "1.22.4-rc.5+678-gabcdef-12345678"
fakeReleaseURL = "https://github.com/cdr/coder-cli/releases/download/v1.23.4/coder-cli-linux-amd64.tar.gz"
fakeExePathLinux= "/home/user/bin/coder"
fakeCoderURL= "https://my.cdr.dev"
fakeNewVersion= "1.23.4-rc.5+678-gabcdef-12345678"
fakeOldVersion= "1.22.4-rc.5+678-gabcdef-12345678"
fakeReleaseURL= "https://github.com/cdr/coder-cli/releases/download/v1.23.4/coder-cli-linux-amd64.tar.gz"
)

func Test_updater_run(t *testing.T) {
Expand DownExpand Up@@ -61,7 +62,7 @@ func Test_updater_run(t *testing.T) {
return "", nil
},
Ctx: ctx,
ExecutablePath:fakeExePath,
ExecutablePath:fakeExePathLinux,
Fakefs: fakefs,
HttpClient: newFakeGetter(t),
// This must be overridden inside run()
Expand All@@ -76,51 +77,51 @@ func Test_updater_run(t *testing.T) {
}

run(t, "update coder - noop", func(t *testing.T, p *params) {
fakeFile(t, p.Fakefs,fakeExePath, 0755, fakeNewVersion)
fakeFile(t, p.Fakefs,fakeExePathLinux, 0755, fakeNewVersion)
p.HttpClient.M[fakeCoderURL+"/api"] = newFakeGetterResponse([]byte{}, 401, variadicS("coder-version: "+fakeNewVersion), nil)
p.VersionF = func() string { return fakeNewVersion }
u := fromParams(p)
assertFileContent(t, p.Fakefs,fakeExePath, fakeNewVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeNewVersion)
err := u.Run(p.Ctx, false, fakeCoderURL)
assert.Success(t, "update coder - noop", err)
assertFileContent(t, p.Fakefs,fakeExePath, fakeNewVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeNewVersion)
})

run(t, "update coder - old to new", func(t *testing.T, p *params) {
fakeFile(t, p.Fakefs,fakeExePath, 0755, fakeOldVersion)
fakeFile(t, p.Fakefs,fakeExePathLinux, 0755, fakeOldVersion)
p.HttpClient.M[fakeCoderURL+"/api"] = newFakeGetterResponse([]byte{}, 401, variadicS("coder-version: "+fakeNewVersion), nil)
p.HttpClient.M[fakeReleaseURL] = newFakeGetterResponse(fakeValidTgzBytes, 200, variadicS(), nil)
p.VersionF = func() string { return fakeOldVersion }
p.ConfirmF = fakeConfirmYes
u := fromParams(p)
assertFileContent(t, p.Fakefs,fakeExePath, fakeOldVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeOldVersion)
err := u.Run(p.Ctx, false, fakeCoderURL)
assert.Success(t, "update coder - old to new", err)
assertFileContent(t, p.Fakefs,fakeExePath, fakeNewVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeNewVersion)
})

run(t, "update coder - old to new forced", func(t *testing.T, p *params) {
fakeFile(t, p.Fakefs,fakeExePath, 0755, fakeOldVersion)
fakeFile(t, p.Fakefs,fakeExePathLinux, 0755, fakeOldVersion)
p.HttpClient.M[fakeCoderURL+"/api"] = newFakeGetterResponse([]byte{}, 401, variadicS("coder-version: "+fakeNewVersion), nil)
p.HttpClient.M[fakeReleaseURL] = newFakeGetterResponse(fakeValidTgzBytes, 200, variadicS(), nil)
p.VersionF = func() string { return fakeOldVersion }
u := fromParams(p)
assertFileContent(t, p.Fakefs,fakeExePath, fakeOldVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeOldVersion)
err := u.Run(p.Ctx, true, fakeCoderURL)
assert.Success(t, "update coder - old to new forced", err)
assertFileContent(t, p.Fakefs,fakeExePath, fakeNewVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeNewVersion)
})

run(t, "update coder - user cancelled", func(t *testing.T, p *params) {
fakeFile(t, p.Fakefs,fakeExePath, 0755, fakeOldVersion)
fakeFile(t, p.Fakefs,fakeExePathLinux, 0755, fakeOldVersion)
p.HttpClient.M[fakeCoderURL+"/api"] = newFakeGetterResponse([]byte{}, 401, variadicS("coder-version: "+fakeNewVersion), nil)
p.VersionF = func() string { return fakeOldVersion }
p.ConfirmF = fakeConfirmNo
u := fromParams(p)
assertFileContent(t, p.Fakefs,fakeExePath, fakeOldVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeOldVersion)
err := u.Run(p.Ctx, false, fakeCoderURL)
assert.ErrorContains(t, "update coder - user cancelled", err, "failed to confirm update")
assertFileContent(t, p.Fakefs,fakeExePath, fakeOldVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeOldVersion)
})

run(t, "update coder - cannot stat", func(t *testing.T, p *params) {
Expand All@@ -130,87 +131,87 @@ func Test_updater_run(t *testing.T) {
})

run(t, "update coder - no permission", func(t *testing.T, p *params) {
fakeFile(t, p.Fakefs,fakeExePath, 0400, fakeOldVersion)
fakeFile(t, p.Fakefs,fakeExePathLinux, 0400, fakeOldVersion)
u := fromParams(p)
assertFileContent(t, p.Fakefs,fakeExePath, fakeOldVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeOldVersion)
err := u.Run(p.Ctx, false, fakeCoderURL)
assert.ErrorContains(t, "update coder - no permission", err, "missing write permission")
assertFileContent(t, p.Fakefs,fakeExePath, fakeOldVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeOldVersion)
})

run(t, "update coder - invalid url", func(t *testing.T, p *params) {
fakeFile(t, p.Fakefs,fakeExePath, 0755, fakeOldVersion)
fakeFile(t, p.Fakefs,fakeExePathLinux, 0755, fakeOldVersion)
p.VersionF = func() string { return fakeOldVersion }
u := fromParams(p)
assertFileContent(t, p.Fakefs,fakeExePath, fakeOldVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeOldVersion)
err := u.Run(p.Ctx, false, "h$$p://invalid.url")
assert.ErrorContains(t, "update coder - invalid url", err, "invalid coder URL")
assertFileContent(t, p.Fakefs,fakeExePath, fakeOldVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeOldVersion)
})

run(t, "update coder - fetch api version failure", func(t *testing.T, p *params) {
fakeFile(t, p.Fakefs,fakeExePath, 0755, fakeOldVersion)
fakeFile(t, p.Fakefs,fakeExePathLinux, 0755, fakeOldVersion)
p.HttpClient.M[fakeCoderURL+"/api"] = newFakeGetterResponse([]byte{}, 401, variadicS(), net.ErrClosed)
p.VersionF = func() string { return fakeOldVersion }
u := fromParams(p)
assertFileContent(t, p.Fakefs,fakeExePath, fakeOldVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeOldVersion)
err := u.Run(p.Ctx, false, fakeCoderURL)
assert.ErrorContains(t, "update coder - fetch api version failure", err, "fetch api version")
assertFileContent(t, p.Fakefs,fakeExePath, fakeOldVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeOldVersion)
})

run(t, "update coder - failed to fetch URL", func(t *testing.T, p *params) {
fakeFile(t, p.Fakefs,fakeExePath, 0755, fakeOldVersion)
fakeFile(t, p.Fakefs,fakeExePathLinux, 0755, fakeOldVersion)
p.HttpClient.M[fakeCoderURL+"/api"] = newFakeGetterResponse([]byte{}, 401, variadicS("coder-version: "+fakeNewVersion), nil)
p.HttpClient.M[fakeReleaseURL] = newFakeGetterResponse([]byte{}, 0, variadicS(), net.ErrClosed)
p.VersionF = func() string { return fakeOldVersion }
p.ConfirmF = fakeConfirmYes
u := fromParams(p)
assertFileContent(t, p.Fakefs,fakeExePath, fakeOldVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeOldVersion)
err := u.Run(p.Ctx, false, fakeCoderURL)
assert.ErrorContains(t, "update coder - release URL 404", err, "failed to fetch URL")
assertFileContent(t, p.Fakefs,fakeExePath, fakeOldVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeOldVersion)
})

run(t, "update coder - release URL 404", func(t *testing.T, p *params) {
fakeFile(t, p.Fakefs,fakeExePath, 0755, fakeOldVersion)
fakeFile(t, p.Fakefs,fakeExePathLinux, 0755, fakeOldVersion)
p.HttpClient.M[fakeCoderURL+"/api"] = newFakeGetterResponse([]byte{}, 401, variadicS("coder-version: "+fakeNewVersion), nil)
p.HttpClient.M[fakeReleaseURL] = newFakeGetterResponse([]byte{}, 404, variadicS(), nil)
p.VersionF = func() string { return fakeOldVersion }
p.ConfirmF = fakeConfirmYes
u := fromParams(p)
assertFileContent(t, p.Fakefs,fakeExePath, fakeOldVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeOldVersion)
err := u.Run(p.Ctx, false, fakeCoderURL)
assert.ErrorContains(t, "update coder - release URL 404", err, "failed to fetch release")
assertFileContent(t, p.Fakefs,fakeExePath, fakeOldVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeOldVersion)
})

run(t, "update coder - invalid archive", func(t *testing.T, p *params) {
fakeFile(t, p.Fakefs,fakeExePath, 0755, fakeOldVersion)
fakeFile(t, p.Fakefs,fakeExePathLinux, 0755, fakeOldVersion)
p.HttpClient.M[fakeCoderURL+"/api"] = newFakeGetterResponse([]byte{}, 401, variadicS("coder-version: "+fakeNewVersion), nil)
p.HttpClient.M[fakeReleaseURL] = newFakeGetterResponse([]byte{}, 200, variadicS(), nil)
p.VersionF = func() string { return fakeOldVersion }
p.ConfirmF = fakeConfirmYes
u := fromParams(p)
assertFileContent(t, p.Fakefs,fakeExePath, fakeOldVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeOldVersion)
err := u.Run(p.Ctx, false, fakeCoderURL)
assert.ErrorContains(t, "update coder - invalid archive", err, "failed to extract coder binary from archive")
assertFileContent(t, p.Fakefs,fakeExePath, fakeOldVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeOldVersion)
})

run(t, "update coder - read-only fs", func(t *testing.T, p *params) {
rwfs := p.Fakefs
p.Fakefs = afero.NewReadOnlyFs(rwfs)
fakeFile(t, rwfs,fakeExePath, 0755, fakeOldVersion)
fakeFile(t, rwfs,fakeExePathLinux, 0755, fakeOldVersion)
p.HttpClient.M[fakeCoderURL+"/api"] = newFakeGetterResponse([]byte{}, 401, variadicS("coder-version: "+fakeNewVersion), nil)
p.HttpClient.M[fakeReleaseURL] = newFakeGetterResponse(fakeValidTgzBytes, 200, variadicS(), nil)
p.VersionF = func() string { return fakeOldVersion }
p.ConfirmF = fakeConfirmYes
u := fromParams(p)
assertFileContent(t, p.Fakefs,fakeExePath, fakeOldVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeOldVersion)
err := u.Run(p.Ctx, false, fakeCoderURL)
assert.ErrorContains(t, "update coder - read-only fs", err, "failed to create file")
assertFileContent(t, p.Fakefs,fakeExePath, fakeOldVersion)
assertFileContent(t, p.Fakefs,fakeExePathLinux, fakeOldVersion)
})
}

Expand DownExpand Up@@ -278,6 +279,10 @@ func fakeConfirmNo(_ string) (string, error) {
//nolint:unparam
func fakeFile(t *testing.T, fs afero.Fs, name string, perm fs.FileMode, content string) {
t.Helper()
err := fs.MkdirAll(filepath.Dir(name), 0750)
if err != nil {
panic(err)
}
f, err := fs.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, perm)
if err != nil {
panic(err)
Expand Down

[8]ページ先頭

©2009-2025 Movatter.jp