(t *testing.T)
| 1466 | } |
| 1467 | |
| 1468 | func TestUnusedSequencesInSyncData(t *testing.T) { |
| 1469 | if !base.TestUseXattrs() { |
| 1470 | t.Skip("This test requires xattrs because it writes directly to the xattr") |
| 1471 | } |
| 1472 | |
| 1473 | base.SetUpTestLogging(t, base.LevelDebug, base.KeyChanges, base.KeyCache) |
| 1474 | |
| 1475 | db, ctx := setupTestDB(t) |
| 1476 | defer db.Close(ctx) |
| 1477 | collection, ctx := GetSingleDatabaseCollectionWithUser(ctx, t, db) |
| 1478 | docID := t.Name() |
| 1479 | |
| 1480 | // add a doc and wait for it to be cached |
| 1481 | body := Body{"val": "one"} |
| 1482 | _, _, err := collection.Put(ctx, docID, body) |
| 1483 | require.NoError(t, err) |
| 1484 | err = db.changeCache.waitForSequence(ctx, 1, base.DefaultWaitForSequence) |
| 1485 | require.NoError(t, err) |
| 1486 | |
| 1487 | // grab doc and alter sync data as it had some unused sequences allocated ot it |
| 1488 | xattrs, cas, err := collection.dataStore.GetXattrs(ctx, docID, []string{base.SyncXattrName}) |
| 1489 | require.NoError(t, err) |
| 1490 | |
| 1491 | var retrievedXattr map[string]interface{} |
| 1492 | require.NoError(t, base.JSONUnmarshal(xattrs[base.SyncXattrName], &retrievedXattr)) |
| 1493 | retrievedXattr["sequence"] = uint64(6) |
| 1494 | retrievedXattr["unused_sequences"] = []uint64{2, 3, 4, 5} |
| 1495 | newXattrVal := map[string][]byte{ |
| 1496 | base.SyncXattrName: base.MustJSONMarshal(t, retrievedXattr), |
| 1497 | } |
| 1498 | _, err = collection.dataStore.UpdateXattrs(ctx, docID, 0, cas, newXattrVal, nil) |
| 1499 | require.NoError(t, err) |
| 1500 | |
| 1501 | // assert that sequence 6 is seen over caching feed |
| 1502 | err = db.changeCache.waitForSequence(ctx, 6, base.DefaultWaitForSequence) |
| 1503 | require.NoError(t, err) |
| 1504 | |
| 1505 | // assert that only 2 sequences have been cached (unused sequences are not cached) |
| 1506 | db.UpdateCalculatedStats(ctx) |
| 1507 | assert.Equal(t, int64(6), db.DbStats.Cache().HighSeqCached.Value()) |
| 1508 | assert.Equal(t, int64(2), db.DbStats.Database().DCPCachingCount.Value()) |
| 1509 | } |
| 1510 | |
| 1511 | // Trigger initialization of empty cache, then write and validate a subsequent changes request returns expected data. |
| 1512 | func TestInitializeEmptyCache(t *testing.T) { |
nothing calls this directly
no test coverage detected