Skip to content

Commit 1fd6e90

Browse files
authored
Merge pull request #96 from interlink-hq/feat/add-unit-tests
test: add unit tests for core utility functions
2 parents e2a1cab + e566fd6 commit 1fd6e90

File tree

7 files changed

+356
-18
lines changed

7 files changed

+356
-18
lines changed

.github/workflows/ci.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ jobs:
2121
workdir: ci
2222
verb: call
2323
args: -s test --interlink-version 0.5.2 --src ../ --plugin-config ./manifests/plugin-config.yaml --manifests ./manifests
24+
args: -s test --interlink-version latest --src ./ --plugin-config ./ci/manifests/plugin-config.yaml --manifests ./ci/manifests
2425
cloud-token: ${{ secrets.DAGGER_CLOUD_TOKEN }}
25-
version: "0.18.9"
26+
version: "0.19.1"
2627

ci/main.go

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,35 @@ package main
1717
import (
1818
"context"
1919
"dagger/interlink-slurm/internal/dagger"
20+
"time"
2021
)
2122

2223
type InterlinkSlurm struct{}
2324

24-
func (m *InterlinkSlurm) RunTest(interlinkVersion string, pluginService *dagger.Service, manifests *dagger.Directory, interlinkConfig *dagger.File, pluginConfig *dagger.File, src *dagger.Directory,
25+
// UnitTest runs the unit tests using make test
26+
func (m *InterlinkSlurm) UnitTest(ctx context.Context, src *dagger.Directory) (string, error) {
27+
return dag.Container().
28+
From("golang:1.24").
29+
WithDirectory("/src", src).
30+
WithWorkdir("/src").
31+
WithExec([]string{"make", "test"}).
32+
Stdout(ctx)
33+
}
34+
35+
func (m *InterlinkSlurm) RunTest(interlinkVersion string, pluginService *dagger.Service, manifests *dagger.Directory, interlinkEndpoint *dagger.Service, pluginConfig *dagger.File, src *dagger.Directory,
2536
) *dagger.Container {
2637
registry := dag.Container().From("registry").
2738
WithExposedPort(5000).AsService()
2839

2940
return dag.Interlink("ci", dagger.InterlinkOpts{
30-
VirtualKubeletRef: "ghcr.io/intertwin-eu/interlink/virtual-kubelet-inttw:" + interlinkVersion,
31-
InterlinkRef: "ghcr.io/intertwin-eu/interlink/interlink:" + interlinkVersion,
41+
VirtualKubeletRef: "ghcr.io/interlink-hq/interlink/virtual-kubelet-inttw:" + interlinkVersion,
42+
InterlinkRef: "ghcr.io/interlink-hq/interlink/interlink:" + interlinkVersion,
3243
}).NewInterlink(dagger.InterlinkNewInterlinkOpts{
33-
PluginEndpoint: pluginService,
34-
Manifests: manifests,
35-
InterlinkConfig: interlinkConfig,
36-
PluginConfig: pluginConfig,
37-
LocalRegistry: registry,
44+
PluginEndpoint: pluginService,
45+
Manifests: manifests,
46+
InterlinkEndpoint: interlinkEndpoint,
47+
PluginConfig: pluginConfig,
48+
LocalRegistry: registry,
3849
}).Test(dagger.InterlinkTestOpts{
3950
Manifests: manifests,
4051
SourceFolder: src,
@@ -46,16 +57,17 @@ func (m *InterlinkSlurm) Test(ctx context.Context, interlinkVersion string, src
4657
// +optional
4758
pluginEndpoint *dagger.Service,
4859
// +optional
49-
// +defaultPath="./manifests/plugin-config.yaml"
60+
interlinkEndpoint *dagger.Service,
61+
// +optional
62+
// +defaultPath="./manifests/interlink-config.yaml"
5063
interlinkConfig *dagger.File,
5164
) (string, error) {
5265
if pluginEndpoint == nil {
5366

5467
// build using Dockerfile and publish to registry
55-
plugin := dag.Container().
56-
Build(src, dagger.ContainerBuildOpts{
57-
Dockerfile: "docker/Dockerfile",
58-
}).
68+
plugin := src.DockerBuild(dagger.DirectoryDockerBuildOpts{
69+
Dockerfile: "docker/Dockerfile",
70+
}).
5971
WithFile("/etc/interlink/InterLinkConfig.yaml", pluginConfig).
6072
WithEnvVariable("SLURMCONFIGPATH", "/etc/interlink/InterLinkConfig.yaml").
6173
WithEnvVariable("SHARED_FS", "true").
@@ -65,8 +77,25 @@ func (m *InterlinkSlurm) Test(ctx context.Context, interlinkVersion string, src
6577
if err != nil {
6678
return "", err
6779
}
68-
return m.RunTest(interlinkVersion, pluginEndpoint, manifests, interlinkConfig, pluginConfig, src).Stdout(ctx)
80+
81+
interlink := dag.Container().From("ghcr.io/interlink-hq/interlink/interlink:"+interlinkVersion).
82+
WithFile("/etc/interlink/InterLinkConfig.yaml", interlinkConfig).
83+
WithEnvVariable("BUST", time.Now().String()).
84+
WithServiceBinding("plugin", pluginEndpoint).
85+
WithEnvVariable("INTERLINKCONFIGPATH", "/etc/interlink/InterLinkConfig.yaml").
86+
WithExposedPort(3000)
87+
88+
interlinkEndpoint, err = interlink.
89+
AsService(
90+
dagger.ContainerAsServiceOpts{
91+
UseEntrypoint: true,
92+
InsecureRootCapabilities: true,
93+
}).Start(ctx)
94+
if err != nil {
95+
return "", err
96+
}
97+
return m.RunTest(interlinkVersion, pluginEndpoint, manifests, interlinkEndpoint, pluginConfig, src).Stdout(ctx)
6998
}
7099

71-
return m.RunTest(interlinkVersion, pluginEndpoint, manifests, interlinkConfig, pluginConfig, src).Stdout(ctx)
100+
return m.RunTest(interlinkVersion, pluginEndpoint, manifests, interlinkEndpoint, pluginConfig, src).Stdout(ctx)
72101
}

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ require (
88
al.essio.dev/pkg/shellescape v1.5.0
99
github.com/alexellis/go-execute v0.6.0
1010
github.com/containerd/containerd v1.7.6
11+
github.com/goccy/go-yaml v1.18.0
1112
github.com/google/uuid v1.6.0
1213
github.com/intertwin-eu/interlink v0.0.0-20250203130222-964ed80a8c1a
1314
github.com/sirupsen/logrus v1.9.3
@@ -17,7 +18,6 @@ require (
1718
go.opentelemetry.io/otel/sdk v1.27.0
1819
go.opentelemetry.io/otel/trace v1.27.0
1920
google.golang.org/grpc v1.64.0
20-
gopkg.in/yaml.v2 v2.4.0
2121
k8s.io/api v0.29.1
2222
k8s.io/apimachinery v0.29.1
2323
k8s.io/client-go v0.29.1
@@ -56,6 +56,7 @@ require (
5656
google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 // indirect
5757
google.golang.org/protobuf v1.34.1 // indirect
5858
gopkg.in/inf.v0 v0.9.1 // indirect
59+
gopkg.in/yaml.v2 v2.4.0 // indirect
5960
gopkg.in/yaml.v3 v3.0.1 // indirect
6061
k8s.io/klog/v2 v2.110.1 // indirect
6162
k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogB
2828
github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
2929
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
3030
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
31+
github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=
32+
github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
3133
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
3234
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
3335
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=

pkg/slurm/func.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
"k8s.io/client-go/kubernetes"
1212

1313
"github.com/containerd/containerd/log"
14-
"gopkg.in/yaml.v2"
14+
"github.com/goccy/go-yaml"
1515
)
1616

1717
var SlurmConfigInst SlurmConfig

pkg/slurm/func_test.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package slurm
2+
3+
import (
4+
"net/http"
5+
"net/http/httptest"
6+
"testing"
7+
)
8+
9+
func TestGetSessionContext(t *testing.T) {
10+
tests := []struct {
11+
name string
12+
headerValue string
13+
expectedResult string
14+
}{
15+
{
16+
name: "header present",
17+
headerValue: "session-123",
18+
expectedResult: "session-123",
19+
},
20+
{
21+
name: "header empty",
22+
headerValue: "",
23+
expectedResult: "NoSessionFound#0",
24+
},
25+
{
26+
name: "header with special characters",
27+
headerValue: "session@456#abc",
28+
expectedResult: "session@456#abc",
29+
},
30+
}
31+
32+
for _, tt := range tests {
33+
t.Run(tt.name, func(t *testing.T) {
34+
req := httptest.NewRequest(http.MethodGet, "/test", nil)
35+
if tt.headerValue != "" {
36+
req.Header.Set("InterLink-Http-Session", tt.headerValue)
37+
}
38+
39+
result := GetSessionContext(req)
40+
if result != tt.expectedResult {
41+
t.Errorf("GetSessionContext() = %q, want %q", result, tt.expectedResult)
42+
}
43+
})
44+
}
45+
}
46+
47+
func TestGetSessionContextMessage(t *testing.T) {
48+
tests := []struct {
49+
name string
50+
sessionContext string
51+
expectedResult string
52+
}{
53+
{
54+
name: "normal session",
55+
sessionContext: "session-123",
56+
expectedResult: "HTTP InterLink session session-123: ",
57+
},
58+
{
59+
name: "empty session",
60+
sessionContext: "",
61+
expectedResult: "HTTP InterLink session : ",
62+
},
63+
{
64+
name: "default no session",
65+
sessionContext: "NoSessionFound#0",
66+
expectedResult: "HTTP InterLink session NoSessionFound#0: ",
67+
},
68+
}
69+
70+
for _, tt := range tests {
71+
t.Run(tt.name, func(t *testing.T) {
72+
result := GetSessionContextMessage(tt.sessionContext)
73+
if result != tt.expectedResult {
74+
t.Errorf("GetSessionContextMessage(%q) = %q, want %q", tt.sessionContext, result, tt.expectedResult)
75+
}
76+
})
77+
}
78+
}

0 commit comments

Comments
 (0)