github.com/xiaobinqt/libcompose@v1.1.0/docker/service/name_test.go (about) 1 package service 2 3 import ( 4 "fmt" 5 "testing" 6 7 "golang.org/x/net/context" 8 9 "github.com/docker/docker/api/types" 10 "github.com/docker/docker/client" 11 "github.com/pkg/errors" 12 "github.com/xiaobinqt/libcompose/labels" 13 ) 14 15 func TestSingleNamer(t *testing.T) { 16 expectedName := "myName" 17 expectedNumber := 1 18 namer := NewSingleNamer("myName") 19 for i := 0; i < 10; i++ { 20 name, number := namer.Next() 21 if name != expectedName { 22 t.Fatalf("expected %s, got %s", expectedName, name) 23 } 24 if number != expectedNumber { 25 t.Fatalf("expected %d, got %d", expectedNumber, number) 26 } 27 } 28 } 29 30 type NamerClient struct { 31 client.Client 32 err error 33 expectedLabelFilters []string 34 containers []types.Container 35 } 36 37 func (client *NamerClient) ContainerList(ctx context.Context, options types.ContainerListOptions) ([]types.Container, error) { 38 if len(client.expectedLabelFilters) > 1 { 39 labelFilters := options.Filters.Get("label") 40 if len(labelFilters) != len(client.expectedLabelFilters) { 41 return []types.Container{}, fmt.Errorf("expected filters %v, got %v", client.expectedLabelFilters, labelFilters) 42 } 43 for _, expectedLabelFilter := range client.expectedLabelFilters { 44 found := false 45 for _, labelFilter := range labelFilters { 46 if labelFilter == expectedLabelFilter { 47 found = true 48 break 49 } 50 } 51 if !found { 52 return []types.Container{}, fmt.Errorf("expected to find filter %s, did not in %v", expectedLabelFilter, labelFilters) 53 } 54 } 55 } 56 return client.containers, client.err 57 } 58 59 func TestDefaultNamerClientError(t *testing.T) { 60 client := &NamerClient{ 61 err: errors.New("Engine no longer exists"), 62 } 63 _, err := NewNamer(context.Background(), client, "project", "service", false) 64 if err == nil || err.Error() != "Engine no longer exists" { 65 t.Fatalf("expected an error 'Engine no longer exists', got %s", err) 66 } 67 } 68 69 func TestDefaultNamerLabelNotANumber(t *testing.T) { 70 client := &NamerClient{ 71 containers: []types.Container{ 72 { 73 Labels: map[string]string{ 74 labels.ONEOFF.Str(): "IAmAString", 75 }, 76 }, 77 }, 78 } 79 _, err := NewNamer(context.Background(), client, "project", "service", false) 80 if err == nil { 81 t.Fatal("expected an error, got nothing") 82 } 83 } 84 85 func TestDefaultNamer(t *testing.T) { 86 cases := []struct { 87 projectName string 88 serviceName string 89 oneOff bool 90 containers []types.Container 91 expectedLabels []string 92 expectedName string 93 expectedNumber int 94 }{ 95 { 96 projectName: "", 97 serviceName: "", 98 oneOff: false, 99 containers: []types.Container{}, 100 expectedLabels: []string{ 101 fmt.Sprintf("%s=", labels.PROJECT.Str()), 102 fmt.Sprintf("%s=", labels.SERVICE.Str()), 103 fmt.Sprintf("%s=False", labels.ONEOFF.Str()), 104 }, 105 expectedName: "__1", 106 expectedNumber: 1, 107 }, 108 { 109 projectName: "project", 110 serviceName: "service", 111 oneOff: false, 112 containers: []types.Container{}, 113 expectedLabels: []string{ 114 fmt.Sprintf("%s=project", labels.PROJECT.Str()), 115 fmt.Sprintf("%s=service", labels.SERVICE.Str()), 116 fmt.Sprintf("%s=False", labels.ONEOFF.Str()), 117 }, 118 expectedName: "project_service_1", 119 expectedNumber: 1, 120 }, 121 { 122 projectName: "project", 123 serviceName: "service", 124 oneOff: false, 125 containers: []types.Container{ 126 { 127 Labels: map[string]string{ 128 labels.NUMBER.Str(): "1", 129 }, 130 }, 131 }, 132 expectedLabels: []string{ 133 fmt.Sprintf("%s=project", labels.PROJECT.Str()), 134 fmt.Sprintf("%s=service", labels.SERVICE.Str()), 135 fmt.Sprintf("%s=False", labels.ONEOFF.Str()), 136 }, 137 expectedName: "project_service_2", 138 expectedNumber: 2, 139 }, 140 { 141 projectName: "project", 142 serviceName: "anotherservice", 143 oneOff: false, 144 containers: []types.Container{ 145 { 146 Labels: map[string]string{ 147 labels.NUMBER.Str(): "10", 148 }, 149 }, 150 }, 151 expectedLabels: []string{ 152 fmt.Sprintf("%s=project", labels.PROJECT.Str()), 153 fmt.Sprintf("%s=anotherservice", labels.SERVICE.Str()), 154 fmt.Sprintf("%s=False", labels.ONEOFF.Str()), 155 }, 156 expectedName: "project_anotherservice_11", 157 expectedNumber: 11, 158 }, 159 } 160 161 for _, c := range cases { 162 client := &NamerClient{ 163 expectedLabelFilters: c.expectedLabels, 164 containers: c.containers, 165 } 166 namer, err := NewNamer(context.Background(), client, c.projectName, c.serviceName, c.oneOff) 167 if err != nil { 168 t.Error(err) 169 } 170 name, number := namer.Next() 171 if name != c.expectedName { 172 t.Errorf("Expected %s, got %s for %v", c.expectedName, name, c) 173 } 174 if number != c.expectedNumber { 175 t.Errorf("Expected %d, got %d for %v", c.expectedNumber, number, c) 176 } 177 _, number = namer.Next() 178 if number != c.expectedNumber+1 { 179 t.Errorf("Expected a 2nd call to increment numbre to %d, got %d for %v", c.expectedNumber+1, number, c) 180 } 181 } 182 }