network_test.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. package formatter
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "strings"
  6. "testing"
  7. "time"
  8. "github.com/docker/docker/api/types"
  9. "github.com/docker/docker/pkg/stringid"
  10. "github.com/docker/docker/pkg/testutil/assert"
  11. )
  12. func TestNetworkContext(t *testing.T) {
  13. networkID := stringid.GenerateRandomID()
  14. var ctx networkContext
  15. cases := []struct {
  16. networkCtx networkContext
  17. expValue string
  18. expHeader string
  19. call func() string
  20. }{
  21. {networkContext{
  22. n: types.NetworkResource{ID: networkID},
  23. trunc: false,
  24. }, networkID, networkIDHeader, ctx.ID},
  25. {networkContext{
  26. n: types.NetworkResource{ID: networkID},
  27. trunc: true,
  28. }, stringid.TruncateID(networkID), networkIDHeader, ctx.ID},
  29. {networkContext{
  30. n: types.NetworkResource{Name: "network_name"},
  31. }, "network_name", nameHeader, ctx.Name},
  32. {networkContext{
  33. n: types.NetworkResource{Driver: "driver_name"},
  34. }, "driver_name", driverHeader, ctx.Driver},
  35. {networkContext{
  36. n: types.NetworkResource{EnableIPv6: true},
  37. }, "true", ipv6Header, ctx.IPv6},
  38. {networkContext{
  39. n: types.NetworkResource{EnableIPv6: false},
  40. }, "false", ipv6Header, ctx.IPv6},
  41. {networkContext{
  42. n: types.NetworkResource{Internal: true},
  43. }, "true", internalHeader, ctx.Internal},
  44. {networkContext{
  45. n: types.NetworkResource{Internal: false},
  46. }, "false", internalHeader, ctx.Internal},
  47. {networkContext{
  48. n: types.NetworkResource{},
  49. }, "", labelsHeader, ctx.Labels},
  50. {networkContext{
  51. n: types.NetworkResource{Labels: map[string]string{"label1": "value1", "label2": "value2"}},
  52. }, "label1=value1,label2=value2", labelsHeader, ctx.Labels},
  53. }
  54. for _, c := range cases {
  55. ctx = c.networkCtx
  56. v := c.call()
  57. if strings.Contains(v, ",") {
  58. compareMultipleValues(t, v, c.expValue)
  59. } else if v != c.expValue {
  60. t.Fatalf("Expected %s, was %s\n", c.expValue, v)
  61. }
  62. h := ctx.FullHeader()
  63. if h != c.expHeader {
  64. t.Fatalf("Expected %s, was %s\n", c.expHeader, h)
  65. }
  66. }
  67. }
  68. func TestNetworkContextWrite(t *testing.T) {
  69. cases := []struct {
  70. context Context
  71. expected string
  72. }{
  73. // Errors
  74. {
  75. Context{Format: "{{InvalidFunction}}"},
  76. `Template parsing error: template: :1: function "InvalidFunction" not defined
  77. `,
  78. },
  79. {
  80. Context{Format: "{{nil}}"},
  81. `Template parsing error: template: :1:2: executing "" at <nil>: nil is not a command
  82. `,
  83. },
  84. // Table format
  85. {
  86. Context{Format: NewNetworkFormat("table", false)},
  87. `NETWORK ID NAME DRIVER SCOPE
  88. networkID1 foobar_baz foo local
  89. networkID2 foobar_bar bar local
  90. `,
  91. },
  92. {
  93. Context{Format: NewNetworkFormat("table", true)},
  94. `networkID1
  95. networkID2
  96. `,
  97. },
  98. {
  99. Context{Format: NewNetworkFormat("table {{.Name}}", false)},
  100. `NAME
  101. foobar_baz
  102. foobar_bar
  103. `,
  104. },
  105. {
  106. Context{Format: NewNetworkFormat("table {{.Name}}", true)},
  107. `NAME
  108. foobar_baz
  109. foobar_bar
  110. `,
  111. },
  112. // Raw Format
  113. {
  114. Context{Format: NewNetworkFormat("raw", false)},
  115. `network_id: networkID1
  116. name: foobar_baz
  117. driver: foo
  118. scope: local
  119. network_id: networkID2
  120. name: foobar_bar
  121. driver: bar
  122. scope: local
  123. `,
  124. },
  125. {
  126. Context{Format: NewNetworkFormat("raw", true)},
  127. `network_id: networkID1
  128. network_id: networkID2
  129. `,
  130. },
  131. // Custom Format
  132. {
  133. Context{Format: NewNetworkFormat("{{.Name}}", false)},
  134. `foobar_baz
  135. foobar_bar
  136. `,
  137. },
  138. // Custom Format with CreatedAt
  139. {
  140. Context{Format: NewNetworkFormat("{{.Name}} {{.CreatedAt}}", false)},
  141. `foobar_baz 2016-01-01 00:00:00 +0000 UTC
  142. foobar_bar 2017-01-01 00:00:00 +0000 UTC
  143. `,
  144. },
  145. }
  146. timestamp1, _ := time.Parse("2006-01-02", "2016-01-01")
  147. timestamp2, _ := time.Parse("2006-01-02", "2017-01-01")
  148. for _, testcase := range cases {
  149. networks := []types.NetworkResource{
  150. {ID: "networkID1", Name: "foobar_baz", Driver: "foo", Scope: "local", Created: timestamp1},
  151. {ID: "networkID2", Name: "foobar_bar", Driver: "bar", Scope: "local", Created: timestamp2},
  152. }
  153. out := bytes.NewBufferString("")
  154. testcase.context.Output = out
  155. err := NetworkWrite(testcase.context, networks)
  156. if err != nil {
  157. assert.Error(t, err, testcase.expected)
  158. } else {
  159. assert.Equal(t, out.String(), testcase.expected)
  160. }
  161. }
  162. }
  163. func TestNetworkContextWriteJSON(t *testing.T) {
  164. networks := []types.NetworkResource{
  165. {ID: "networkID1", Name: "foobar_baz"},
  166. {ID: "networkID2", Name: "foobar_bar"},
  167. }
  168. expectedJSONs := []map[string]interface{}{
  169. {"Driver": "", "ID": "networkID1", "IPv6": "false", "Internal": "false", "Labels": "", "Name": "foobar_baz", "Scope": "", "CreatedAt": "0001-01-01 00:00:00 +0000 UTC"},
  170. {"Driver": "", "ID": "networkID2", "IPv6": "false", "Internal": "false", "Labels": "", "Name": "foobar_bar", "Scope": "", "CreatedAt": "0001-01-01 00:00:00 +0000 UTC"},
  171. }
  172. out := bytes.NewBufferString("")
  173. err := NetworkWrite(Context{Format: "{{json .}}", Output: out}, networks)
  174. if err != nil {
  175. t.Fatal(err)
  176. }
  177. for i, line := range strings.Split(strings.TrimSpace(out.String()), "\n") {
  178. t.Logf("Output: line %d: %s", i, line)
  179. var m map[string]interface{}
  180. if err := json.Unmarshal([]byte(line), &m); err != nil {
  181. t.Fatal(err)
  182. }
  183. assert.DeepEqual(t, m, expectedJSONs[i])
  184. }
  185. }
  186. func TestNetworkContextWriteJSONField(t *testing.T) {
  187. networks := []types.NetworkResource{
  188. {ID: "networkID1", Name: "foobar_baz"},
  189. {ID: "networkID2", Name: "foobar_bar"},
  190. }
  191. out := bytes.NewBufferString("")
  192. err := NetworkWrite(Context{Format: "{{json .ID}}", Output: out}, networks)
  193. if err != nil {
  194. t.Fatal(err)
  195. }
  196. for i, line := range strings.Split(strings.TrimSpace(out.String()), "\n") {
  197. t.Logf("Output: line %d: %s", i, line)
  198. var s string
  199. if err := json.Unmarshal([]byte(line), &s); err != nil {
  200. t.Fatal(err)
  201. }
  202. assert.Equal(t, s, networks[i].ID)
  203. }
  204. }