Skip to content

Commit ed5ed4b

Browse files
tas50claude
andcommitted
🟢 add tests for Hetzner Cloud detection
Tests cover DMI-based detection (positive + negative), metadata identity resolution, and raw metadata parsing using mock data from a real Hetzner Cloud instance. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent bbb4cea commit ed5ed4b

File tree

5 files changed

+164
-0
lines changed

5 files changed

+164
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Copyright (c) Mondoo, Inc.
2+
// SPDX-License-Identifier: BUSL-1.1
3+
4+
package hetzner
5+
6+
import (
7+
"testing"
8+
9+
"github.com/stretchr/testify/assert"
10+
"github.com/stretchr/testify/require"
11+
"go.mondoo.com/mql/v13/providers-sdk/v1/inventory"
12+
"go.mondoo.com/mql/v13/providers/os/connection/mock"
13+
"go.mondoo.com/mql/v13/providers/os/detector"
14+
)
15+
16+
func TestDetectLinuxInstance(t *testing.T) {
17+
conn, err := mock.New(0, &inventory.Asset{}, mock.WithPath("./testdata/instance_linux.toml"))
18+
require.NoError(t, err)
19+
platform, ok := detector.DetectOS(conn)
20+
require.True(t, ok)
21+
22+
identifier, name, relatedIdentifiers := Detect(conn, platform)
23+
24+
assert.Equal(t, "//platformid.api.mondoo.app/runtime/hetzner/instances/110512417", identifier)
25+
assert.Equal(t, "ubuntu-8gb-hil-1", name)
26+
assert.Empty(t, relatedIdentifiers)
27+
}
28+
29+
func TestNoMatch(t *testing.T) {
30+
conn, err := mock.New(0, &inventory.Asset{}, mock.WithPath("./testdata/non_hetzner.toml"))
31+
require.NoError(t, err)
32+
platform, ok := detector.DetectOS(conn)
33+
require.True(t, ok)
34+
35+
identifier, name, relatedIdentifiers := Detect(conn, platform)
36+
37+
assert.Empty(t, identifier)
38+
assert.Empty(t, name)
39+
assert.Empty(t, relatedIdentifiers)
40+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
[commands."uname -s"]
2+
stdout = "Linux"
3+
4+
[commands."uname -m"]
5+
stdout = "x86_64"
6+
7+
[commands."uname -r"]
8+
stdout = "5.15.0-91-generic"
9+
10+
[files."/sys/class/dmi/id/sys_vendor"]
11+
path = "/sys/class/dmi/id/sys_vendor"
12+
enoent = false
13+
content = "Hetzner"
14+
15+
[files."/sys/class/dmi/id/product_name"]
16+
path = "/sys/class/dmi/id/product_name"
17+
enoent = false
18+
content = "vServer"
19+
20+
[files."/sys/class/dmi/id/bios_vendor"]
21+
path = "/sys/class/dmi/id/bios_vendor"
22+
enoent = false
23+
content = "Hetzner"
24+
25+
[files."/sys/class/dmi/id/chassis_vendor"]
26+
path = "/sys/class/dmi/id/chassis_vendor"
27+
enoent = false
28+
content = "QEMU"
29+
30+
[commands.d4923e3c7f9c8dec0409fddee98da395085699bbb2cc9cfc8c3527e02f746c41]
31+
command = "curl --retry 3 --retry-delay 1 --connect-timeout 1 --retry-max-time 5 --max-time 10 --noproxy '*' http://169.254.169.254/hetzner/v1/metadata"
32+
exit_status = 0
33+
stdout = """
34+
instance-id: 110512417
35+
hostname: ubuntu-8gb-hil-1
36+
region: us-west
37+
availability-zone: hil-dc1
38+
local-ipv4: ""
39+
"""
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[commands."uname -s"]
2+
stdout = "Linux"
3+
4+
[commands."uname -m"]
5+
stdout = "x86_64"
6+
7+
[commands."uname -r"]
8+
stdout = "5.15.0-91-generic"
9+
10+
[files."/sys/class/dmi/id/sys_vendor"]
11+
path = "/sys/class/dmi/id/sys_vendor"
12+
enoent = false
13+
content = "Microsoft Corporation"
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// Copyright (c) Mondoo, Inc.
2+
// SPDX-License-Identifier: BUSL-1.1
3+
4+
package hetznercloud_test
5+
6+
import (
7+
"testing"
8+
9+
"github.com/stretchr/testify/assert"
10+
"github.com/stretchr/testify/require"
11+
"go.mondoo.com/mql/v13/providers-sdk/v1/inventory"
12+
"go.mondoo.com/mql/v13/providers/os/connection/mock"
13+
"go.mondoo.com/mql/v13/providers/os/detector"
14+
"go.mondoo.com/mql/v13/providers/os/id/hetznercloud"
15+
)
16+
17+
func TestIdentifyLinux(t *testing.T) {
18+
conn, err := mock.New(0, &inventory.Asset{}, mock.WithPath("./testdata/metadata_linux.toml"))
19+
require.NoError(t, err)
20+
platform, ok := detector.DetectOS(conn)
21+
require.True(t, ok)
22+
23+
resolver, err := hetznercloud.Resolve(conn, platform)
24+
require.NoError(t, err)
25+
26+
ident, err := resolver.Identify()
27+
require.NoError(t, err)
28+
29+
assert.Equal(t, "//platformid.api.mondoo.app/runtime/hetzner/instances/110512417", ident.InstanceID)
30+
assert.Equal(t, "ubuntu-8gb-hil-1", ident.Hostname)
31+
assert.Equal(t, "us-west", ident.Region)
32+
}
33+
34+
func TestRawMetadataLinux(t *testing.T) {
35+
conn, err := mock.New(0, &inventory.Asset{}, mock.WithPath("./testdata/metadata_linux.toml"))
36+
require.NoError(t, err)
37+
platform, ok := detector.DetectOS(conn)
38+
require.True(t, ok)
39+
40+
resolver, err := hetznercloud.Resolve(conn, platform)
41+
require.NoError(t, err)
42+
43+
raw, err := resolver.RawMetadata()
44+
require.NoError(t, err)
45+
46+
m, ok := raw.(map[string]any)
47+
require.True(t, ok)
48+
49+
assert.Equal(t, 110512417, m["instance-id"])
50+
assert.Equal(t, "ubuntu-8gb-hil-1", m["hostname"])
51+
assert.Equal(t, "us-west", m["region"])
52+
assert.Equal(t, "hil-dc1", m["availability-zone"])
53+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
[commands."uname -s"]
2+
stdout = "Linux"
3+
4+
[commands."uname -m"]
5+
stdout = "x86_64"
6+
7+
[commands."uname -r"]
8+
stdout = "5.15.0-91-generic"
9+
10+
[commands.d4923e3c7f9c8dec0409fddee98da395085699bbb2cc9cfc8c3527e02f746c41]
11+
command = "curl --retry 3 --retry-delay 1 --connect-timeout 1 --retry-max-time 5 --max-time 10 --noproxy '*' http://169.254.169.254/hetzner/v1/metadata"
12+
exit_status = 0
13+
stdout = """
14+
instance-id: 110512417
15+
hostname: ubuntu-8gb-hil-1
16+
region: us-west
17+
availability-zone: hil-dc1
18+
local-ipv4: ""
19+
"""

0 commit comments

Comments
 (0)