github.com/eatbyte/docker@v1.6.0/engine/env_test.go (about)

     1  package engine
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/docker/docker/pkg/testutils"
    10  )
    11  
    12  func TestEnvLenZero(t *testing.T) {
    13  	env := &Env{}
    14  	if env.Len() != 0 {
    15  		t.Fatalf("%d", env.Len())
    16  	}
    17  }
    18  
    19  func TestEnvLenNotZero(t *testing.T) {
    20  	env := &Env{}
    21  	env.Set("foo", "bar")
    22  	env.Set("ga", "bu")
    23  	if env.Len() != 2 {
    24  		t.Fatalf("%d", env.Len())
    25  	}
    26  }
    27  
    28  func TestEnvLenDup(t *testing.T) {
    29  	env := &Env{
    30  		"foo=bar",
    31  		"foo=baz",
    32  		"a=b",
    33  	}
    34  	// len(env) != env.Len()
    35  	if env.Len() != 2 {
    36  		t.Fatalf("%d", env.Len())
    37  	}
    38  }
    39  
    40  func TestEnvGetDup(t *testing.T) {
    41  	env := &Env{
    42  		"foo=bar",
    43  		"foo=baz",
    44  		"foo=bif",
    45  	}
    46  	expected := "bif"
    47  	if v := env.Get("foo"); v != expected {
    48  		t.Fatalf("expect %q, got %q", expected, v)
    49  	}
    50  }
    51  
    52  func TestNewJob(t *testing.T) {
    53  	job := mkJob(t, "dummy", "--level=awesome")
    54  	if job.Name != "dummy" {
    55  		t.Fatalf("Wrong job name: %s", job.Name)
    56  	}
    57  	if len(job.Args) != 1 {
    58  		t.Fatalf("Wrong number of job arguments: %d", len(job.Args))
    59  	}
    60  	if job.Args[0] != "--level=awesome" {
    61  		t.Fatalf("Wrong job arguments: %s", job.Args[0])
    62  	}
    63  }
    64  
    65  func TestSetenv(t *testing.T) {
    66  	job := mkJob(t, "dummy")
    67  	job.Setenv("foo", "bar")
    68  	if val := job.Getenv("foo"); val != "bar" {
    69  		t.Fatalf("Getenv returns incorrect value: %s", val)
    70  	}
    71  
    72  	job.Setenv("bar", "")
    73  	if val := job.Getenv("bar"); val != "" {
    74  		t.Fatalf("Getenv returns incorrect value: %s", val)
    75  	}
    76  	if val := job.Getenv("nonexistent"); val != "" {
    77  		t.Fatalf("Getenv returns incorrect value: %s", val)
    78  	}
    79  }
    80  
    81  func TestSetenvBool(t *testing.T) {
    82  	job := mkJob(t, "dummy")
    83  	job.SetenvBool("foo", true)
    84  	if val := job.GetenvBool("foo"); !val {
    85  		t.Fatalf("GetenvBool returns incorrect value: %t", val)
    86  	}
    87  
    88  	job.SetenvBool("bar", false)
    89  	if val := job.GetenvBool("bar"); val {
    90  		t.Fatalf("GetenvBool returns incorrect value: %t", val)
    91  	}
    92  
    93  	if val := job.GetenvBool("nonexistent"); val {
    94  		t.Fatalf("GetenvBool returns incorrect value: %t", val)
    95  	}
    96  }
    97  
    98  func TestSetenvTime(t *testing.T) {
    99  	job := mkJob(t, "dummy")
   100  
   101  	now := time.Now()
   102  	job.SetenvTime("foo", now)
   103  	if val, err := job.GetenvTime("foo"); err != nil {
   104  		t.Fatalf("GetenvTime failed to parse: %v", err)
   105  	} else {
   106  		nowStr := now.Format(time.RFC3339)
   107  		valStr := val.Format(time.RFC3339)
   108  		if nowStr != valStr {
   109  			t.Fatalf("GetenvTime returns incorrect value: %s, Expected: %s", valStr, nowStr)
   110  		}
   111  	}
   112  
   113  	job.Setenv("bar", "Obviously I'm not a date")
   114  	if val, err := job.GetenvTime("bar"); err == nil {
   115  		t.Fatalf("GetenvTime was supposed to fail, instead returned: %s", val)
   116  	}
   117  }
   118  
   119  func TestSetenvInt(t *testing.T) {
   120  	job := mkJob(t, "dummy")
   121  
   122  	job.SetenvInt("foo", -42)
   123  	if val := job.GetenvInt("foo"); val != -42 {
   124  		t.Fatalf("GetenvInt returns incorrect value: %d", val)
   125  	}
   126  
   127  	job.SetenvInt("bar", 42)
   128  	if val := job.GetenvInt("bar"); val != 42 {
   129  		t.Fatalf("GetenvInt returns incorrect value: %d", val)
   130  	}
   131  	if val := job.GetenvInt("nonexistent"); val != 0 {
   132  		t.Fatalf("GetenvInt returns incorrect value: %d", val)
   133  	}
   134  }
   135  
   136  func TestSetenvList(t *testing.T) {
   137  	job := mkJob(t, "dummy")
   138  
   139  	job.SetenvList("foo", []string{"bar"})
   140  	if val := job.GetenvList("foo"); len(val) != 1 || val[0] != "bar" {
   141  		t.Fatalf("GetenvList returns incorrect value: %v", val)
   142  	}
   143  
   144  	job.SetenvList("bar", nil)
   145  	if val := job.GetenvList("bar"); val != nil {
   146  		t.Fatalf("GetenvList returns incorrect value: %v", val)
   147  	}
   148  	if val := job.GetenvList("nonexistent"); val != nil {
   149  		t.Fatalf("GetenvList returns incorrect value: %v", val)
   150  	}
   151  }
   152  
   153  func TestEnviron(t *testing.T) {
   154  	job := mkJob(t, "dummy")
   155  	job.Setenv("foo", "bar")
   156  	val, exists := job.Environ()["foo"]
   157  	if !exists {
   158  		t.Fatalf("foo not found in the environ")
   159  	}
   160  	if val != "bar" {
   161  		t.Fatalf("bar not found in the environ")
   162  	}
   163  }
   164  
   165  func TestMultiMap(t *testing.T) {
   166  	e := &Env{}
   167  	e.Set("foo", "bar")
   168  	e.Set("bar", "baz")
   169  	e.Set("hello", "world")
   170  	m := e.MultiMap()
   171  	e2 := &Env{}
   172  	e2.Set("old_key", "something something something")
   173  	e2.InitMultiMap(m)
   174  	if v := e2.Get("old_key"); v != "" {
   175  		t.Fatalf("%#v", v)
   176  	}
   177  	if v := e2.Get("bar"); v != "baz" {
   178  		t.Fatalf("%#v", v)
   179  	}
   180  	if v := e2.Get("hello"); v != "world" {
   181  		t.Fatalf("%#v", v)
   182  	}
   183  }
   184  
   185  func testMap(l int) [][2]string {
   186  	res := make([][2]string, l)
   187  	for i := 0; i < l; i++ {
   188  		t := [2]string{testutils.RandomString(5), testutils.RandomString(20)}
   189  		res[i] = t
   190  	}
   191  	return res
   192  }
   193  
   194  func BenchmarkSet(b *testing.B) {
   195  	fix := testMap(100)
   196  	b.ResetTimer()
   197  	for i := 0; i < b.N; i++ {
   198  		env := &Env{}
   199  		for _, kv := range fix {
   200  			env.Set(kv[0], kv[1])
   201  		}
   202  	}
   203  }
   204  
   205  func BenchmarkSetJson(b *testing.B) {
   206  	fix := testMap(100)
   207  	type X struct {
   208  		f string
   209  	}
   210  	b.ResetTimer()
   211  	for i := 0; i < b.N; i++ {
   212  		env := &Env{}
   213  		for _, kv := range fix {
   214  			if err := env.SetJson(kv[0], X{kv[1]}); err != nil {
   215  				b.Fatal(err)
   216  			}
   217  		}
   218  	}
   219  }
   220  
   221  func BenchmarkGet(b *testing.B) {
   222  	fix := testMap(100)
   223  	env := &Env{}
   224  	for _, kv := range fix {
   225  		env.Set(kv[0], kv[1])
   226  	}
   227  	b.ResetTimer()
   228  	for i := 0; i < b.N; i++ {
   229  		for _, kv := range fix {
   230  			env.Get(kv[0])
   231  		}
   232  	}
   233  }
   234  
   235  func BenchmarkGetJson(b *testing.B) {
   236  	fix := testMap(100)
   237  	env := &Env{}
   238  	type X struct {
   239  		f string
   240  	}
   241  	for _, kv := range fix {
   242  		env.SetJson(kv[0], X{kv[1]})
   243  	}
   244  	b.ResetTimer()
   245  	for i := 0; i < b.N; i++ {
   246  		for _, kv := range fix {
   247  			if err := env.GetJson(kv[0], &X{}); err != nil {
   248  				b.Fatal(err)
   249  			}
   250  		}
   251  	}
   252  }
   253  
   254  func BenchmarkEncode(b *testing.B) {
   255  	fix := testMap(100)
   256  	env := &Env{}
   257  	type X struct {
   258  		f string
   259  	}
   260  	// half a json
   261  	for i, kv := range fix {
   262  		if i%2 != 0 {
   263  			if err := env.SetJson(kv[0], X{kv[1]}); err != nil {
   264  				b.Fatal(err)
   265  			}
   266  			continue
   267  		}
   268  		env.Set(kv[0], kv[1])
   269  	}
   270  	var writer bytes.Buffer
   271  	b.ResetTimer()
   272  	for i := 0; i < b.N; i++ {
   273  		env.Encode(&writer)
   274  		writer.Reset()
   275  	}
   276  }
   277  
   278  func BenchmarkDecode(b *testing.B) {
   279  	fix := testMap(100)
   280  	env := &Env{}
   281  	type X struct {
   282  		f string
   283  	}
   284  	// half a json
   285  	for i, kv := range fix {
   286  		if i%2 != 0 {
   287  			if err := env.SetJson(kv[0], X{kv[1]}); err != nil {
   288  				b.Fatal(err)
   289  			}
   290  			continue
   291  		}
   292  		env.Set(kv[0], kv[1])
   293  	}
   294  	var writer bytes.Buffer
   295  	env.Encode(&writer)
   296  	denv := &Env{}
   297  	reader := bytes.NewReader(writer.Bytes())
   298  	b.ResetTimer()
   299  	for i := 0; i < b.N; i++ {
   300  		err := denv.Decode(reader)
   301  		if err != nil {
   302  			b.Fatal(err)
   303  		}
   304  		reader.Seek(0, 0)
   305  	}
   306  }
   307  
   308  func TestLongNumbers(t *testing.T) {
   309  	type T struct {
   310  		TestNum int64
   311  	}
   312  	v := T{67108864}
   313  	var buf bytes.Buffer
   314  	e := &Env{}
   315  	e.SetJson("Test", v)
   316  	if err := e.Encode(&buf); err != nil {
   317  		t.Fatal(err)
   318  	}
   319  	res := make(map[string]T)
   320  	if err := json.Unmarshal(buf.Bytes(), &res); err != nil {
   321  		t.Fatal(err)
   322  	}
   323  	if res["Test"].TestNum != v.TestNum {
   324  		t.Fatalf("TestNum %d, expected %d", res["Test"].TestNum, v.TestNum)
   325  	}
   326  }
   327  
   328  func TestLongNumbersArray(t *testing.T) {
   329  	type T struct {
   330  		TestNum []int64
   331  	}
   332  	v := T{[]int64{67108864}}
   333  	var buf bytes.Buffer
   334  	e := &Env{}
   335  	e.SetJson("Test", v)
   336  	if err := e.Encode(&buf); err != nil {
   337  		t.Fatal(err)
   338  	}
   339  	res := make(map[string]T)
   340  	if err := json.Unmarshal(buf.Bytes(), &res); err != nil {
   341  		t.Fatal(err)
   342  	}
   343  	if res["Test"].TestNum[0] != v.TestNum[0] {
   344  		t.Fatalf("TestNum %d, expected %d", res["Test"].TestNum, v.TestNum)
   345  	}
   346  }