github.com/ravendb/ravendb-go-client@v0.0.0-20240229102137-4474ee7aa0fa/tests/hi_lo_test.go (about) 1 package tests 2 3 import ( 4 "testing" 5 6 ravendb "github.com/ravendb/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 }