Exemplo n.º 1
0
        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 _));
            }
        }
Exemplo n.º 2
0
        public async Task TestAssets()
        {
            var sessionId = 0;
            var checksum  = Checksum.Create(WellKnownSynchronizationKind.Null, ImmutableArray.CreateRange(Guid.NewGuid().ToByteArray()));
            var data      = new object();

            var storage = new AssetStorage();

            _ = new SimpleAssetSource(storage, new Dictionary <Checksum, object>()
            {
                { checksum, data }
            });

            var service = new AssetService(sessionId, storage, new RemoteWorkspace().Services.GetService <ISerializerService>());
            var stored  = await service.GetAssetAsync <object>(checksum, CancellationToken.None);

            Assert.Equal(data, stored);

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

            Assert.Equal(1, stored2.Count);

            Assert.Equal(checksum, stored2[0].Item1);
            Assert.Equal(data, stored2[0].Item2);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo 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);
        }
Exemplo n.º 5
0
        public void TestCreation()
        {
            var storage = new AssetStorage();
            var source  = new SimpleAssetSource(storage, new Dictionary <Checksum, object>());

            var stored = storage.AssetSource;

            Assert.Equal(source, stored);
        }
Exemplo n.º 6
0
        public void TestCreation()
        {
            var storage = new AssetStorage();
            var source  = new SimpleAssetSource(new Dictionary <Checksum, object>());

            storage.Initialize(source);

            var stored = storage.GetAssetSource();

            Assert.Equal(source, stored);
        }
Exemplo n.º 7
0
        private async Task <Solution> LoadAsync(CancellationToken cancellationToken)
        {
            var adhocWorkspace = new AdhocWorkspace();
            var serializer     = adhocWorkspace.Services.GetService <ISerializerService>();

            var solutionChecksum = default(Checksum);
            var map = new Dictionary <Checksum, object>();

            using (var stream = new FileStream(_fileName, FileMode.Open))
                using (var compressed = new DeflateStream(stream, CompressionMode.Decompress))
                    using (var reader = ObjectReader.TryGetReader(compressed, cancellationToken))
                    {
                        // save root checksum and number of entries
                        solutionChecksum = Checksum.ReadFrom(reader);

                        // number of items in the package
                        var count = reader.ReadInt32();

                        for (var i = 0; i < count; i++)
                        {
                            var itemChecksum = Checksum.ReadFrom(reader);

                            var kind = (WellKnownSynchronizationKind)reader.ReadInt32();

                            // in service hub, cancellation means simply closed stream
                            var @object = serializer.Deserialize <object>(kind, reader, cancellationToken);

                            Debug.Assert(itemChecksum == serializer.CreateChecksum(@object, cancellationToken));

                            map.Add(itemChecksum, @object);
                        }
                    }

            var assetSource  = new SimpleAssetSource(AssetStorage.Default, map);
            var assetService = new AssetService(scopeId: 0, AssetStorage.Default, serializer);

            var solutionCreator = new SolutionCreator(assetService, _solution, cancellationToken);

            // check whether solution is update to the given base solution
            if (await solutionCreator.IsIncrementalUpdateAsync(solutionChecksum).ConfigureAwait(false))
            {
                // create updated solution off the baseSolution
                return(await solutionCreator.CreateSolutionAsync(solutionChecksum).ConfigureAwait(false));
            }

            // get new solution info
            var solutionInfo = await solutionCreator.CreateSolutionInfoAsync(solutionChecksum).ConfigureAwait(false);

            // otherwise, just return new solution
            return(adhocWorkspace.AddSolution(solutionInfo));
        }
Exemplo n.º 8
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>()));
        }
Exemplo 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>()));
        }
Exemplo n.º 10
0
        private static async Task <SolutionService> GetSolutionServiceAsync(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 = 0;
            var storage   = new AssetStorage();

            _ = new SimpleAssetSource(storage, map);
            var remoteWorkspace = new RemoteWorkspace(applyStartupOptions: false);

            return(new SolutionService(new AssetProvider(sessionId, storage, remoteWorkspace.Services.GetService <ISerializerService>())));
        }
Exemplo 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);

            var sessionId = 0;
            var storage   = new AssetStorage();
            var source    = new SimpleAssetSource(storage, map);

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

            TestUtils.VerifyAssetStorage(map, storage);
        }