diff --git a/internal/ota/ota.go b/internal/ota/ota.go index 272a5414..137ce023 100644 --- a/internal/ota/ota.go +++ b/internal/ota/ota.go @@ -311,13 +311,27 @@ func (s *State) checkUpdateStatus( appUpdateStatus.available = false } - // Handle custom target versions - if slices.Contains(params.Components, "app") && params.AppTargetVersion != "" { - appUpdateStatus.available = appVersionRemote.String() != appUpdateStatus.localVersion + components := params.Components + // skip check if no components are specified + if len(components) == 0 { + return nil } - if slices.Contains(params.Components, "system") && params.SystemTargetVersion != "" { - systemUpdateStatus.available = systemVersionRemote.String() != systemUpdateStatus.localVersion + // TODO: simplify this + if slices.Contains(components, "app") { + if params.AppTargetVersion != "" { + appUpdateStatus.available = appVersionRemote.String() != appVersionLocal.String() + } + } else { + appUpdateStatus.available = false + } + + if slices.Contains(components, "system") { + if params.SystemTargetVersion != "" { + systemUpdateStatus.available = systemVersionRemote.String() != systemVersionLocal.String() + } + } else { + systemUpdateStatus.available = false } return nil diff --git a/internal/ota/ota_test.go b/internal/ota/ota_test.go new file mode 100644 index 00000000..7a82b43e --- /dev/null +++ b/internal/ota/ota_test.go @@ -0,0 +1,58 @@ +package ota + +import ( + "context" + "net/http" + "os" + "testing" + "time" + + "github.com/Masterminds/semver/v3" + "github.com/rs/zerolog" + "github.com/stretchr/testify/assert" +) + +func pseudoGetLocalVersion() (systemVersion *semver.Version, appVersion *semver.Version, err error) { + systemVersion = semver.MustParse("0.2.5") + appVersion = semver.MustParse("0.4.7") + return systemVersion, appVersion, nil +} + +func newOtaState() *State { + logger := zerolog.New(os.Stdout).Level(zerolog.TraceLevel) + otaState := NewState(Options{ + SkipConfirmSystem: true, + Logger: &logger, + ReleaseAPIEndpoint: "https://api.jetkvm.com/releases", + GetHTTPClient: func() *http.Client { + transport := http.DefaultTransport.(*http.Transport).Clone() + client := &http.Client{ + Transport: transport, + } + return client + }, + GetLocalVersion: pseudoGetLocalVersion, + HwReboot: func(force bool, postRebootAction *PostRebootAction, delay time.Duration) error { return nil }, + ResetConfig: func() error { return nil }, + OnStateUpdate: func(state *RPCState) {}, + OnProgressUpdate: func(progress float32) {}, + }) + return otaState +} + +func TestCheckUpdateComponents(t *testing.T) { + otaState := newOtaState() + updateParams := UpdateParams{ + DeviceID: "test", + IncludePreRelease: false, + SystemTargetVersion: "0.2.2", + Components: []string{"system"}, + } + info, err := otaState.GetUpdateStatus(context.Background(), updateParams) + t.Logf("update status: %+v", info) + if err != nil { + t.Fatalf("failed to check update: %v", err) + } + assert.True(t, info.SystemUpdateAvailable) + assert.False(t, info.AppUpdateAvailable) +} diff --git a/internal/ota/state.go b/internal/ota/state.go index d8aa4399..58618902 100644 --- a/internal/ota/state.go +++ b/internal/ota/state.go @@ -203,6 +203,7 @@ type Options struct { HwReboot HwRebootFunc ReleaseAPIEndpoint string ResetConfig ResetConfigFunc + SkipConfirmSystem bool } // NewState creates a new OTA state @@ -221,7 +222,9 @@ func NewState(opts Options) *State { releaseAPIEndpoint: opts.ReleaseAPIEndpoint, resetConfig: opts.ResetConfig, } - go s.confirmCurrentSystem() + if !opts.SkipConfirmSystem { + go s.confirmCurrentSystem() + } return s } diff --git a/ota.go b/ota.go index 44fe0cd3..56a67bcc 100644 --- a/ota.go +++ b/ota.go @@ -91,7 +91,7 @@ func getUpdateStatus(includePreRelease bool) (*ota.UpdateStatus, error) { updateStatus.Error = err.Error() } - logger.Info().Interface("updateStatus", updateStatus).Msg("Update status") + otaLogger.Info().Interface("updateStatus", updateStatus).Msg("Update status") return updateStatus, nil } @@ -189,7 +189,7 @@ func rpcTryUpdateComponents(params updateParams, includePreRelease bool, resetCo go func() { err := otaState.TryUpdate(context.Background(), updateParams) if err != nil { - logger.Warn().Err(err).Msg("failed to try update") + otaLogger.Warn().Err(err).Msg("failed to try update") } }() return nil