network_test.go 5.2 KB

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