Exemplo n.º 1
0
        public async Task GlobalJsonFromDependencies()
        {
            const string Original = @"{
  ""sdk"": {
    ""version"": ""3.1.100"",
    ""rollForward"": ""disable""
  },
  ""msbuild-sdks"": {
    ""My.Custom.Sdk"": ""5.0.0"",
    ""My.Other.Sdk"": ""1.0.0-beta""
  }
}";
            const string Expected = @"{
  ""sdk"": {
    ""version"": ""3.1.400"",
    ""rollForward"": ""disable""
  },
  ""msbuild-sdks"": {
    ""My.Custom.Sdk"": ""3.1.400"",
    ""My.Other.Sdk"": ""3.1.400""
  }
}";

            AddFile("global.json", Original);
            var result = await GetDependencies(new DotNetGlobalJsonDependencyScanner());

            AssertContainDependency(result,
                                    (DependencyType.DotNetSdk, ".NET SDK", "3.1.100", 3, 24),
                                    (DependencyType.NuGet, "My.Custom.Sdk", "5.0.0", 7, 28),
                                    (DependencyType.NuGet, "My.Other.Sdk", "1.0.0-beta", 8, 32));

            await UpdateDependencies(result, "3.1.400");

            AssertFileContentEqual("global.json", Expected);
        }
Exemplo n.º 2
0
        public async Task MsBuildSdkReferencesDependencies()
        {
            const string Original = @"<Project Sdk=""MSBuild.Sdk.Extras/2.0.54"">
    <Sdk Name=""My.Custom.Sdk1"" Version=""1.0.0"" />
    <Import Sdk=""My.Custom.Sdk2/2.0.55"" />
</Project>
";
            const string Expected = @"<Project Sdk=""MSBuild.Sdk.Extras/1.2.3"">
    <Sdk Name=""My.Custom.Sdk1"" Version=""1.2.3"" />
    <Import Sdk=""My.Custom.Sdk2/1.2.3"" />
</Project>
";

            AddFile("test.csproj", Original);
            var result = await GetDependencies(new MsBuildReferencesDependencyScanner());

            AssertContainDependency(result,
                                    (DependencyType.NuGet, "MSBuild.Sdk.Extras", "2.0.54", 1, 2),
                                    (DependencyType.NuGet, "My.Custom.Sdk1", "1.0.0", 2, 6),
                                    (DependencyType.NuGet, "My.Custom.Sdk2", "2.0.55", 3, 6));

            await UpdateDependencies(result, "1.2.3");

            AssertFileContentEqual("test.csproj", Expected);
        }
Exemplo n.º 3
0
        public async Task Regex()
        {
            const string Original = @"
container:
  image: node:10
services:
  abc
";
            const string Expected = @"
container:
  image: node:v3.0.0
services:
  abc
";

            AddFile("custom/sample.yml", Original);
            var result = await GetDependencies(new RegexScanner()
            {
                FilePatterns   = new GlobCollection(Glob.Parse("**/*", GlobOptions.None)),
                DependencyType = DependencyType.DockerImage,
                RegexPattern   = "image: (?<name>[a-z]+):(?<version>[0-9]+)",
            });

            AssertContainDependency(result,
                                    (DependencyType.DockerImage, "node", "10", 3, 15));

            await UpdateDependencies(result, "v3.0.0");

            AssertFileContentEqual("custom/sample.yml", Expected, ignoreNewLines: false);
        }
Exemplo n.º 4
0
        public async Task GitHubActions()
        {
            const string Path     = ".github/workflows/sample.yml";
            const string Original = @"name: demo
on: [push]
jobs:
  check-bats-version:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v1
      - uses: docker://test/setup:v3
      - run: npm install -g bats
      - run: bats -v
    container:
      image: node:10.16-jessie
    services:
      nginx:
        image: nginx:latest
      redis:
        image: redis:1.0
";
            const string Expected = @"name: demo
on: [push]
jobs:
  check-bats-version:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/[email protected]
      - uses: actions/[email protected]
      - uses: docker://test/setup:v3.0.0
      - run: npm install -g bats
      - run: bats -v
    container:
      image: node:v3.0.0
    services:
      nginx:
        image: nginx:v3.0.0
      redis:
        image: redis:v3.0.0
";

            AddFile(Path, Original);
            var scanner = new GitHubActionsScanner();

            Assert.True(scanner.ShouldScanFile(Path));
            var result = await GetDependencies(scanner);

            AssertContainDependency(result,
                                    (DependencyType.GitHubActions, "actions/checkout", "v2", 7, 32),
                                    (DependencyType.GitHubActions, "actions/setup-node", "v1", 8, 34),
                                    (DependencyType.DockerImage, "test/setup", "v3", 9, 35),
                                    (DependencyType.DockerImage, "node", "10.16-jessie", 13, 19),
                                    (DependencyType.DockerImage, "nginx", "latest", 16, 22),
                                    (DependencyType.DockerImage, "redis", "1.0", 18, 22));

            await UpdateDependencies(result, "v3.0.0");

            AssertFileContentEqual(Path, Expected, ignoreNewLines: false);
        }
Exemplo n.º 5
0
        public async Task PythonRequirementsDependencies()
        {
            const string Original = "A==1.1.0\nB==1.2.0\r\nC==1.3.0";
            const string Expected = "A==2.0.0\nB==2.0.0\r\nC==2.0.0";

            AddFile("requirements.txt", Original);
            var result = await GetDependencies(new PythonRequirementsDependencyScanner());

            AssertContainDependency(result,
                                    (DependencyType.PyPi, "A", "1.1.0", 1, 4),
                                    (DependencyType.PyPi, "B", "1.2.0", 2, 4),
                                    (DependencyType.PyPi, "C", "1.3.0", 3, 4));

            await UpdateDependencies(result, "2.0.0");

            AssertFileContentEqual("requirements.txt", Expected);
        }
Exemplo n.º 6
0
        public async Task ProjectJsonDependencies()
        {
            const string Original = @"{
  ""dependencies"": {
    ""a"": {
      ""version"": ""1.0.1"",
      ""type"": ""platform""
    },
    ""b"": {
      ""target"": ""project""
    },
    ""c"": ""1.0.2"",
  },
  ""tools"": {
    ""d"": ""1.0.3""
  }
}";

            const string Expected = @"{
  ""dependencies"": {
    ""a"": {
      ""version"": ""2.0.0"",
      ""type"": ""platform""
    },
    ""b"": {
      ""target"": ""project""
    },
    ""c"": ""2.0.0""
  },
  ""tools"": {
    ""d"": ""2.0.0""
  }
}";

            AddFile("project.json", Original);
            var result = await GetDependencies(new ProjectJsonDependencyScanner());

            AssertContainDependency(result,
                                    (DependencyType.NuGet, "a", "1.0.1", 3, 8),
                                    (DependencyType.NuGet, "c", "1.0.2", 10, 8),
                                    (DependencyType.NuGet, "d", "1.0.3", 13, 8));

            await UpdateDependencies(result, "2.0.0");

            AssertFileContentEqual("project.json", Expected);
        }
Exemplo n.º 7
0
        public async Task PackagesReferencesWithNamespaceDependencies()
        {
            const string Original = @"<?xml version=""1.0"" encoding=""utf-8""?>
<Project Sdk=""Microsoft.NET.Sdk"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <RootNamespace>Sample</RootNamespace>
  </PropertyGroup>

    <!-- Comment -->
  <ItemGroup>
    <PackageReference Include=""TestPackage"" Version=""4.2.1"" />
  </ItemGroup>

</Project>
";
            const string Expected = @"<?xml version=""1.0"" encoding=""utf-8""?>
<Project Sdk=""Microsoft.NET.Sdk"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <RootNamespace>Sample</RootNamespace>
  </PropertyGroup>

    <!-- Comment -->
  <ItemGroup>
    <PackageReference Include=""TestPackage"" Version=""2.0.0"" />
  </ItemGroup>

</Project>
";

            AddFile("test.csproj", Original);
            var result = await GetDependencies(new PackageReferencesDependencyScanner());

            AssertContainDependency(result, (DependencyType.NuGet, "TestPackage", "4.2.1", 11, 6));

            await UpdateDependencies(result, "2.0.0");

            AssertFileContentEqual("test.csproj", Expected);
        }
Exemplo n.º 8
0
        public async Task MsBuildReferencesDependencies()
        {
            const string Original = @"<Project Sdk=""Microsoft.NET.Sdk"">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <RootNamespace>Sample</RootNamespace>
  </PropertyGroup>

    <!-- Comment -->
  <ItemGroup>
    <PackageReference Include=""TestPackage"" Version=""4.2.1"" />
  </ItemGroup>

</Project>
";
            const string Expected = @"<Project Sdk=""Microsoft.NET.Sdk"">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <RootNamespace>Sample</RootNamespace>
  </PropertyGroup>

    <!-- Comment -->
  <ItemGroup>
    <PackageReference Include=""TestPackage"" Version=""2.0.0"" />
  </ItemGroup>

</Project>
";

            AddFile("test.csproj", Original);
            var result = await GetDependencies(new MsBuildReferencesDependencyScanner());

            AssertContainDependency(result,
                                    (DependencyType.NuGet, "TestPackage", "4.2.1", 10, 6));

            await UpdateDependencies(result, "2.0.0");

            AssertFileContentEqual("test.csproj", Expected);
        }
Exemplo n.º 9
0
        public async Task NuSpecDependencies()
        {
            const string Original = @"<?xml version=""1.0"" encoding=""utf-8""?>
<package xmlns=""http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"">
    <metadata>
        <id>sample</id>
        <version>1.0.0</version>
        <authors>Microsoft</authors>
        <dependencies>
            <dependency id=""another-package"" version=""3.0.0"" />
            <dependency id=""yet-another-package"" version=""1.0.0"" />
        </dependencies>
    </metadata>
</package>";

            const string Expected = @"<?xml version=""1.0"" encoding=""utf-8""?>
<package xmlns=""http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"">
    <metadata>
        <id>sample</id>
        <version>1.0.0</version>
        <authors>Microsoft</authors>
        <dependencies>
            <dependency id=""another-package"" version=""2.0.0"" />
            <dependency id=""yet-another-package"" version=""2.0.0"" />
        </dependencies>
    </metadata>
</package>";

            AddFile("test.nuspec", Original);
            var result = await GetDependencies(new NuSpecDependencyScanner());

            AssertContainDependency(result,
                                    (DependencyType.NuGet, "another-package", "3.0.0", 8, 14),
                                    (DependencyType.NuGet, "yet-another-package", "1.0.0", 9, 14));

            await UpdateDependencies(result, "2.0.0");

            AssertFileContentEqual("test.nuspec", Expected);
        }
Exemplo n.º 10
0
        public async Task PackagesConfigDependencies()
        {
            const string Original = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<packages>
  <package id=""A"" version=""4.2.1"" targetFramework=""net461"" />
</packages>";

            const string Expected = @"<?xml version=""1.0"" encoding=""utf-8""?>
<packages>
  <package id=""A"" version=""2.0.0"" targetFramework=""net461"" />
</packages>";


            AddFile("packages.config", Original);
            var result = await GetDependencies(new PackagesConfigDependencyScanner());

            AssertContainDependency(result, (DependencyType.NuGet, "A", "4.2.1", 3, 4));

            await UpdateDependencies(result, "2.0.0");

            AssertFileContentEqual("packages.config", Expected);
        }
Exemplo n.º 11
0
        public async Task NpmPackageJsonDependencies()
        {
            const string Original = @"{
  ""name"": ""sample"",
  ""version"": ""0.1.0"",
  ""dependencies"": {
    ""a"": ""1.0.0""
  },
  ""devDependencies"": {
    ""b"": ""1.2.3"",
    ""c"": null
  }
}";

            const string Expected = @"{
  ""name"": ""sample"",
  ""version"": ""0.1.0"",
  ""dependencies"": {
    ""a"": ""2.0.0""
  },
  ""devDependencies"": {
    ""b"": ""2.0.0"",
    ""c"": null
  }
}";

            AddFile("package.json", Original);
            var result = await GetDependencies(new NpmPackageJsonDependencyScanner());

            AssertContainDependency(result,
                                    (DependencyType.Npm, "a", "1.0.0", 5, 8),
                                    (DependencyType.Npm, "b", "1.2.3", 8, 8));

            await UpdateDependencies(result, "2.0.0");

            AssertFileContentEqual("package.json", Expected);
        }
Exemplo n.º 12
0
        public async Task DockerfileFromDependencies()
        {
            const string Original = @"
FROM a.com/b:1.2.2
FROM a.com/c:1.2.3 AS base
CMD  /code/run-app
";
            const string Expected = @"
FROM a.com/b:2.0.0
FROM a.com/c:2.0.0 AS base
CMD  /code/run-app
";

            AddFile("Dockerfile", Original);
            var result = await GetDependencies(new DockerfileDependencyScanner());

            AssertContainDependency(result,
                                    (DependencyType.DockerImage, "a.com/b", "1.2.2", 2, 14),
                                    (DependencyType.DockerImage, "a.com/c", "1.2.3", 3, 14));

            await UpdateDependencies(result, "2.0.0");

            AssertFileContentEqual("Dockerfile", Expected);
        }
Exemplo n.º 13
0
        public async Task GitSubmodulesFromDependencies()
        {
            // Initialize remote repository
            using var remote = TemporaryDirectory.Create();
            await ExecuteProcess("git", "init", remote.FullPath);
            await ExecuteProcess("git", "config user.name test", remote.FullPath);
            await ExecuteProcess("git", "config user.email [email protected]", remote.FullPath);

            File.WriteAllText(remote.GetFullPath("test.txt"), "content");
            await ExecuteProcess("git", "add .", remote.FullPath);
            await ExecuteProcess("git", "commit -m commit-message", remote.FullPath);

            // Get remote head
            string head;

            using (var repository = new Repository(remote.FullPath))
            {
                head = repository.Head.Tip.Sha;
                _testOutputHelper.WriteLine("Head: " + head);
            }

            // Initialize current directory
            await ExecuteProcess("git", "init", _directory.FullPath);
            await ExecuteProcess("git", "config user.name test", _directory.FullPath);
            await ExecuteProcess("git", "config user.email [email protected]", _directory.FullPath);

            File.WriteAllText(_directory.GetFullPath("test.txt"), "content");
            await ExecuteProcess("git", "add .", _directory.FullPath);
            await ExecuteProcess("git", "commit -m commit-message", _directory.FullPath);

            // Add submodule
            await ExecuteProcess2("git", new string[] { "submodule", "add", remote.FullPath, "submodule_path" }, _directory.FullPath);

            // List files
            // TODO log file attribute
            var files = Directory.GetFiles(_directory.FullPath, "*", SearchOption.AllDirectories);

            _testOutputHelper.WriteLine("Content of " + _directory.FullPath);
            foreach (var file in files)
            {
                var attr = File.GetAttributes(file);
                _testOutputHelper.WriteLine($"{file} ({attr})");
            }

            // Assert
            var result = await GetDependencies(new GitSubmoduleDependencyScanner());

            AssertContainDependency(result, (DependencyType.GitSubmodule, remote.FullPath, head, 0, 0));

            Assert.All(result, result => Assert.False(result.Location.IsUpdatable));

            async Task ExecuteProcess(string process, string args, string workingDirectory)
            {
                _testOutputHelper.WriteLine($"Executing: '{process}' {args} ({workingDirectory})");
                AssertProcessResult(await ProcessExtensions.RunAsTaskAsync(process, args, workingDirectory));
            }

            async Task ExecuteProcess2(string process, string[] args, string workingDirectory)
            {
                _testOutputHelper.WriteLine($"Executing: '{process}' {string.Join(" ", args)} ({workingDirectory})");
                AssertProcessResult(await ProcessExtensions.RunAsTaskAsync(process, args, workingDirectory));
            }

            void AssertProcessResult(ProcessResult result)
            {
                if (result.ExitCode == 0)
                {
                    _testOutputHelper.WriteLine("git command succeeds\n" + string.Join("\n", result.Output));
                    return;
                }

                Assert.False(true, "git command failed. Logs:\n" + string.Join("\n", result.Output));
            }
        }
Exemplo n.º 14
0
        public async Task PackagesConfigWithCsprojDependencies()
        {
            const string Original = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<packages>
  <package id=""NUnit"" version=""3.11.0"" targetFramework=""net461"" />
</packages>";

            const string OriginalCsproj = @"<?xml version=""1.0"" encoding=""utf-8""?>
<Project ToolsVersion=""15.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
  <Import Project=""..\packages\NUnit.3.11.0\build\NUnit.props"" Condition=""Exists('..\packages\NUnit.3.11.0\build\NUnit.props')"" />
  <Import Project=""$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props"" Condition=""Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')"" />
  <ItemGroup>
    <Reference Include=""nunit.framework, Version=3.11.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL"">
      <HintPath>..\packages\NUnit.3.11.0\lib\net45\nunit.framework.dll</HintPath>
    </Reference>
  </ItemGroup>
  <Import Project=""$(MSBuildToolsPath)\Microsoft.CSharp.targets"" />
  <Target Name=""EnsureNuGetPackageBuildImports"" BeforeTargets=""PrepareForBuild"">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition=""!Exists('..\packages\NUnit.3.11.0\build\NUnit.props')"" Text=""$([System.String]::Format('$(ErrorText)', '..\packages\NUnit.3.11.0\build\NUnit.props'))"" />
  </Target>
</Project>";

            const string Expected = @"<?xml version=""1.0"" encoding=""utf-8""?>
<packages>
  <package id=""NUnit"" version=""3.12.0-beta00"" targetFramework=""net461"" />
</packages>";

            const string ExpectedCsproj = @"<?xml version=""1.0"" encoding=""utf-8""?>
<Project ToolsVersion=""15.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
  <Import Project=""..\packages\NUnit.3.12.0-beta00\build\NUnit.props"" Condition=""Exists('..\packages\NUnit.3.12.0-beta00\build\NUnit.props')"" />
  <Import Project=""$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props"" Condition=""Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')"" />
  <ItemGroup>
    <Reference Include=""nunit.framework, Version=3.12.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL"">
      <HintPath>..\packages\NUnit.3.12.0-beta00\lib\net45\nunit.framework.dll</HintPath>
    </Reference>
  </ItemGroup>
  <Import Project=""$(MSBuildToolsPath)\Microsoft.CSharp.targets"" />
  <Target Name=""EnsureNuGetPackageBuildImports"" BeforeTargets=""PrepareForBuild"">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition=""!Exists('..\packages\NUnit.3.12.0-beta00\build\NUnit.props')"" Text=""$([System.String]::Format('$(ErrorText)', '..\packages\NUnit.3.12.0-beta00\build\NUnit.props'))"" />
  </Target>
</Project>";


            AddFile("packages.config", Original);
            AddFile("file.csproj", OriginalCsproj);
            var result = await GetDependencies(new PackagesConfigDependencyScanner());

            AssertContainDependency(result,
                                    (DependencyType.NuGet, "NUnit", "3.11.0", 3, 4),
                                    (DependencyType.NuGet, "NUnit", "3.11.0", 7, 8),
                                    (DependencyType.NuGet, "NUnit", "3.11.0", 6, 6),
                                    (DependencyType.NuGet, "NUnit", "3.11.0", 15, 6));

            await UpdateDependencies(result, "3.12.0-beta00");

            AssertFileContentEqual("packages.config", Expected);
            AssertFileContentEqual("file.csproj", ExpectedCsproj);
        }