public async Task TestAssetSynchronization()
        {
            var code = @"class Test { void Method() { } }";

            using var workspace = TestWorkspace.CreateCSharp(code);
            var solution = workspace.CurrentSolution;

            // build checksum
            await solution.State.GetChecksumAsync(CancellationToken.None);

            var map = await solution.GetAssetMapAsync(CancellationToken.None);

            using var remoteWorkspace = CreateRemoteWorkspace();

            var sessionId   = 0;
            var storage     = new SolutionAssetCache();
            var assetSource = new SimpleAssetSource(workspace.Services.GetService <ISerializerService>(), map);

            var service = new AssetProvider(sessionId, storage, assetSource, remoteWorkspace.Services.GetService <ISerializerService>());
            await service.SynchronizeAssetsAsync(new HashSet <Checksum>(map.Keys), CancellationToken.None);

            foreach (var kv in map)
            {
                Assert.True(storage.TryGetAsset <object>(kv.Key, out _));
            }
        }
Esempio n. 2
0
        public async Task TestCleanup()
        {
            var storage = new SolutionAssetCache(
                cleanupInterval: TimeSpan.FromMilliseconds(1),
                purgeAfter: TimeSpan.FromMilliseconds(2),
                gcAfter: TimeSpan.FromMilliseconds(5)
                );

            var checksum = Checksum.Create(
                WellKnownSynchronizationKind.Null,
                ImmutableArray.CreateRange(Guid.NewGuid().ToByteArray())
                );
            var data = new object();

            Assert.True(storage.TryAddAsset(checksum, data));

            for (var i = 0; i < 10; i++)
            {
                await Task.Delay(10);

                if (!storage.TryGetAsset(checksum, out object _))
                {
                    // asset is deleted
                    return;
                }
            }

            // it should not reach here
            Assert.True(false, "asset not cleaned up");
        }
        private async Task TestAssetAsync(object data)
        {
            var sessionId = 0;
            var checksum  = Checksum.Create(WellKnownSynchronizationKind.Null, ImmutableArray.CreateRange(Guid.NewGuid().ToByteArray()));

            using var workspace = TestWorkspace.CreateCSharp(file: @"");

            using var remoteWorkspace = CreateRemoteWorkspace();

            var storage     = new SolutionAssetCache();
            var assetSource = new SimpleAssetSource(workspace.Services.GetService <ISerializerService>(), new Dictionary <Checksum, object>()
            {
                { checksum, data }
            });

            var provider = new AssetProvider(sessionId, storage, assetSource, remoteWorkspace.Services.GetService <ISerializerService>());
            var stored   = await provider.GetAssetAsync <object>(checksum, CancellationToken.None);

            Assert.Equal(data, stored);

            var stored2 = await provider.GetAssetsAsync <object>(new[] { checksum }, CancellationToken.None);

            Assert.Equal(1, stored2.Count);

            Assert.Equal(checksum, stored2[0].Item1);
            Assert.Equal(data, stored2[0].Item2);
        }
Esempio n. 4
0
        public async Task TestSolutionSynchronization()
        {
            var code = @"class Test { void Method() { } }";

            using var workspace = TestWorkspace.CreateCSharp(code);
            var solution = workspace.CurrentSolution;

            // build checksum
            await solution.State.GetChecksumAsync(CancellationToken.None);

            var map = await solution.GetAssetMapAsync(CancellationToken.None);

            using var remoteWorkspace = CreateRemoteWorkspace();

            var sessionId   = 0;
            var storage     = new SolutionAssetCache();
            var assetSource = new SimpleAssetSource(
                workspace.Services.GetService <ISerializerService>(),
                map
                );

            var service = new AssetProvider(
                sessionId,
                storage,
                assetSource,
                remoteWorkspace.Services.GetService <ISerializerService>()
                );
            await service.SynchronizeSolutionAssetsAsync(
                await solution.State.GetChecksumAsync(CancellationToken.None),
                CancellationToken.None
                );

            TestUtils.VerifyAssetStorage(map, storage);
        }
        public void TestGetAssets()
        {
            var storage = new SolutionAssetCache();

            var checksum = Checksum.Create(WellKnownSynchronizationKind.Null, ImmutableArray.CreateRange(Guid.NewGuid().ToByteArray()));
            var data     = new object();

            Assert.True(storage.TryAddAsset(checksum, data));

            Assert.True(storage.TryGetAsset(checksum, out object _));
        }
 public WorkspaceManager(SolutionAssetCache assetStorage, Type[]?additionalRemoteParts)
     : base(assetStorage)
 {
     LazyWorkspace = new Lazy <RemoteWorkspace>(
         () =>
         new RemoteWorkspace(
             FeaturesTestCompositions.RemoteHost
             .AddParts(additionalRemoteParts)
             .GetHostServices(),
             WorkspaceKind.RemoteWorkspace
             )
         );
 }
Esempio n. 7
0
        private static async Task <AssetProvider> GetAssetProviderAsync(Workspace workspace, Workspace remoteWorkspace, Solution solution, Dictionary <Checksum, object> map = null)
        {
            // make sure checksum is calculated
            await solution.State.GetChecksumAsync(CancellationToken.None);

            map ??= new Dictionary <Checksum, object>();
            await solution.AppendAssetMapAsync(map, CancellationToken.None);

            var sessionId   = Checksum.Create(ImmutableArray.CreateRange(Guid.NewGuid().ToByteArray()));
            var storage     = new SolutionAssetCache();
            var assetSource = new SimpleAssetSource(workspace.Services.GetService <ISerializerService>(), map);

            return(new AssetProvider(sessionId, storage, assetSource, remoteWorkspace.Services.GetService <ISerializerService>()));
        }
            public WorkspaceManager(SolutionAssetCache assetStorage, ConcurrentDictionary <Guid, TestGeneratorReference> sharedTestGeneratorReferences, Type[]?additionalRemoteParts)
                : base(assetStorage)
            {
                LazyWorkspace = new Lazy <RemoteWorkspace>(
                    () =>
                {
                    var hostServices = FeaturesTestCompositions.RemoteHost.AddParts(additionalRemoteParts).GetHostServices();

                    // We want to allow references to source generators to be shared between the "in proc" and "remote" workspaces and
                    // MEF compositions, so tell the serializer service to use the same map for this "remote" workspace as the in-proc one.
                    ((IMefHostExportProvider)hostServices).GetExportedValue <TestSerializerService.Factory>().SharedTestGeneratorReferences = sharedTestGeneratorReferences;
                    return(new RemoteWorkspace(hostServices, WorkspaceKind.RemoteWorkspace));
                });
            }
Esempio n. 9
0
        private static async Task <AssetProvider> GetAssetProviderAsync(Workspace workspace, Workspace remoteWorkspace, Solution solution, Dictionary <Checksum, object> map = null)
        {
            // make sure checksum is calculated
            await solution.State.GetChecksumAsync(CancellationToken.None);

            map ??= new Dictionary <Checksum, object>();
            await solution.AppendAssetMapAsync(includeProjectCones : true, map, CancellationToken.None);

            var sessionId   = 0;
            var storage     = new SolutionAssetCache();
            var assetSource = new SimpleAssetSource(workspace.Services.GetService <ISerializerService>(), map);

            return(new AssetProvider(sessionId, storage, assetSource, remoteWorkspace.Services.GetService <ISerializerService>()));
        }
Esempio n. 10
0
        public static void VerifyAssetStorage <T>(
            IEnumerable <KeyValuePair <Checksum, T> > items,
            SolutionAssetCache storage
            )
        {
            foreach (var kv in items)
            {
                if (kv.Value is ChecksumCollection)
                {
                    // ChecksumCollection itself won't be in asset storage. since
                    // it will be never asked from OOP side to host to sync.
                    // the collection is already part of
                    // Solution/Project/DocumentStateCheckum so syncing
                    // state checksum automatically bring in the collection.
                    // it only exist to calculate hierarchical checksum
                    continue;
                }

                Assert.True(storage.TryGetAsset(kv.Key, out object _));
            }
        }
Esempio n. 11
0
        public async Task TestProjectSynchronization()
        {
            var code = @"class Test { void Method() { } }";

            using var workspace = TestWorkspace.CreateCSharp(code);
            var project = workspace.CurrentSolution.Projects.First();

            // build checksum
            await project.State.GetChecksumAsync(CancellationToken.None);

            var map = await project.GetAssetMapAsync(CancellationToken.None);

            using var remoteWorkspace = CreateRemoteWorkspace();

            var sessionId   = 0;
            var storage     = new SolutionAssetCache();
            var assetSource = new SimpleAssetSource(map);

            var service = new AssetProvider(sessionId, storage, assetSource, remoteWorkspace.Services.GetService <ISerializerService>());
            await service.SynchronizeProjectAssetsAsync(SpecializedCollections.SingletonEnumerable(await project.State.GetChecksumAsync(CancellationToken.None)), CancellationToken.None);

            TestUtils.VerifyAssetStorage(map, storage);
        }