private async Task ValidateSessionAsync(HashSet <FullCacheRecord> expectedRecords, ICache cache, string sessionId, FakeBuild.CasAccessMethod accessMethod) { if (!ImplementsTrackedSessions || DummySessionName != null) { return; } ICacheReadOnlySession readOnlySession = (await cache.CreateReadOnlySessionAsync()).Success(); // Check that the content is fine HashSet <FullCacheRecord> foundRecords = new HashSet <FullCacheRecord>(); foreach (var strongFingerprintTask in cache.EnumerateSessionStrongFingerprints(DummySessionName ?? sessionId).Success().OutOfOrderTasks()) { StrongFingerprint strongFingerprint = await strongFingerprintTask; CasEntries casEntries = (await readOnlySession.GetCacheEntryAsync(strongFingerprint)).Success(); FullCacheRecord record = new FullCacheRecord(strongFingerprint, casEntries); XAssert.IsTrue(expectedRecords.Contains(record), "Found record that was not expected!"); foundRecords.Add(record); } (await readOnlySession.CloseAsync()).Success(); await FakeBuild.CheckContentsAsync(cache, foundRecords, accessMethod); XAssert.AreEqual(expectedRecords.Count, foundRecords.Count); }
/// <summary> /// Check the fake build via the cache given /// </summary> /// <param name="cache">The cache to read from (uses a read-only session)</param> /// <param name="index">The "index" CasHash</param> /// <param name="entries">The CasHash entries that should match the index</param> /// <param name="accessMethod">Method (File or stream) for how files are materialized from the cache</param> /// <returns>Success if all worked</returns> /// <remarks> /// This is tied to the FakeBuild where the set of results is /// made as the index file which we use in the strong fingerprint /// and basically describes the set of entries that should be in the CasEntries /// </remarks> public static async Task CheckContentsAsync(ICache cache, CasHash index, CasEntries entries, CasAccessMethod accessMethod = CasAccessMethod.Stream) { Contract.Requires(cache != null); Contract.Requires(entries.IsValid); ICacheReadOnlySession session = await cache.CreateReadOnlySessionAsync().SuccessAsync(); await CheckContentsAsync(session, index, entries, accessMethod); await session.CloseAsync().SuccessAsync(); }
public Task <Possible <string, Failure> > CloseAsync(Guid activityId) { var callback = CloseAsyncCallback; if (callback != null) { return(callback(activityId, m_realSession)); } else { return(m_realSession.CloseAsync(activityId)); } }
/// <summary> /// Check that the fake build contents are available and correct /// </summary> /// <param name="cache">The cache to read from (uses a read-only session)</param> /// <param name="records">The full cache records to check</param> /// <param name="accessMethod">Method (File or stream) for how files are materialized from the cache</param> /// <returns>Success if all worked</returns> /// <remarks> /// This is tied to the FakeBuild where the set of results is /// made as the index file which we use in the strong fingerprint /// and basically describes the set of entries that should be in the CasEntries /// </remarks> public static async Task CheckContentsAsync(ICache cache, IEnumerable <FullCacheRecord> records, CasAccessMethod accessMethod = CasAccessMethod.Stream) { Contract.Requires(cache != null); Contract.Requires(records != null); ICacheReadOnlySession session = await cache.CreateReadOnlySessionAsync().SuccessAsync(); foreach (FullCacheRecord record in records) { await CheckContentsAsync(session, record.StrongFingerprint.CasElement, record.CasEntries, accessMethod); } await session.CloseAsync().SuccessAsync(); }
public async Task <Possible <string, Failure> > CloseAsync(Guid activityId) { var casClose = m_casSession.CloseAsync(activityId); var metadataClose = m_metadataSession.CloseAsync(activityId); var metadataPossible = await metadataClose; var casPossible = await casClose; if (casPossible.Succeeded) { return(metadataPossible); } if (metadataPossible.Succeeded) { return(casPossible); } return(new AggregateFailure(metadataPossible.Failure, casPossible.Failure)); }
public async Task CacheDataPersistedReadOnlyCache() { string testName = "CacheDataPersistedReadOnly"; ICache firstInvocation = await CreateCacheAsync(testName, true); Guid originalGuid = firstInvocation.CacheGuid; ICacheSession session = (await firstInvocation.CreateSessionAsync("sessionName")).Success(); FullCacheRecord cacheRecord = await FakeBuild.DoPipAsync(session, "PipA"); (await session.CloseAsync()).Success(); await ShutdownCacheAsync(firstInvocation, testName); ICache secondInvocation = await GetExistingCacheAsync(testName, true, true); XAssert.AreEqual(originalGuid, secondInvocation.CacheGuid, "Persistent caches: GUID should not change"); XAssert.IsTrue(secondInvocation.IsReadOnly, "This should have been a read-only cache"); ICacheReadOnlySession newSession = (await secondInvocation.CreateReadOnlySessionAsync()).Success(); int fingerprintsFound = 0; foreach (var singleFingerprint in newSession.EnumerateStrongFingerprints(cacheRecord.StrongFingerprint.WeakFingerprint)) { var sfp = (await singleFingerprint).Success(); XAssert.AreEqual(cacheRecord.StrongFingerprint, sfp, "Fingerprints must match"); fingerprintsFound++; } XAssert.AreEqual(1, fingerprintsFound, "A single instance of the fingerprint should have been found after restarting the cache."); (await newSession.CloseAsync()).Success(); await ShutdownCacheAsync(secondInvocation, testName); }
public async Task SimpleDummySession() { const string TestName = "SimpleSession"; string testCacheId = MakeCacheId(TestName); ICache cache = await CreateCacheAsync(testCacheId); // Now for the session (which we base on the cache ID) string testSessionId = "Session1-" + testCacheId; ICacheSession session = await CreateSessionAsync(cache, testSessionId); // Do the default fake build for this test (first time, no cache hit) FullCacheRecord built = await FakeBuild.DoPipAsync(session, TestName); XAssert.AreEqual(FakeBuild.NewRecordCacheId, built.CacheId, "Should have been a new cache entry!"); // Now we see if we can get back the items we think we should await CloseSessionAsync(session, testSessionId); // We need a read only session to get the CasEntries ICacheReadOnlySession readOnlySession = (await cache.CreateReadOnlySessionAsync()).Success(); // Validate that the cache contains a dummy session and it has the one cache record it needs. HashSet <FullCacheRecord> found = new HashSet <FullCacheRecord>(); foreach (var strongFingerprintTask in cache.EnumerateSessionStrongFingerprints(MemoizationStoreAdapterCache.DummySessionName).Success().OutOfOrderTasks()) { StrongFingerprint strongFingerprint = await strongFingerprintTask; CasEntries casEntries = (await readOnlySession.GetCacheEntryAsync(strongFingerprint)).Success(); FullCacheRecord record = new FullCacheRecord(strongFingerprint, casEntries); // If it is not the record we already found... if (!found.Contains(record)) { found.Add(record); } XAssert.AreEqual(1, found.Count, "There should be only 1 unique record in the session"); XAssert.AreEqual(built.StrongFingerprint.WeakFingerprint, record.StrongFingerprint.WeakFingerprint); XAssert.AreEqual(built.StrongFingerprint.CasElement, record.StrongFingerprint.CasElement); XAssert.AreEqual(built.StrongFingerprint.HashElement, record.StrongFingerprint.HashElement); XAssert.AreEqual(built.CasEntries.Count, record.CasEntries.Count, "Did not return the same number of items"); XAssert.IsTrue(record.CasEntries.Equals(built.CasEntries), "Items returned are not the same hash and/or order order"); XAssert.AreEqual(built, record); // We can not check record.CasEntries.IsDeterministic // as the cache may have determined that they are deterministic // via cache determinism recovery. } XAssert.AreEqual(1, found.Count, "There should be 1 and only 1 record in the session!"); await readOnlySession.CloseAsync().SuccessAsync(); // Check that the cache has the items in it await FakeBuild.CheckContentsAsync(cache, built); // Now redo the "build" with a cache hit testSessionId = "Session2-" + testCacheId; session = await CreateSessionAsync(cache, testSessionId); FullCacheRecord rebuilt = await FakeBuild.DoPipAsync(session, TestName); XAssert.AreEqual(built, rebuilt, "Should have been the same build!"); // We make sure we did get it from a cache rather than a manual rebuild. XAssert.AreNotEqual(built.CacheId, rebuilt.CacheId, "Should not be the same cache ID"); await CloseSessionAsync(session, testSessionId); readOnlySession = await cache.CreateReadOnlySessionAsync().SuccessAsync(); // Now that we have done the second build via a cache hit, it should produce the // same cache record as before foreach (var strongFingerprintTask in cache.EnumerateSessionStrongFingerprints(MemoizationStoreAdapterCache.DummySessionName).Success().OutOfOrderTasks()) { StrongFingerprint strongFingerprint = await strongFingerprintTask; CasEntries casEntries = (await readOnlySession.GetCacheEntryAsync(strongFingerprint)).Success(); FullCacheRecord record = new FullCacheRecord(strongFingerprint, casEntries); XAssert.IsTrue(found.Contains(record), "Second session should produce the same cache record but did not!"); } (await readOnlySession.CloseAsync()).Success(); await ShutdownCacheAsync(cache, testCacheId); }
public Task <Possible <string, Failure> > CloseAsync(Guid activityId) { return(m_session.CloseAsync(activityId)); }