blob: 65fa92e66f0df0f9db9b2bf56e87d25a7319f3a9 [file] [edit]
package inventory
import (
"context"
"fmt"
"testing"
"time"
"github.com/GoogleCloudPlatform/osconfig/osinfo"
"github.com/GoogleCloudPlatform/osconfig/packages"
"github.com/google/go-cmp/cmp"
)
func TestProvider(t *testing.T) {
osInfo := osinfo.OSInfo{
Hostname: "testhost",
LongName: "testLong",
ShortName: "testShort",
Version: "testVersion",
KernelVersion: "#1 SMP PREEMPT_DYNAMIC Debian 6.1.123-1 (2025-01-02)",
KernelRelease: "6.1.0-29-cloud-amd64",
Architecture: "x86_64",
}
updates := packages.Packages{
Yum: []*packages.PkgInfo{{Name: "YumPkgUpdate", Arch: "Arch", Version: "Version"}},
Apt: []*packages.PkgInfo{{Name: "AptPkgUpdate", Arch: "Arch", Version: "Version"}},
}
installed := packages.Packages{
Yum: []*packages.PkgInfo{{Name: "YumInstalledPkg", Arch: "Arch", Version: "Version"}},
GooGet: []*packages.PkgInfo{{Name: "GooGetInstalledPkg", Arch: "Arch", Version: "Version"}},
}
tests := []struct {
name string
stub *stubProvider
want *InstanceInventory
}{
{
name: "all providers failed, returns empty result",
stub: &stubProvider{
osinfo: func(_ context.Context) (osinfo.OSInfo, error) { return osinfo.OSInfo{}, fmt.Errorf("unexpected error") },
packageUpdates: func(_ context.Context) (packages.Packages, error) {
return packages.Packages{}, fmt.Errorf("unexpected error")
},
installedPackages: func(_ context.Context) (packages.Packages, error) {
return packages.Packages{}, fmt.Errorf("unexpected error")
},
},
want: &InstanceInventory{
InstalledPackages: &packages.Packages{},
PackageUpdates: &packages.Packages{},
LastUpdated: "1970-01-01T10:00:00Z",
},
},
{
name: "all providers succeeded, returns all data",
stub: &stubProvider{
osinfo: func(_ context.Context) (osinfo.OSInfo, error) { return osInfo, nil },
packageUpdates: func(_ context.Context) (packages.Packages, error) {
return updates, nil
},
installedPackages: func(_ context.Context) (packages.Packages, error) {
return installed, nil
},
},
want: &InstanceInventory{
Hostname: "testhost",
LongName: "testLong",
ShortName: "testShort",
Version: "testVersion",
Architecture: "x86_64",
KernelVersion: "#1 SMP PREEMPT_DYNAMIC Debian 6.1.123-1 (2025-01-02)",
KernelRelease: "6.1.0-29-cloud-amd64",
OSConfigAgentVersion: "",
InstalledPackages: &packages.Packages{
Yum: []*packages.PkgInfo{{Name: "YumInstalledPkg", Arch: "Arch", Version: "Version"}},
GooGet: []*packages.PkgInfo{{Name: "GooGetInstalledPkg", Arch: "Arch", Version: "Version"}},
},
PackageUpdates: &packages.Packages{
Yum: []*packages.PkgInfo{{Name: "YumPkgUpdate", Arch: "Arch", Version: "Version"}},
Apt: []*packages.PkgInfo{{Name: "AptPkgUpdate", Arch: "Arch", Version: "Version"}},
},
LastUpdated: "1970-01-01T10:00:00Z",
},
},
{
name: "some providers succeeded, returns available data",
stub: &stubProvider{
osinfo: func(_ context.Context) (osinfo.OSInfo, error) { return osInfo, nil },
packageUpdates: func(_ context.Context) (packages.Packages, error) {
return packages.Packages{}, fmt.Errorf("unexpected error")
},
installedPackages: func(_ context.Context) (packages.Packages, error) {
return installed, nil
},
},
want: &InstanceInventory{
Hostname: "testhost",
LongName: "testLong",
ShortName: "testShort",
Version: "testVersion",
Architecture: "x86_64",
KernelVersion: "#1 SMP PREEMPT_DYNAMIC Debian 6.1.123-1 (2025-01-02)",
KernelRelease: "6.1.0-29-cloud-amd64",
OSConfigAgentVersion: "",
PackageUpdates: &packages.Packages{},
InstalledPackages: &packages.Packages{
Yum: []*packages.PkgInfo{{Name: "YumInstalledPkg", Arch: "Arch", Version: "Version"}},
GooGet: []*packages.PkgInfo{{Name: "GooGetInstalledPkg", Arch: "Arch", Version: "Version"}},
},
LastUpdated: "1970-01-01T10:00:00Z",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
provider := defaultInventoryProvider{
osInfoProvider: tt.stub,
packageUpdatesProvider: tt.stub,
installedPackagesProvider: tt.stub,
clock: stubClock{},
}
ctx := context.Background()
got := provider.Get(ctx)
if diff := cmp.Diff(tt.want, got); diff != "" {
t.Errorf("unexpected diff, diff:\n%s", diff)
}
})
}
}
func TestNewProvider(t *testing.T) {
provider := NewProvider()
if provider == nil {
t.Errorf("provider is not valid")
}
}
type stubClock struct{}
func (sc stubClock) Now() time.Time {
return time.UnixMicro(0).Add(10 * time.Hour)
}
type stubProvider struct {
osinfo func(context.Context) (osinfo.OSInfo, error)
packageUpdates func(context.Context) (packages.Packages, error)
installedPackages func(context.Context) (packages.Packages, error)
}
func (p stubProvider) GetOSInfo(ctx context.Context) (osinfo.OSInfo, error) {
return p.osinfo(ctx)
}
func (p stubProvider) GetInstalledPackages(ctx context.Context) (packages.Packages, error) {
return p.installedPackages(ctx)
}
func (p stubProvider) GetPackageUpdates(ctx context.Context) (packages.Packages, error) {
return p.packageUpdates(ctx)
}