env_test.go 7.5 KB

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