github.com/opencontainers/umoci@v0.4.8-0.20240508124516-656e4836fb0d/oci/config/generate/spec_test.go (about) 1 /* 2 * umoci: Umoci Modifies Open Containers' Images 3 * Copyright (C) 2016-2020 SUSE LLC 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package generate 19 20 import ( 21 "io" 22 "io/ioutil" 23 "os" 24 "reflect" 25 "testing" 26 "time" 27 28 // Import is necessary for go-digest. 29 _ "crypto/sha256" 30 31 "github.com/opencontainers/go-digest" 32 ) 33 34 func TestWriteTo(t *testing.T) { 35 g := New() 36 37 fh, err := ioutil.TempFile("", "umoci-TestWriteTo") 38 if err != nil { 39 t.Fatal(err) 40 } 41 defer os.RemoveAll(fh.Name()) 42 defer fh.Close() 43 44 size, err := g.WriteTo(fh) 45 if err != nil { 46 t.Errorf("failed to write: %+v", err) 47 } 48 49 fi, err := fh.Stat() 50 if err != nil { 51 t.Errorf("failed to stat: %+v", err) 52 } 53 54 if fi.Size() != size { 55 t.Errorf("wrong size: expected %d, got %d", size, fi.Size()) 56 } 57 } 58 59 func TestConfigUser(t *testing.T) { 60 g := New() 61 expected := "some_value" 62 63 g.SetConfigUser(expected) 64 got := g.ConfigUser() 65 66 if expected != got { 67 t.Errorf("ConfigUser get/set doesn't match: expected %v, got %v", expected, got) 68 } 69 } 70 71 func TestConfigWorkingDir(t *testing.T) { 72 g := New() 73 expected := "some_value" 74 75 g.SetConfigWorkingDir(expected) 76 got := g.ConfigWorkingDir() 77 78 if expected != got { 79 t.Errorf("ConfigWorkingDir get/set doesn't match: expected %v, got %v", expected, got) 80 } 81 } 82 83 func TestArchitecture(t *testing.T) { 84 g := New() 85 expected := "some_value" 86 87 g.SetArchitecture(expected) 88 got := g.Architecture() 89 90 if expected != got { 91 t.Errorf("Architecture get/set doesn't match: expected %v, got %v", expected, got) 92 } 93 } 94 95 func TestOS(t *testing.T) { 96 g := New() 97 expected := "some_value" 98 99 g.SetOS(expected) 100 got := g.OS() 101 102 if expected != got { 103 t.Errorf("OS get/set doesn't match: expected %v, got %v", expected, got) 104 } 105 } 106 107 func TestAuthor(t *testing.T) { 108 g := New() 109 expected := "some_value" 110 111 g.SetAuthor(expected) 112 got := g.Author() 113 114 if expected != got { 115 t.Errorf("Author get/set doesn't match: expected %v, got %v", expected, got) 116 } 117 } 118 119 func TestRootfsType(t *testing.T) { 120 g := New() 121 expected := "some_value" 122 123 g.SetRootfsType(expected) 124 got := g.RootfsType() 125 126 if expected != got { 127 t.Errorf("RootfsType get/set doesn't match: expected %v, got %v", expected, got) 128 } 129 } 130 131 func TestRootfsDiffIDs(t *testing.T) { 132 g := New() 133 134 values := []string{"a", "b", "c"} 135 diffids := []digest.Digest{} 136 for _, value := range values { 137 digester := digest.SHA256.Digester() 138 _, _ = io.WriteString(digester.Hash(), value) 139 diffids = append(diffids, digester.Digest()) 140 } 141 142 g.ClearRootfsDiffIDs() 143 for _, diffid := range diffids { 144 g.AddRootfsDiffID(diffid) 145 } 146 147 got := g.RootfsDiffIDs() 148 149 if !reflect.DeepEqual(diffids, got) { 150 t.Errorf("RootfsDiffIDs doesn't match: expected %v, got %v", diffids, got) 151 } 152 } 153 154 func TestConfigEntrypoint(t *testing.T) { 155 g := New() 156 entrypoint := []string{"a", "b", "c"} 157 158 g.SetConfigEntrypoint(entrypoint) 159 got := g.ConfigEntrypoint() 160 161 if !reflect.DeepEqual(entrypoint, got) { 162 t.Errorf("ConfigEntrypoint doesn't match: expected %v, got %v", entrypoint, got) 163 } 164 } 165 166 func TestConfigCmd(t *testing.T) { 167 g := New() 168 entrypoint := []string{"a", "b", "c"} 169 170 g.SetConfigCmd(entrypoint) 171 got := g.ConfigCmd() 172 173 if !reflect.DeepEqual(entrypoint, got) { 174 t.Errorf("ConfigCmd doesn't match: expected %v, got %v", entrypoint, got) 175 } 176 } 177 178 func TestConfigExposedPorts(t *testing.T) { 179 g := New() 180 exposedports := map[string]struct{}{ 181 "a": {}, 182 "b": {}, 183 "c": {}, 184 } 185 186 g.ClearConfigExposedPorts() 187 for exposedport := range exposedports { 188 g.AddConfigExposedPort(exposedport) 189 } 190 191 got := g.ConfigExposedPorts() 192 if !reflect.DeepEqual(exposedports, got) { 193 t.Errorf("ConfigExposedPorts doesn't match: expected %v, got %v", exposedports, got) 194 } 195 196 delete(exposedports, "a") 197 g.RemoveConfigExposedPort("a") 198 delete(got, "b") 199 200 got = g.ConfigExposedPorts() 201 if !reflect.DeepEqual(exposedports, got) { 202 t.Errorf("ConfigExposedPorts doesn't match: expected %v, got %v", exposedports, got) 203 } 204 } 205 206 func TestConfigVolumes(t *testing.T) { 207 g := New() 208 volumes := map[string]struct{}{ 209 "a": {}, 210 "b": {}, 211 "c": {}, 212 } 213 214 g.ClearConfigVolumes() 215 for volume := range volumes { 216 g.AddConfigVolume(volume) 217 } 218 219 got := g.ConfigVolumes() 220 if !reflect.DeepEqual(volumes, got) { 221 t.Errorf("ConfigVolumes doesn't match: expected %v, got %v", volumes, got) 222 } 223 224 delete(volumes, "a") 225 g.RemoveConfigVolume("a") 226 delete(got, "b") 227 228 got = g.ConfigVolumes() 229 if !reflect.DeepEqual(volumes, got) { 230 t.Errorf("ConfigVolumes doesn't match: expected %v, got %v", volumes, got) 231 } 232 } 233 234 func TestConfigEnv(t *testing.T) { 235 g := New() 236 env := []string{ 237 "HOME=a,b,c", 238 "TEST=a=b=c", 239 "ANOTHER=", 240 } 241 242 g.ClearConfigEnv() 243 g.AddConfigEnv("HOME", "a,b,c") 244 g.AddConfigEnv("TEST", "a=b=c") 245 g.AddConfigEnv("ANOTHER", "") 246 247 got := g.ConfigEnv() 248 if !reflect.DeepEqual(env, got) { 249 t.Errorf("ConfigEnv doesn't match: expected %v, got %v", env, got) 250 } 251 252 env[1] = "TEST=different" 253 g.AddConfigEnv("TEST", "different") 254 255 got = g.ConfigEnv() 256 if !reflect.DeepEqual(env, got) { 257 t.Errorf("ConfigEnv doesn't match: expected %v, got %v", env, got) 258 } 259 } 260 261 func TestConfigLabels(t *testing.T) { 262 g := New() 263 labels := map[string]string{ 264 "some": "key", 265 "value": "mappings", 266 "go": "here", 267 } 268 269 g.ClearConfigLabels() 270 for k, v := range labels { 271 g.AddConfigLabel(k, v) 272 } 273 274 got := g.ConfigLabels() 275 if !reflect.DeepEqual(labels, got) { 276 t.Errorf("ConfigLabels doesn't match: expected %v, got %v", labels, got) 277 } 278 279 delete(labels, "some") 280 g.RemoveConfigLabel("some") 281 282 got = g.ConfigLabels() 283 if !reflect.DeepEqual(labels, got) { 284 t.Errorf("ConfigLabels doesn't match: expected %v, got %v", labels, got) 285 } 286 287 delete(labels, "nonexist") 288 g.RemoveConfigLabel("nonexist") 289 delete(got, "value") 290 291 got = g.ConfigLabels() 292 if !reflect.DeepEqual(labels, got) { 293 t.Errorf("ConfigLabels doesn't match: expected %v, got %v", labels, got) 294 } 295 } 296 297 func TestConfigStopSignal(t *testing.T) { 298 g := New() 299 signals := []string{ 300 "SIGSTOP", 301 "SIGKILL", 302 "SIGUSR1", 303 "SIGINFO", 304 "SIGPWR", 305 "SIGRT13", 306 } 307 308 for _, signal := range signals { 309 g.SetConfigStopSignal(signal) 310 got := g.ConfigStopSignal() 311 if signal != got { 312 t.Errorf("ConfigStopSignal doesn't match: expected %q, got %q", signal, got) 313 } 314 } 315 } 316 317 func TestCreated(t *testing.T) { 318 g := New() 319 timeA := time.Now() 320 g.SetCreated(timeA) 321 timeB := g.Created() 322 323 if !timeA.Equal(timeB) { 324 t.Errorf("created get/set doesn't match: expected %v, got %v", timeA, timeB) 325 } 326 }