Ejemplo n.º 1
0
        public void Valid()
        {
            var  id             = AppInfo.CreateDefaultCryptoProvider().CreateRandom();
            var  version        = new ClientVersion(1);
            var  baseInfo       = PackageSequenceBaseInfo.Default;
            long size           = baseInfo.SegmentLength * 18; // bitmap length: 8bits + 8bits + 2bits
            var  downloadStatus = PackageDownloadInfo.CreateForReadyForDownloadPackage(version, id, new PackageSequenceInfo(baseInfo, size));

            Assert.Equal(3, downloadStatus.Data.SegmentsBitmap.Length);

            // validate
            downloadStatus.ValidateStatusUpdateFromPeer(new PackageStatusDetail()
            {
                SegmentsBitmap = new byte[3] {
                    0x00, 0x00, 0x00
                },
                BytesDownloaded = 0,
                IsFound         = true
            });

            downloadStatus.ValidateStatusUpdateFromPeer(new PackageStatusDetail()
            {
                SegmentsBitmap = new byte[3] {
                    0x00, 0x00, 0b00000011
                },
Ejemplo n.º 2
0
        public LocalPackageInfo RegisterPackage(PackageHashes hashes, PackageMeta metadata)
        {
            if (hashes == null)
            {
                throw new ArgumentNullException(nameof(hashes));
            }

            // create directory
            EnsurePath();
            string packagePath = CreatePackagePath(hashes.PackageId);

            if (Directory.Exists(packagePath))
            {
                logger.LogError("Can't add package with Id {0:s}. This hash already exists in local repository.", hashes.PackageId);
                throw new InvalidOperationException("Package already exists in local repository.");
            }
            Directory.CreateDirectory(packagePath);

            // store data
            var packageSequence = hashes.CreatePackageSequence();
            PackageDownloadInfo downloadStatus = PackageDownloadInfo.CreateForReadyForDownloadPackage(app.Version, hashes.PackageId, packageSequence);

            UpdateDownloadStatus(downloadStatus);
            UpdateHashes(hashes);
            UpdateMetadata(metadata);

            // allocate
            var allocator = new PackageDataAllocator(app.LoggerFactory);

            allocator.Allocate(packagePath, hashes.CreatePackageSequence(), overwrite: false);

            // log and build result
            logger.LogInformation($"New package {hashes.PackageId:s4} added to repository and allocated. Size: {SizeFormatter.ToString(hashes.PackageSize)}");

            var reference = new PackageReference(packagePath, hashes.PackageId);
            var result    = new LocalPackageInfo(reference, downloadStatus, hashes, metadata, packageSequence);

            return(result);
        }