public void LevelDbWriteUserDataTest() { // Plan var operations = new KeyValuePair <byte[], MemCache.ResultCacheEntry> [3]; for (int i = 0; i < 3; i++) { byte[] key = TestUtils.FillArrayWithRandomBytes(20); var entry = new MemCache.ResultCacheEntry(); entry.ResultState = ResultState.Exist; entry.Sequence = 10; entry.Data = TestUtils.FillArrayWithRandomBytes(32768); // 32KB is maz size for a block, not that it matters for this operations[i] = new KeyValuePair <byte[], MemCache.ResultCacheEntry>(key, entry); } MemCache memCache = new MemCache(); // Do ReadOnlySpan <byte> result = memCache.EncodeBatch(operations); // Check SpanReader reader = new SpanReader(result); Assert.AreEqual(10, reader.ReadInt64(), "Sequence number"); Assert.AreEqual(3, reader.ReadInt32(), "Operations count"); for (int i = 0; i < 3; i++) { var expectedKey = operations[i].Key; var expectedData = operations[i].Value.Data; Assert.AreEqual(1, reader.ReadByte(), "Operations type PUT"); var keyLen = reader.ReadVarLong(); Assert.AreEqual(expectedKey.Length, keyLen, "Key len"); Assert.AreEqual(expectedKey, reader.Read(keyLen).ToArray(), "Key"); var dataLen = reader.ReadVarLong(); Assert.AreEqual(expectedData.Length, dataLen, "Data len"); Assert.AreEqual(expectedData, reader.Read(dataLen).ToArray(), "Data"); } // test encoding complete blocks var stream = new MemoryStream(); LogWriter writer = new LogWriter(stream); writer.WriteData(result); Assert.Less(0, stream.Length); stream.Position = 0; // Roundtrip test by making sure i can read blocks I've encoded myself. LogReader logReader = new LogReader(stream); logReader.Open(); MemCache memCache2 = new MemCache(); memCache2.Load(logReader); var cache = memCache2._resultCache; Assert.AreEqual(3, cache.Count); int j = 0; foreach (var entry in cache) { var expectedKey = operations[j].Key; var expectedData = operations[j].Value.Data; Assert.AreEqual(ResultState.Exist, entry.Value.ResultState, "Value exists"); Assert.AreEqual(expectedKey.Length, entry.Key.Length, "Key len"); Assert.AreEqual(expectedKey, entry.Key, "Key"); Assert.AreEqual(expectedData.Length, entry.Value.Data.Length, "Data len"); Assert.AreEqual(expectedData, entry.Value.Data, "Data"); j++; } }