// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;

namespace Microsoft.AspNetCore.Testing
{
    /// <summary>
    /// Skip test if running on Alpine Linux (which uses musl instead of glibc)
    /// </summary>
    [AttributeUsage(AttributeTargets.Method)]
    public class SkipOnAlpineAttribute : Attribute, ITestCondition
    {
        public SkipOnAlpineAttribute(string issueUrl = "")
        {
            IssueUrl = issueUrl;
        }

        public string IssueUrl { get; }

        public bool IsMet { get; } = !IsAlpine;

        public string SkipReason => "Test cannot run on Alpine Linux.";

        // This logic is borrowed from https://github.com/dotnet/runtime/blob/6a5a78bec9a6e14b4aa52cd5ac558f6cf5c6a211/src/libraries/Common/tests/TestUtilities/System/PlatformDetection.Unix.cs
        private static bool IsAlpine { get; } =
            RuntimeInformation.IsOSPlatform(OSPlatform.Linux) && File.Exists("/etc/os-release") &&
            File.ReadAllLines("/etc/os-release").Any(line =>
                line.StartsWith("ID=", StringComparison.Ordinal) && line.Substring(3).Trim('"', '\'') == "alpine");
    }
}
