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  }