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  }