/** # Copyright (c) 2021-2022, NVIDIA CORPORATION. All rights reserved. # # 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 docker import ( "encoding/json" "fmt" "testing" "github.com/stretchr/testify/require" ) func TestUpdateConfigDefaultRuntime(t *testing.T) { testCases := []struct { config Config runtimeName string setAsDefault bool expectedDefaultRuntimeName interface{} }{ { setAsDefault: false, expectedDefaultRuntimeName: nil, }, { runtimeName: "NAME", setAsDefault: true, expectedDefaultRuntimeName: "NAME", }, { config: map[string]interface{}{ "default-runtime": "ALREADY_SET", }, runtimeName: "NAME", setAsDefault: false, expectedDefaultRuntimeName: "ALREADY_SET", }, { config: map[string]interface{}{ "default-runtime": "ALREADY_SET", }, runtimeName: "NAME", setAsDefault: true, expectedDefaultRuntimeName: "NAME", }, } for i, tc := range testCases { t.Run(fmt.Sprintf("test case %d", i), func(t *testing.T) { if tc.config == nil { tc.config = make(map[string]interface{}) } err := tc.config.AddRuntime(tc.runtimeName, "", tc.setAsDefault) require.NoError(t, err) defaultRuntimeName := tc.config["default-runtime"] require.EqualValues(t, tc.expectedDefaultRuntimeName, defaultRuntimeName) }) } } func TestUpdateConfigRuntimes(t *testing.T) { testCases := []struct { config Config runtimes map[string]string expectedConfig map[string]interface{} }{ { config: map[string]interface{}{}, runtimes: map[string]string{ "runtime1": "/test/runtime/dir/runtime1", "runtime2": "/test/runtime/dir/runtime2", }, expectedConfig: map[string]interface{}{ "runtimes": map[string]interface{}{ "runtime1": map[string]interface{}{ "path": "/test/runtime/dir/runtime1", "args": []string{}, }, "runtime2": map[string]interface{}{ "path": "/test/runtime/dir/runtime2", "args": []string{}, }, }, }, }, { config: map[string]interface{}{ "runtimes": map[string]interface{}{ "runtime1": map[string]interface{}{ "path": "runtime1", "args": []string{}, }, }, }, runtimes: map[string]string{ "runtime1": "/test/runtime/dir/runtime1", "runtime2": "/test/runtime/dir/runtime2", }, expectedConfig: map[string]interface{}{ "runtimes": map[string]interface{}{ "runtime1": map[string]interface{}{ "path": "/test/runtime/dir/runtime1", "args": []string{}, }, "runtime2": map[string]interface{}{ "path": "/test/runtime/dir/runtime2", "args": []string{}, }, }, }, }, { config: map[string]interface{}{ "runtimes": map[string]interface{}{ "not-nvidia": map[string]interface{}{ "path": "some-other-path", "args": []string{}, }, }, }, runtimes: map[string]string{ "runtime1": "/test/runtime/dir/runtime1", }, expectedConfig: map[string]interface{}{ "runtimes": map[string]interface{}{ "not-nvidia": map[string]interface{}{ "path": "some-other-path", "args": []string{}, }, "runtime1": map[string]interface{}{ "path": "/test/runtime/dir/runtime1", "args": []string{}, }, }, }, }, { config: map[string]interface{}{ "exec-opts": []string{"native.cgroupdriver=systemd"}, "log-driver": "json-file", "log-opts": map[string]string{ "max-size": "100m", }, "storage-driver": "overlay2", }, runtimes: map[string]string{ "runtime1": "/test/runtime/dir/runtime1", }, expectedConfig: map[string]interface{}{ "exec-opts": []string{"native.cgroupdriver=systemd"}, "log-driver": "json-file", "log-opts": map[string]string{ "max-size": "100m", }, "storage-driver": "overlay2", "runtimes": map[string]interface{}{ "runtime1": map[string]interface{}{ "path": "/test/runtime/dir/runtime1", "args": []string{}, }, }, }, }, { config: map[string]interface{}{ "exec-opts": []string{"native.cgroupdriver=systemd"}, "log-driver": "json-file", "log-opts": map[string]string{ "max-size": "100m", }, "storage-driver": "overlay2", }, expectedConfig: map[string]interface{}{ "exec-opts": []string{"native.cgroupdriver=systemd"}, "log-driver": "json-file", "log-opts": map[string]string{ "max-size": "100m", }, "storage-driver": "overlay2", }, }, } for i, tc := range testCases { t.Run(fmt.Sprintf("test case %d", i), func(t *testing.T) { for runtimeName, runtimePath := range tc.runtimes { err := tc.config.AddRuntime(runtimeName, runtimePath, false) require.NoError(t, err) } configContent, err := json.MarshalIndent(tc.config, "", " ") require.NoError(t, err) expectedContent, err := json.MarshalIndent(tc.expectedConfig, "", " ") require.NoError(t, err) require.EqualValues(t, string(expectedContent), string(configContent)) }) } } func TestGetRuntimeConfig(t *testing.T) { c := map[string]interface{}{ "runtimes": map[string]interface{}{ "nvidia": map[string]interface{}{ "path": "nvidia-container-runtime", "args": []string{}, }, }, } cfg := Config(c) testCases := []struct { description string runtime string expected string }{ { description: "existing runtime", runtime: "nvidia", expected: "nvidia-container-runtime", }, { description: "non-existent runtime", runtime: "some-other-runtime", expected: "", }, } for _, tc := range testCases { rc, err := cfg.GetRuntimeConfig(tc.runtime) require.NoError(t, err) require.Equal(t, tc.expected, rc.GetBinaryPath()) } }