Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
438 changes: 438 additions & 0 deletions helpers_test.go

Large diffs are not rendered by default.

176 changes: 176 additions & 0 deletions iautomaticupdates_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
//go:build windows
// +build windows

/*
Copyright 2022 Zheng Dayu
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package windowsupdate

import (
"testing"

"github.com/go-ole/go-ole"
)

func TestToIAutomaticUpdatesResults_NilDispatch(t *testing.T) {
result, err := toIAutomaticUpdatesResults(nil)
if err != nil {
t.Errorf("expected no error for nil dispatch, got %v", err)
}
if result != nil {
t.Errorf("expected nil result for nil dispatch, got %v", result)
}
}

func TestIAutomaticUpdates_StructureFields(t *testing.T) {
au := &IAutomaticUpdates{
ServiceEnabled: true,
}
if !au.ServiceEnabled {
t.Errorf("ServiceEnabled not set correctly")
}
}

// COM tests
func TestNewAutomaticUpdates(t *testing.T) {
ole.CoInitialize(0)
defer ole.CoUninitialize()

au, err := NewAutomaticUpdates()
if err != nil {
t.Fatalf("NewAutomaticUpdates failed: %v", err)
}
if au == nil {
t.Fatal("NewAutomaticUpdates returned nil")
}
if au.disp == nil {
t.Fatal("disp is nil")
}
}

func TestIAutomaticUpdates_DetectNow(t *testing.T) {
ole.CoInitialize(0)
defer ole.CoUninitialize()

au, err := NewAutomaticUpdates()
if err != nil {
t.Fatalf("NewAutomaticUpdates failed: %v", err)
}

err = au.DetectNow()
if err != nil {
t.Logf("DetectNow may fail if not elevated: %v", err)
}
}

func TestIAutomaticUpdates_EnableService(t *testing.T) {
ole.CoInitialize(0)
defer ole.CoUninitialize()

au, err := NewAutomaticUpdates()
if err != nil {
t.Fatalf("NewAutomaticUpdates failed: %v", err)
}

err = au.EnableService()
if err != nil {
t.Logf("EnableService may fail if not elevated: %v", err)
}
}

func TestIAutomaticUpdates_Pause(t *testing.T) {
ole.CoInitialize(0)
defer ole.CoUninitialize()

au, err := NewAutomaticUpdates()
if err != nil {
t.Fatalf("NewAutomaticUpdates failed: %v", err)
}

err = au.Pause()
if err != nil {
t.Logf("Pause may fail if not elevated: %v", err)
}
}

func TestIAutomaticUpdates_Resume(t *testing.T) {
ole.CoInitialize(0)
defer ole.CoUninitialize()

au, err := NewAutomaticUpdates()
if err != nil {
t.Fatalf("NewAutomaticUpdates failed: %v", err)
}

err = au.Resume()
if err != nil {
t.Logf("Resume may fail if not elevated: %v", err)
}
}

func TestIAutomaticUpdates_ShowSettingsDialog(t *testing.T) {
ole.CoInitialize(0)
defer ole.CoUninitialize()

au, err := NewAutomaticUpdates()
if err != nil {
t.Fatalf("NewAutomaticUpdates failed: %v", err)
}

// ShowSettingsDialog displays UI, so it may fail in automated/headless environments
// We call it to get coverage but don't fail the test if it errors
err = au.ShowSettingsDialog()
if err != nil {
t.Logf("ShowSettingsDialog failed (may be expected in automated tests): %v", err)
}
}

func TestIAutomaticUpdates_GetSettings(t *testing.T) {
ole.CoInitialize(0)
defer ole.CoUninitialize()

au, err := NewAutomaticUpdates()
if err != nil {
t.Fatalf("NewAutomaticUpdates failed: %v", err)
}

settings, err := au.GetSettings()
if err != nil {
t.Fatalf("GetSettings failed: %v", err)
}
if settings == nil {
t.Fatal("GetSettings returned nil")
}
if settings.disp == nil {
t.Fatal("settings.disp is nil")
}
}

func TestIAutomaticUpdates_GetResults(t *testing.T) {
ole.CoInitialize(0)
defer ole.CoUninitialize()

au, err := NewAutomaticUpdates()
if err != nil {
t.Fatalf("NewAutomaticUpdates failed: %v", err)
}

results, err := au.GetResults()
if err != nil {
t.Logf("GetResults may fail in some environments: %v", err)
return
}
if results != nil && results.disp == nil {
t.Error("results.disp is nil")
}
}
205 changes: 205 additions & 0 deletions iautomaticupdatessettings_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
//go:build windows
// +build windows

/*
Copyright 2022 Zheng Dayu
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package windowsupdate

import (
"testing"

"github.com/go-ole/go-ole"
)

func TestIAutomaticUpdatesSettings_StructureFields(t *testing.T) {
settings := &IAutomaticUpdatesSettings{
NotificationLevel: 2,
ReadOnly: false,
Required: true,
ScheduledInstallationDay: 1,
ScheduledInstallationTime: 3,
}
if settings.NotificationLevel != 2 {
t.Errorf("NotificationLevel not set correctly")
}
if settings.ReadOnly {
t.Errorf("ReadOnly should be false")
}
if !settings.Required {
t.Errorf("Required should be true")
}
if settings.ScheduledInstallationDay != 1 {
t.Errorf("ScheduledInstallationDay not set correctly")
}
if settings.ScheduledInstallationTime != 3 {
t.Errorf("ScheduledInstallationTime not set correctly")
}
}

// COM tests
func TestIAutomaticUpdatesSettings_Refresh(t *testing.T) {
ole.CoInitialize(0)
defer ole.CoUninitialize()

au, err := NewAutomaticUpdates()
if err != nil {
t.Fatalf("NewAutomaticUpdates failed: %v", err)
}

settings, err := au.GetSettings()
if err != nil {
// GetSettings may fail in some environments (e.g., policy restrictions)
t.Skipf("GetSettings failed (may be expected): %v", err)
}

err = settings.Refresh()
if err != nil {
// Refresh may fail in some environments (e.g., without admin rights or in CI)
t.Logf("Refresh failed (may be expected): %v", err)
}
}

func TestIAutomaticUpdatesSettings_Save(t *testing.T) {
ole.CoInitialize(0)
defer ole.CoUninitialize()

au, err := NewAutomaticUpdates()
if err != nil {
t.Fatalf("NewAutomaticUpdates failed: %v", err)
}

settings, err := au.GetSettings()
if err != nil {
// GetSettings may fail in some environments (e.g., policy restrictions)
t.Skipf("GetSettings failed (may be expected): %v", err)
}

if settings.ReadOnly {
t.Skip("Settings are read-only, skipping Save test")
}

// Save without changes - should not fail
err = settings.Save()
if err != nil {
t.Logf("Save may fail if not elevated: %v", err)
}
}

func TestIAutomaticUpdatesSettings_PutNotificationLevel(t *testing.T) {
ole.CoInitialize(0)
defer ole.CoUninitialize()

au, err := NewAutomaticUpdates()
if err != nil {
t.Fatalf("NewAutomaticUpdates failed: %v", err)
}

settings, err := au.GetSettings()
if err != nil {
// GetSettings may fail in some environments (e.g., policy restrictions)
t.Skipf("GetSettings failed (may be expected): %v", err)
}

if settings.ReadOnly {
t.Skip("Settings are read-only, skipping test")
}

oldLevel := settings.NotificationLevel
newLevel := int32(2)

err = settings.PutNotificationLevel(newLevel)
if err != nil {
t.Logf("PutNotificationLevel may fail if not elevated: %v", err)
return
}

if settings.NotificationLevel != newLevel {
t.Errorf("NotificationLevel = %d, want %d", settings.NotificationLevel, newLevel)
}

// Restore original value
_ = settings.PutNotificationLevel(oldLevel)
}

func TestIAutomaticUpdatesSettings_PutScheduledInstallationDay(t *testing.T) {
ole.CoInitialize(0)
defer ole.CoUninitialize()

au, err := NewAutomaticUpdates()
if err != nil {
t.Fatalf("NewAutomaticUpdates failed: %v", err)
}

settings, err := au.GetSettings()
if err != nil {
// GetSettings may fail in some environments (e.g., policy restrictions)
t.Skipf("GetSettings failed (may be expected): %v", err)
}

if settings.ReadOnly {
t.Skip("Settings are read-only, skipping test")
}

oldDay := settings.ScheduledInstallationDay
newDay := int32(2)

err = settings.PutScheduledInstallationDay(newDay)
if err != nil {
t.Logf("PutScheduledInstallationDay may fail (not supported on Windows 8+): %v", err)
return
}

if settings.ScheduledInstallationDay != newDay {
t.Errorf("ScheduledInstallationDay = %d, want %d", settings.ScheduledInstallationDay, newDay)
}

// Restore original value
_ = settings.PutScheduledInstallationDay(oldDay)
}

func TestIAutomaticUpdatesSettings_PutScheduledInstallationTime(t *testing.T) {
ole.CoInitialize(0)
defer ole.CoUninitialize()

au, err := NewAutomaticUpdates()
if err != nil {
t.Fatalf("NewAutomaticUpdates failed: %v", err)
}

settings, err := au.GetSettings()
if err != nil {
// GetSettings may fail in some environments (e.g., policy restrictions)
t.Skipf("GetSettings failed (may be expected): %v", err)
}

if settings.ReadOnly {
t.Skip("Settings are read-only, skipping test")
}

oldTime := settings.ScheduledInstallationTime
newTime := int32(14)

err = settings.PutScheduledInstallationTime(newTime)
if err != nil {
t.Logf("PutScheduledInstallationTime may fail (not supported on Windows 8+): %v", err)
return
}

if settings.ScheduledInstallationTime != newTime {
t.Errorf("ScheduledInstallationTime = %d, want %d", settings.ScheduledInstallationTime, newTime)
}

// Restore original value
_ = settings.PutScheduledInstallationTime(oldTime)
}
Loading