github.com/daaku/docker@v1.5.0/pkg/truncindex/truncindex_test.go (about)

     1  package truncindex
     2  
     3  import (
     4  	"math/rand"
     5  	"testing"
     6  
     7  	"github.com/docker/docker/utils"
     8  )
     9  
    10  // Test the behavior of TruncIndex, an index for querying IDs from a non-conflicting prefix.
    11  func TestTruncIndex(t *testing.T) {
    12  	ids := []string{}
    13  	index := NewTruncIndex(ids)
    14  	// Get on an empty index
    15  	if _, err := index.Get("foobar"); err == nil {
    16  		t.Fatal("Get on an empty index should return an error")
    17  	}
    18  
    19  	// Spaces should be illegal in an id
    20  	if err := index.Add("I have a space"); err == nil {
    21  		t.Fatalf("Adding an id with ' ' should return an error")
    22  	}
    23  
    24  	id := "99b36c2c326ccc11e726eee6ee78a0baf166ef96"
    25  	// Add an id
    26  	if err := index.Add(id); err != nil {
    27  		t.Fatal(err)
    28  	}
    29  
    30  	// Add an empty id (should fail)
    31  	if err := index.Add(""); err == nil {
    32  		t.Fatalf("Adding an empty id should return an error")
    33  	}
    34  
    35  	// Get a non-existing id
    36  	assertIndexGet(t, index, "abracadabra", "", true)
    37  	// Get an empty id
    38  	assertIndexGet(t, index, "", "", true)
    39  	// Get the exact id
    40  	assertIndexGet(t, index, id, id, false)
    41  	// The first letter should match
    42  	assertIndexGet(t, index, id[:1], id, false)
    43  	// The first half should match
    44  	assertIndexGet(t, index, id[:len(id)/2], id, false)
    45  	// The second half should NOT match
    46  	assertIndexGet(t, index, id[len(id)/2:], "", true)
    47  
    48  	id2 := id[:6] + "blabla"
    49  	// Add an id
    50  	if err := index.Add(id2); err != nil {
    51  		t.Fatal(err)
    52  	}
    53  	// Both exact IDs should work
    54  	assertIndexGet(t, index, id, id, false)
    55  	assertIndexGet(t, index, id2, id2, false)
    56  
    57  	// 6 characters or less should conflict
    58  	assertIndexGet(t, index, id[:6], "", true)
    59  	assertIndexGet(t, index, id[:4], "", true)
    60  	assertIndexGet(t, index, id[:1], "", true)
    61  
    62  	// 7 characters should NOT conflict
    63  	assertIndexGet(t, index, id[:7], id, false)
    64  	assertIndexGet(t, index, id2[:7], id2, false)
    65  
    66  	// Deleting a non-existing id should return an error
    67  	if err := index.Delete("non-existing"); err == nil {
    68  		t.Fatalf("Deleting a non-existing id should return an error")
    69  	}
    70  
    71  	// Deleting an empty id should return an error
    72  	if err := index.Delete(""); err == nil {
    73  		t.Fatal("Deleting an empty id should return an error")
    74  	}
    75  
    76  	// Deleting id2 should remove conflicts
    77  	if err := index.Delete(id2); err != nil {
    78  		t.Fatal(err)
    79  	}
    80  	// id2 should no longer work
    81  	assertIndexGet(t, index, id2, "", true)
    82  	assertIndexGet(t, index, id2[:7], "", true)
    83  	assertIndexGet(t, index, id2[:11], "", true)
    84  
    85  	// conflicts between id and id2 should be gone
    86  	assertIndexGet(t, index, id[:6], id, false)
    87  	assertIndexGet(t, index, id[:4], id, false)
    88  	assertIndexGet(t, index, id[:1], id, false)
    89  
    90  	// non-conflicting substrings should still not conflict
    91  	assertIndexGet(t, index, id[:7], id, false)
    92  	assertIndexGet(t, index, id[:15], id, false)
    93  	assertIndexGet(t, index, id, id, false)
    94  }
    95  
    96  func assertIndexGet(t *testing.T, index *TruncIndex, input, expectedResult string, expectError bool) {
    97  	if result, err := index.Get(input); err != nil && !expectError {
    98  		t.Fatalf("Unexpected error getting '%s': %s", input, err)
    99  	} else if err == nil && expectError {
   100  		t.Fatalf("Getting '%s' should return an error, not '%s'", input, result)
   101  	} else if result != expectedResult {
   102  		t.Fatalf("Getting '%s' returned '%s' instead of '%s'", input, result, expectedResult)
   103  	}
   104  }
   105  
   106  func BenchmarkTruncIndexAdd100(b *testing.B) {
   107  	var testSet []string
   108  	for i := 0; i < 100; i++ {
   109  		testSet = append(testSet, utils.GenerateRandomID())
   110  	}
   111  	b.ResetTimer()
   112  	for i := 0; i < b.N; i++ {
   113  		index := NewTruncIndex([]string{})
   114  		for _, id := range testSet {
   115  			if err := index.Add(id); err != nil {
   116  				b.Fatal(err)
   117  			}
   118  		}
   119  	}
   120  }
   121  
   122  func BenchmarkTruncIndexAdd250(b *testing.B) {
   123  	var testSet []string
   124  	for i := 0; i < 250; i++ {
   125  		testSet = append(testSet, utils.GenerateRandomID())
   126  	}
   127  	b.ResetTimer()
   128  	for i := 0; i < b.N; i++ {
   129  		index := NewTruncIndex([]string{})
   130  		for _, id := range testSet {
   131  			if err := index.Add(id); err != nil {
   132  				b.Fatal(err)
   133  			}
   134  		}
   135  	}
   136  }
   137  
   138  func BenchmarkTruncIndexAdd500(b *testing.B) {
   139  	var testSet []string
   140  	for i := 0; i < 500; i++ {
   141  		testSet = append(testSet, utils.GenerateRandomID())
   142  	}
   143  	b.ResetTimer()
   144  	for i := 0; i < b.N; i++ {
   145  		index := NewTruncIndex([]string{})
   146  		for _, id := range testSet {
   147  			if err := index.Add(id); err != nil {
   148  				b.Fatal(err)
   149  			}
   150  		}
   151  	}
   152  }
   153  
   154  func BenchmarkTruncIndexGet100(b *testing.B) {
   155  	var testSet []string
   156  	var testKeys []string
   157  	for i := 0; i < 100; i++ {
   158  		testSet = append(testSet, utils.GenerateRandomID())
   159  	}
   160  	index := NewTruncIndex([]string{})
   161  	for _, id := range testSet {
   162  		if err := index.Add(id); err != nil {
   163  			b.Fatal(err)
   164  		}
   165  		l := rand.Intn(12) + 12
   166  		testKeys = append(testKeys, id[:l])
   167  	}
   168  	b.ResetTimer()
   169  	for i := 0; i < b.N; i++ {
   170  		for _, id := range testKeys {
   171  			if res, err := index.Get(id); err != nil {
   172  				b.Fatal(res, err)
   173  			}
   174  		}
   175  	}
   176  }
   177  
   178  func BenchmarkTruncIndexGet250(b *testing.B) {
   179  	var testSet []string
   180  	var testKeys []string
   181  	for i := 0; i < 250; i++ {
   182  		testSet = append(testSet, utils.GenerateRandomID())
   183  	}
   184  	index := NewTruncIndex([]string{})
   185  	for _, id := range testSet {
   186  		if err := index.Add(id); err != nil {
   187  			b.Fatal(err)
   188  		}
   189  		l := rand.Intn(12) + 12
   190  		testKeys = append(testKeys, id[:l])
   191  	}
   192  	b.ResetTimer()
   193  	for i := 0; i < b.N; i++ {
   194  		for _, id := range testKeys {
   195  			if res, err := index.Get(id); err != nil {
   196  				b.Fatal(res, err)
   197  			}
   198  		}
   199  	}
   200  }
   201  
   202  func BenchmarkTruncIndexGet500(b *testing.B) {
   203  	var testSet []string
   204  	var testKeys []string
   205  	for i := 0; i < 500; i++ {
   206  		testSet = append(testSet, utils.GenerateRandomID())
   207  	}
   208  	index := NewTruncIndex([]string{})
   209  	for _, id := range testSet {
   210  		if err := index.Add(id); err != nil {
   211  			b.Fatal(err)
   212  		}
   213  		l := rand.Intn(12) + 12
   214  		testKeys = append(testKeys, id[:l])
   215  	}
   216  	b.ResetTimer()
   217  	for i := 0; i < b.N; i++ {
   218  		for _, id := range testKeys {
   219  			if res, err := index.Get(id); err != nil {
   220  				b.Fatal(res, err)
   221  			}
   222  		}
   223  	}
   224  }
   225  
   226  func BenchmarkTruncIndexDelete100(b *testing.B) {
   227  	var testSet []string
   228  	for i := 0; i < 100; i++ {
   229  		testSet = append(testSet, utils.GenerateRandomID())
   230  	}
   231  	b.ResetTimer()
   232  	for i := 0; i < b.N; i++ {
   233  		b.StopTimer()
   234  		index := NewTruncIndex([]string{})
   235  		for _, id := range testSet {
   236  			if err := index.Add(id); err != nil {
   237  				b.Fatal(err)
   238  			}
   239  		}
   240  		b.StartTimer()
   241  		for _, id := range testSet {
   242  			if err := index.Delete(id); err != nil {
   243  				b.Fatal(err)
   244  			}
   245  		}
   246  	}
   247  }
   248  
   249  func BenchmarkTruncIndexDelete250(b *testing.B) {
   250  	var testSet []string
   251  	for i := 0; i < 250; i++ {
   252  		testSet = append(testSet, utils.GenerateRandomID())
   253  	}
   254  	b.ResetTimer()
   255  	for i := 0; i < b.N; i++ {
   256  		b.StopTimer()
   257  		index := NewTruncIndex([]string{})
   258  		for _, id := range testSet {
   259  			if err := index.Add(id); err != nil {
   260  				b.Fatal(err)
   261  			}
   262  		}
   263  		b.StartTimer()
   264  		for _, id := range testSet {
   265  			if err := index.Delete(id); err != nil {
   266  				b.Fatal(err)
   267  			}
   268  		}
   269  	}
   270  }
   271  
   272  func BenchmarkTruncIndexDelete500(b *testing.B) {
   273  	var testSet []string
   274  	for i := 0; i < 500; i++ {
   275  		testSet = append(testSet, utils.GenerateRandomID())
   276  	}
   277  	b.ResetTimer()
   278  	for i := 0; i < b.N; i++ {
   279  		b.StopTimer()
   280  		index := NewTruncIndex([]string{})
   281  		for _, id := range testSet {
   282  			if err := index.Add(id); err != nil {
   283  				b.Fatal(err)
   284  			}
   285  		}
   286  		b.StartTimer()
   287  		for _, id := range testSet {
   288  			if err := index.Delete(id); err != nil {
   289  				b.Fatal(err)
   290  			}
   291  		}
   292  	}
   293  }
   294  
   295  func BenchmarkTruncIndexNew100(b *testing.B) {
   296  	var testSet []string
   297  	for i := 0; i < 100; i++ {
   298  		testSet = append(testSet, utils.GenerateRandomID())
   299  	}
   300  	b.ResetTimer()
   301  	for i := 0; i < b.N; i++ {
   302  		NewTruncIndex(testSet)
   303  	}
   304  }
   305  
   306  func BenchmarkTruncIndexNew250(b *testing.B) {
   307  	var testSet []string
   308  	for i := 0; i < 250; i++ {
   309  		testSet = append(testSet, utils.GenerateRandomID())
   310  	}
   311  	b.ResetTimer()
   312  	for i := 0; i < b.N; i++ {
   313  		NewTruncIndex(testSet)
   314  	}
   315  }
   316  
   317  func BenchmarkTruncIndexNew500(b *testing.B) {
   318  	var testSet []string
   319  	for i := 0; i < 500; i++ {
   320  		testSet = append(testSet, utils.GenerateRandomID())
   321  	}
   322  	b.ResetTimer()
   323  	for i := 0; i < b.N; i++ {
   324  		NewTruncIndex(testSet)
   325  	}
   326  }
   327  
   328  func BenchmarkTruncIndexAddGet100(b *testing.B) {
   329  	var testSet []string
   330  	var testKeys []string
   331  	for i := 0; i < 500; i++ {
   332  		id := utils.GenerateRandomID()
   333  		testSet = append(testSet, id)
   334  		l := rand.Intn(12) + 12
   335  		testKeys = append(testKeys, id[:l])
   336  	}
   337  	b.ResetTimer()
   338  	for i := 0; i < b.N; i++ {
   339  		index := NewTruncIndex([]string{})
   340  		for _, id := range testSet {
   341  			if err := index.Add(id); err != nil {
   342  				b.Fatal(err)
   343  			}
   344  		}
   345  		for _, id := range testKeys {
   346  			if res, err := index.Get(id); err != nil {
   347  				b.Fatal(res, err)
   348  			}
   349  		}
   350  	}
   351  }
   352  
   353  func BenchmarkTruncIndexAddGet250(b *testing.B) {
   354  	var testSet []string
   355  	var testKeys []string
   356  	for i := 0; i < 500; i++ {
   357  		id := utils.GenerateRandomID()
   358  		testSet = append(testSet, id)
   359  		l := rand.Intn(12) + 12
   360  		testKeys = append(testKeys, id[:l])
   361  	}
   362  	b.ResetTimer()
   363  	for i := 0; i < b.N; i++ {
   364  		index := NewTruncIndex([]string{})
   365  		for _, id := range testSet {
   366  			if err := index.Add(id); err != nil {
   367  				b.Fatal(err)
   368  			}
   369  		}
   370  		for _, id := range testKeys {
   371  			if res, err := index.Get(id); err != nil {
   372  				b.Fatal(res, err)
   373  			}
   374  		}
   375  	}
   376  }
   377  
   378  func BenchmarkTruncIndexAddGet500(b *testing.B) {
   379  	var testSet []string
   380  	var testKeys []string
   381  	for i := 0; i < 500; i++ {
   382  		id := utils.GenerateRandomID()
   383  		testSet = append(testSet, id)
   384  		l := rand.Intn(12) + 12
   385  		testKeys = append(testKeys, id[:l])
   386  	}
   387  	b.ResetTimer()
   388  	for i := 0; i < b.N; i++ {
   389  		index := NewTruncIndex([]string{})
   390  		for _, id := range testSet {
   391  			if err := index.Add(id); err != nil {
   392  				b.Fatal(err)
   393  			}
   394  		}
   395  		for _, id := range testKeys {
   396  			if res, err := index.Get(id); err != nil {
   397  				b.Fatal(res, err)
   398  			}
   399  		}
   400  	}
   401  }