github.com/altipla-consulting/ravendb-go-client@v0.1.3/tests/hi_lo_test.go (about)

     1  package tests
     2  
     3  import (
     4  	"testing"
     5  
     6  	ravendb "github.com/altipla-consulting/ravendb-go-client"
     7  	"github.com/stretchr/testify/assert"
     8  )
     9  
    10  type HiLoDoc struct {
    11  	Max int64 `json:"Max"`
    12  }
    13  
    14  type Product struct {
    15  	ProductName string `json:"ProductName"`
    16  }
    17  
    18  func hiloTestCapacityShouldDouble(t *testing.T, driver *RavenTestDriver) {
    19  	var err error
    20  	store := driver.getDocumentStoreMust(t)
    21  	defer store.Close()
    22  
    23  	hiLoIdGenerator := ravendb.NewHiLoIDGenerator("users", store, store.GetDatabase(), store.GetConventions().GetIdentityPartsSeparator())
    24  
    25  	{
    26  		session := openSessionMust(t, store)
    27  		hiloDoc := &HiLoDoc{
    28  			Max: 64,
    29  		}
    30  
    31  		err = session.StoreWithID(hiloDoc, "Raven/Hilo/users")
    32  		assert.NoError(t, err)
    33  		err = session.SaveChanges()
    34  		assert.NoError(t, err)
    35  
    36  		for i := 0; i < 32; i++ {
    37  			hiLoIdGenerator.GenerateDocumentID(&User{})
    38  		}
    39  		session.Close()
    40  	}
    41  
    42  	{
    43  		session := openSessionMust(t, store)
    44  
    45  		var hiloDoc *HiLoDoc
    46  		err = session.Load(&hiloDoc, "Raven/Hilo/users")
    47  		assert.NoError(t, err)
    48  		max := hiloDoc.Max
    49  		assert.Equal(t, max, int64(96))
    50  
    51  		//we should be receiving a range of 64 now
    52  		hiLoIdGenerator.GenerateDocumentID(&User{})
    53  		session.Close()
    54  	}
    55  
    56  	{
    57  		session := openSessionMust(t, store)
    58  
    59  		var hiloDoc *HiLoDoc
    60  		err = session.Load(&hiloDoc, "Raven/Hilo/users")
    61  		assert.NoError(t, err)
    62  		max := hiloDoc.Max
    63  
    64  		// TODO: in Java it's 160. On Travis CI (linux) it's 160
    65  		// On my mac, it's 128.
    66  		// It's strange because the requests sent for
    67  		// /databases/test_db_1/hilo/next are exactly the
    68  		// same but in Java case the server sends back "High": 160
    69  		// and in Go case it's "High": 128
    70  		// Maybe it's KeepAlive difference?
    71  		valid := (max == 96+64) || (max == 96+32)
    72  		assert.True(t, valid)
    73  		session.Close()
    74  	}
    75  }
    76  
    77  func hiloTestReturnUnusedRangeOnClose(t *testing.T, driver *RavenTestDriver) {
    78  	var err error
    79  	store := driver.getDocumentStoreMust(t)
    80  	defer store.Close()
    81  
    82  	urls := store.GetUrls()
    83  	newStore := ravendb.NewDocumentStore(urls, "")
    84  	newStore.SetDatabase(store.GetDatabase())
    85  
    86  	err = newStore.Initialize()
    87  	assert.NoError(t, err)
    88  
    89  	{
    90  		session := openSessionMust(t, newStore)
    91  		assert.NoError(t, err)
    92  		assert.NotNil(t, session)
    93  
    94  		hiloDoc := &HiLoDoc{
    95  			Max: 32,
    96  		}
    97  		err = session.StoreWithID(hiloDoc, "Raven/Hilo/users")
    98  		assert.NoError(t, err)
    99  		err = session.SaveChanges()
   100  		assert.NoError(t, err)
   101  
   102  		err = session.Store(&User{})
   103  		assert.NoError(t, err)
   104  		err = session.Store(&User{})
   105  		assert.NoError(t, err)
   106  		err = session.SaveChanges()
   107  		assert.NoError(t, err)
   108  		session.Close()
   109  	}
   110  
   111  	newStore.Close() //on document Store close, hilo-return should be called
   112  
   113  	newStore = ravendb.NewDocumentStore(nil, store.GetDatabase())
   114  	newStore.SetUrls(store.GetUrls())
   115  
   116  	err = newStore.Initialize()
   117  	assert.NoError(t, err)
   118  
   119  	{
   120  		session := openSessionMust(t, newStore)
   121  		assert.NoError(t, err)
   122  		assert.NotNil(t, session)
   123  
   124  		var hiloDoc *HiLoDoc
   125  		err = session.Load(&hiloDoc, "Raven/Hilo/users")
   126  		assert.NoError(t, err)
   127  		max := hiloDoc.Max
   128  		assert.Equal(t, max, int64(34))
   129  		session.Close()
   130  	}
   131  
   132  	newStore.Close() //on document Store close, hilo-return should be called
   133  }
   134  
   135  func hiloTestCanNotGoDown(t *testing.T, driver *RavenTestDriver) {
   136  	var err error
   137  	store := driver.getDocumentStoreMust(t)
   138  	defer store.Close()
   139  
   140  	session := openSessionMust(t, store)
   141  
   142  	hiloDoc := &HiLoDoc{
   143  		Max: 32,
   144  	}
   145  
   146  	err = session.StoreWithID(hiloDoc, "Raven/Hilo/users")
   147  	assert.NoError(t, err)
   148  	err = session.SaveChanges()
   149  	assert.NoError(t, err)
   150  	assert.Nil(t, err)
   151  
   152  	hiLoKeyGenerator := ravendb.NewHiLoIDGenerator("users", store, store.GetDatabase(), store.GetConventions().GetIdentityPartsSeparator())
   153  
   154  	nextID, err := hiLoKeyGenerator.NextID()
   155  	assert.Nil(t, err)
   156  	ids := []int64{nextID}
   157  
   158  	hiloDoc.Max = 12
   159  	session.StoreWithChangeVectorAndID(hiloDoc, "", "Raven/Hilo/users")
   160  	err = session.SaveChanges()
   161  	assert.Nil(t, err)
   162  
   163  	for i := 0; i < 128; i++ {
   164  		nextID, err = hiLoKeyGenerator.NextID()
   165  		assert.NoError(t, err)
   166  		contains := int64ArrayContains(ids, nextID)
   167  		assert.False(t, contains)
   168  		ids = append(ids, nextID)
   169  	}
   170  	assert.False(t, int64ArrayHasDuplicates(ids))
   171  	session.Close()
   172  }
   173  
   174  func int64ArrayContains(a []int64, n int64) bool {
   175  	for _, el := range a {
   176  		if el == n {
   177  			return true
   178  		}
   179  	}
   180  	return false
   181  }
   182  
   183  func hiloTestMultiDb(t *testing.T, driver *RavenTestDriver) {
   184  	var err error
   185  	store := driver.getDocumentStoreMust(t)
   186  	defer store.Close()
   187  
   188  	session := openSessionMust(t, store)
   189  
   190  	hiloDoc := &HiLoDoc{
   191  		Max: 64,
   192  	}
   193  	err = session.StoreWithID(hiloDoc, "Raven/Hilo/users")
   194  	assert.NoError(t, err)
   195  
   196  	productsHilo := &HiLoDoc{
   197  		Max: 128,
   198  	}
   199  	err = session.StoreWithID(productsHilo, "Raven/Hilo/products")
   200  	assert.NoError(t, err)
   201  
   202  	err = session.SaveChanges()
   203  	assert.NoError(t, err)
   204  
   205  	multiDbHilo := ravendb.NewMultiDatabaseHiLoIDGenerator(store, store.GetConventions())
   206  	generateDocumentKey, err := multiDbHilo.GenerateDocumentID("", &User{})
   207  	assert.NoError(t, err)
   208  	assert.Equal(t, generateDocumentKey, "users/65-A")
   209  	generateDocumentKey, err = multiDbHilo.GenerateDocumentID("", &Product{})
   210  	assert.NoError(t, err)
   211  	assert.Equal(t, generateDocumentKey, "products/129-A")
   212  	session.Close()
   213  }
   214  
   215  func hiloTestDoesNotGetAnotherRangeWhenDoingParallelRequests(t *testing.T, driver *RavenTestDriver) {
   216  	// Note: not applicable to Go as we doesn't have Executor to limit concurrency
   217  }
   218  
   219  func TestHiLo(t *testing.T) {
   220  	driver := createTestDriver(t)
   221  	destroy := func() { destroyDriver(t, driver) }
   222  	defer recoverTest(t, destroy)
   223  
   224  	// matches order of java tests
   225  	hiloTestCapacityShouldDouble(t, driver)
   226  	hiloTestReturnUnusedRangeOnClose(t, driver)
   227  	hiloTestCanNotGoDown(t, driver)
   228  	hiloTestMultiDb(t, driver)
   229  
   230  	hiloTestDoesNotGetAnotherRangeWhenDoingParallelRequests(t, driver)
   231  }