| 1 | //===- unittests/Driver/DistroTest.cpp --- ToolChains tests ---------------===// |
| 2 | // |
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | // |
| 9 | // Unit tests for Distro detection. |
| 10 | // |
| 11 | //===----------------------------------------------------------------------===// |
| 12 | |
| 13 | #include "clang/Driver/Distro.h" |
| 14 | #include "llvm/Support/VirtualFileSystem.h" |
| 15 | #include "llvm/Support/raw_ostream.h" |
| 16 | #include "llvm/TargetParser/Host.h" |
| 17 | #include "gtest/gtest.h" |
| 18 | |
| 19 | using namespace clang; |
| 20 | using namespace clang::driver; |
| 21 | |
| 22 | namespace { |
| 23 | |
| 24 | // The tests include all release-related files for each distribution |
| 25 | // in the VFS, in order to make sure that earlier tests do not |
| 26 | // accidentally result in incorrect distribution guess. |
| 27 | |
| 28 | TEST(DistroTest, DetectUbuntu) { |
| 29 | llvm::vfs::InMemoryFileSystem UbuntuTrustyFileSystem; |
| 30 | // Ubuntu uses Debian Sid version. |
| 31 | UbuntuTrustyFileSystem.addFile(Path: "/etc/debian_version" , ModificationTime: 0, |
| 32 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "jessie/sid\n" )); |
| 33 | UbuntuTrustyFileSystem.addFile(Path: "/etc/lsb-release" , ModificationTime: 0, |
| 34 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "DISTRIB_ID=Ubuntu\n" |
| 35 | "DISTRIB_RELEASE=14.04\n" |
| 36 | "DISTRIB_CODENAME=trusty\n" |
| 37 | "DISTRIB_DESCRIPTION=\"Ubuntu 14.04 LTS\"\n" )); |
| 38 | UbuntuTrustyFileSystem.addFile(Path: "/etc/os-release" , ModificationTime: 0, |
| 39 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "NAME=\"Ubuntu\"\n" |
| 40 | "VERSION=\"14.04, Trusty Tahr\"\n" |
| 41 | "ID=ubuntu\n" |
| 42 | "ID_LIKE=debian\n" |
| 43 | "PRETTY_NAME=\"Ubuntu 14.04 LTS\"\n" |
| 44 | "VERSION_ID=\"14.04\"\n" |
| 45 | "HOME_URL=\"http://www.ubuntu.com/\"\n" |
| 46 | "SUPPORT_URL=\"http://help.ubuntu.com/\"\n" |
| 47 | "BUG_REPORT_URL=\"http://bugs.launchpad.net/ubuntu/\"\n" )); |
| 48 | |
| 49 | Distro UbuntuTrusty{UbuntuTrustyFileSystem, llvm::Triple("unknown-pc-linux" )}; |
| 50 | ASSERT_EQ(Distro(Distro::UbuntuTrusty), UbuntuTrusty); |
| 51 | ASSERT_TRUE(UbuntuTrusty.IsUbuntu()); |
| 52 | ASSERT_FALSE(UbuntuTrusty.IsRedhat()); |
| 53 | ASSERT_FALSE(UbuntuTrusty.IsOpenSUSE()); |
| 54 | ASSERT_FALSE(UbuntuTrusty.IsDebian()); |
| 55 | ASSERT_FALSE(UbuntuTrusty.IsGentoo()); |
| 56 | |
| 57 | Distro UbuntuTrusty2{UbuntuTrustyFileSystem, llvm::Triple("unknown-pc-windows" )}; |
| 58 | ASSERT_EQ(Distro(Distro::UnknownDistro), UbuntuTrusty2); |
| 59 | |
| 60 | llvm::vfs::InMemoryFileSystem UbuntuYakketyFileSystem; |
| 61 | UbuntuYakketyFileSystem.addFile(Path: "/etc/debian_version" , ModificationTime: 0, |
| 62 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "stretch/sid\n" )); |
| 63 | UbuntuYakketyFileSystem.addFile(Path: "/etc/lsb-release" , ModificationTime: 0, |
| 64 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "DISTRIB_ID=Ubuntu\n" |
| 65 | "DISTRIB_RELEASE=16.10\n" |
| 66 | "DISTRIB_CODENAME=yakkety\n" |
| 67 | "DISTRIB_DESCRIPTION=\"Ubuntu 16.10\"\n" )); |
| 68 | UbuntuYakketyFileSystem.addFile(Path: "/etc/os-release" , ModificationTime: 0, |
| 69 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "NAME=\"Ubuntu\"\n" |
| 70 | "VERSION=\"16.10 (Yakkety Yak)\"\n" |
| 71 | "ID=ubuntu\n" |
| 72 | "ID_LIKE=debian\n" |
| 73 | "PRETTY_NAME=\"Ubuntu 16.10\"\n" |
| 74 | "VERSION_ID=\"16.10\"\n" |
| 75 | "HOME_URL=\"http://www.ubuntu.com/\"\n" |
| 76 | "SUPPORT_URL=\"http://help.ubuntu.com/\"\n" |
| 77 | "BUG_REPORT_URL=\"http://bugs.launchpad.net/ubuntu/\"\n" |
| 78 | "PRIVACY_POLICY_URL=\"http://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\n" |
| 79 | "VERSION_CODENAME=yakkety\n" |
| 80 | "UBUNTU_CODENAME=yakkety\n" )); |
| 81 | |
| 82 | Distro UbuntuYakkety{UbuntuYakketyFileSystem, llvm::Triple("unknown-pc-linux" )}; |
| 83 | ASSERT_EQ(Distro(Distro::UbuntuYakkety), UbuntuYakkety); |
| 84 | ASSERT_TRUE(UbuntuYakkety.IsUbuntu()); |
| 85 | ASSERT_FALSE(UbuntuYakkety.IsRedhat()); |
| 86 | ASSERT_FALSE(UbuntuYakkety.IsOpenSUSE()); |
| 87 | ASSERT_FALSE(UbuntuYakkety.IsDebian()); |
| 88 | ASSERT_FALSE(UbuntuYakkety.IsGentoo()); |
| 89 | } |
| 90 | |
| 91 | TEST(DistroTest, DetectRedhat) { |
| 92 | llvm::vfs::InMemoryFileSystem Fedora25FileSystem; |
| 93 | Fedora25FileSystem.addFile(Path: "/etc/system-release-cpe" , ModificationTime: 0, |
| 94 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "cpe:/o:fedoraproject:fedora:25\n" )); |
| 95 | // Both files are symlinks to fedora-release. |
| 96 | Fedora25FileSystem.addFile(Path: "/etc/system-release" , ModificationTime: 0, |
| 97 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "Fedora release 25 (Twenty Five)\n" )); |
| 98 | Fedora25FileSystem.addFile(Path: "/etc/redhat-release" , ModificationTime: 0, |
| 99 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "Fedora release 25 (Twenty Five)\n" )); |
| 100 | Fedora25FileSystem.addFile(Path: "/etc/fedora-release" , ModificationTime: 0, |
| 101 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "Fedora release 25 (Twenty Five)\n" )); |
| 102 | Fedora25FileSystem.addFile(Path: "/etc/os-release" , ModificationTime: 0, |
| 103 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "NAME=Fedora\n" |
| 104 | "VERSION=\"25 (Twenty Five)\"\n" |
| 105 | "ID=fedora\n" |
| 106 | "VERSION_ID=25\n" |
| 107 | "PRETTY_NAME=\"Fedora 25 (Twenty Five)\"\n" |
| 108 | "ANSI_COLOR=\"0;34\"\n" |
| 109 | "CPE_NAME=\"cpe:/o:fedoraproject:fedora:25\"\n" |
| 110 | "HOME_URL=\"https://fedoraproject.org/\"\n" |
| 111 | "BUG_REPORT_URL=\"https://bugzilla.redhat.com/\"\n" |
| 112 | "REDHAT_BUGZILLA_PRODUCT=\"Fedora\"\n" |
| 113 | "REDHAT_BUGZILLA_PRODUCT_VERSION=25\n" |
| 114 | "REDHAT_SUPPORT_PRODUCT=\"Fedora\"\n" |
| 115 | "REDHAT_SUPPORT_PRODUCT_VERSION=25\n" |
| 116 | "PRIVACY_POLICY_URL=https://fedoraproject.org/wiki/Legal:PrivacyPolicy\n" )); |
| 117 | Distro Fedora25{Fedora25FileSystem, llvm::Triple("unknown-pc-linux" )}; |
| 118 | ASSERT_EQ(Distro(Distro::Fedora), Fedora25); |
| 119 | ASSERT_FALSE(Fedora25.IsUbuntu()); |
| 120 | ASSERT_TRUE(Fedora25.IsRedhat()); |
| 121 | ASSERT_FALSE(Fedora25.IsOpenSUSE()); |
| 122 | ASSERT_FALSE(Fedora25.IsDebian()); |
| 123 | ASSERT_FALSE(Fedora25.IsGentoo()); |
| 124 | |
| 125 | llvm::vfs::InMemoryFileSystem CentOS7FileSystem; |
| 126 | CentOS7FileSystem.addFile(Path: "/etc/system-release-cpe" , ModificationTime: 0, |
| 127 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "cpe:/o:centos:centos:7\n" )); |
| 128 | // Both files are symlinks to centos-release. |
| 129 | CentOS7FileSystem.addFile(Path: "/etc/system-release" , ModificationTime: 0, |
| 130 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "CentOS Linux release 7.2.1511 (Core) \n" )); |
| 131 | CentOS7FileSystem.addFile(Path: "/etc/redhat-release" , ModificationTime: 0, |
| 132 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "CentOS Linux release 7.2.1511 (Core) \n" )); |
| 133 | CentOS7FileSystem.addFile(Path: "/etc/centos-release" , ModificationTime: 0, |
| 134 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "CentOS Linux release 7.2.1511 (Core) \n" )); |
| 135 | CentOS7FileSystem.addFile(Path: "/etc/centos-release-upstream" , ModificationTime: 0, |
| 136 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "Derived from Red Hat Enterprise Linux 7.2 (Source)\n" )); |
| 137 | CentOS7FileSystem.addFile(Path: "/etc/os-release" , ModificationTime: 0, |
| 138 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "NAME=\"CentOS Linux\"\n" |
| 139 | "VERSION=\"7 (Core)\"\n" |
| 140 | "ID=\"centos\"\n" |
| 141 | "ID_LIKE=\"rhel fedora\"\n" |
| 142 | "VERSION_ID=\"7\"\n" |
| 143 | "PRETTY_NAME=\"CentOS Linux 7 (Core)\"\n" |
| 144 | "ANSI_COLOR=\"0;31\"\n" |
| 145 | "CPE_NAME=\"cpe:/o:centos:centos:7\"\n" |
| 146 | "HOME_URL=\"https://www.centos.org/\"\n" |
| 147 | "BUG_REPORT_URL=\"https://bugs.centos.org/\"\n" |
| 148 | "\n" |
| 149 | "CENTOS_MANTISBT_PROJECT=\"CentOS-7\"\n" |
| 150 | "CENTOS_MANTISBT_PROJECT_VERSION=\"7\"\n" |
| 151 | "REDHAT_SUPPORT_PRODUCT=\"centos\"\n" |
| 152 | "REDHAT_SUPPORT_PRODUCT_VERSION=\"7\"\n" )); |
| 153 | |
| 154 | Distro CentOS7{CentOS7FileSystem, llvm::Triple("unknown-pc-linux" )}; |
| 155 | ASSERT_EQ(Distro(Distro::RHEL7), CentOS7); |
| 156 | ASSERT_FALSE(CentOS7.IsUbuntu()); |
| 157 | ASSERT_TRUE(CentOS7.IsRedhat()); |
| 158 | ASSERT_FALSE(CentOS7.IsOpenSUSE()); |
| 159 | ASSERT_FALSE(CentOS7.IsDebian()); |
| 160 | ASSERT_FALSE(CentOS7.IsGentoo()); |
| 161 | } |
| 162 | |
| 163 | TEST(DistroTest, DetectOpenSUSE) { |
| 164 | llvm::vfs::InMemoryFileSystem OpenSUSELeap421FileSystem; |
| 165 | OpenSUSELeap421FileSystem.addFile(Path: "/etc/SuSE-release" , ModificationTime: 0, |
| 166 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "openSUSE 42.1 (x86_64)\n" |
| 167 | "VERSION = 42.1\n" |
| 168 | "CODENAME = Malachite\n" |
| 169 | "# /etc/SuSE-release is deprecated and will be removed in the future, use /etc/os-release instead\n" )); |
| 170 | OpenSUSELeap421FileSystem.addFile(Path: "/etc/os-release" , ModificationTime: 0, |
| 171 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "NAME=\"openSUSE Leap\"\n" |
| 172 | "VERSION=\"42.1\"\n" |
| 173 | "VERSION_ID=\"42.1\"\n" |
| 174 | "PRETTY_NAME=\"openSUSE Leap 42.1 (x86_64)\"\n" |
| 175 | "ID=opensuse\n" |
| 176 | "ANSI_COLOR=\"0;32\"\n" |
| 177 | "CPE_NAME=\"cpe:/o:opensuse:opensuse:42.1\"\n" |
| 178 | "BUG_REPORT_URL=\"https://bugs.opensuse.org\"\n" |
| 179 | "HOME_URL=\"https://opensuse.org/\"\n" |
| 180 | "ID_LIKE=\"suse\"\n" )); |
| 181 | |
| 182 | Distro OpenSUSELeap421{OpenSUSELeap421FileSystem, llvm::Triple("unknown-pc-linux" )}; |
| 183 | ASSERT_EQ(Distro(Distro::OpenSUSE), OpenSUSELeap421); |
| 184 | ASSERT_FALSE(OpenSUSELeap421.IsUbuntu()); |
| 185 | ASSERT_FALSE(OpenSUSELeap421.IsRedhat()); |
| 186 | ASSERT_TRUE(OpenSUSELeap421.IsOpenSUSE()); |
| 187 | ASSERT_FALSE(OpenSUSELeap421.IsDebian()); |
| 188 | ASSERT_FALSE(OpenSUSELeap421.IsGentoo()); |
| 189 | |
| 190 | llvm::vfs::InMemoryFileSystem OpenSUSE132FileSystem; |
| 191 | OpenSUSE132FileSystem.addFile(Path: "/etc/SuSE-release" , ModificationTime: 0, |
| 192 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "openSUSE 13.2 (x86_64)\n" |
| 193 | "VERSION = 13.2\n" |
| 194 | "CODENAME = Harlequin\n" |
| 195 | "# /etc/SuSE-release is deprecated and will be removed in the future, use /etc/os-release instead\n" )); |
| 196 | OpenSUSE132FileSystem.addFile(Path: "/etc/os-release" , ModificationTime: 0, |
| 197 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "NAME=openSUSE\n" |
| 198 | "VERSION=\"13.2 (Harlequin)\"\n" |
| 199 | "VERSION_ID=\"13.2\"\n" |
| 200 | "PRETTY_NAME=\"openSUSE 13.2 (Harlequin) (x86_64)\"\n" |
| 201 | "ID=opensuse\n" |
| 202 | "ANSI_COLOR=\"0;32\"\n" |
| 203 | "CPE_NAME=\"cpe:/o:opensuse:opensuse:13.2\"\n" |
| 204 | "BUG_REPORT_URL=\"https://bugs.opensuse.org\"\n" |
| 205 | "HOME_URL=\"https://opensuse.org/\"\n" |
| 206 | "ID_LIKE=\"suse\"\n" )); |
| 207 | |
| 208 | Distro OpenSUSE132{OpenSUSE132FileSystem, llvm::Triple("unknown-pc-linux" )}; |
| 209 | ASSERT_EQ(Distro(Distro::OpenSUSE), OpenSUSE132); |
| 210 | ASSERT_FALSE(OpenSUSE132.IsUbuntu()); |
| 211 | ASSERT_FALSE(OpenSUSE132.IsRedhat()); |
| 212 | ASSERT_TRUE(OpenSUSE132.IsOpenSUSE()); |
| 213 | ASSERT_FALSE(OpenSUSE132.IsDebian()); |
| 214 | ASSERT_FALSE(OpenSUSE132.IsGentoo()); |
| 215 | |
| 216 | llvm::vfs::InMemoryFileSystem SLES10FileSystem; |
| 217 | SLES10FileSystem.addFile(Path: "/etc/SuSE-release" , ModificationTime: 0, |
| 218 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "SUSE Linux Enterprise Server 10 (x86_64)\n" |
| 219 | "VERSION = 10\n" |
| 220 | "PATCHLEVEL = 4\n" )); |
| 221 | SLES10FileSystem.addFile(Path: "/etc/lsb_release" , ModificationTime: 0, |
| 222 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "LSB_VERSION=\"core-2.0-noarch:core-3.0-noarch:core-2.0-x86_64:core-3.0-x86_64\"\n" )); |
| 223 | |
| 224 | // SLES10 is unsupported and therefore evaluates to unknown |
| 225 | Distro SLES10{SLES10FileSystem, llvm::Triple("unknown-pc-linux" )}; |
| 226 | ASSERT_EQ(Distro(Distro::UnknownDistro), SLES10); |
| 227 | ASSERT_FALSE(SLES10.IsUbuntu()); |
| 228 | ASSERT_FALSE(SLES10.IsRedhat()); |
| 229 | ASSERT_FALSE(SLES10.IsOpenSUSE()); |
| 230 | ASSERT_FALSE(SLES10.IsDebian()); |
| 231 | ASSERT_FALSE(SLES10.IsGentoo()); |
| 232 | } |
| 233 | |
| 234 | TEST(DistroTest, DetectDebian) { |
| 235 | llvm::vfs::InMemoryFileSystem DebianJessieFileSystem; |
| 236 | DebianJessieFileSystem.addFile(Path: "/etc/debian_version" , ModificationTime: 0, |
| 237 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "8.6\n" )); |
| 238 | DebianJessieFileSystem.addFile(Path: "/etc/os-release" , ModificationTime: 0, |
| 239 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "PRETTY_NAME=\"Debian GNU/Linux 8 (jessie)\"\n" |
| 240 | "NAME=\"Debian GNU/Linux\"\n" |
| 241 | "VERSION_ID=\"8\"\n" |
| 242 | "VERSION=\"8 (jessie)\"\n" |
| 243 | "ID=debian\n" |
| 244 | "HOME_URL=\"http://www.debian.org/\"\n" |
| 245 | "SUPPORT_URL=\"http://www.debian.org/support\"\n" |
| 246 | "BUG_REPORT_URL=\"https://bugs.debian.org/\"\n" )); |
| 247 | |
| 248 | Distro DebianJessie{DebianJessieFileSystem, llvm::Triple("unknown-pc-linux" )}; |
| 249 | ASSERT_EQ(Distro(Distro::DebianJessie), DebianJessie); |
| 250 | ASSERT_FALSE(DebianJessie.IsUbuntu()); |
| 251 | ASSERT_FALSE(DebianJessie.IsRedhat()); |
| 252 | ASSERT_FALSE(DebianJessie.IsOpenSUSE()); |
| 253 | ASSERT_TRUE(DebianJessie.IsDebian()); |
| 254 | ASSERT_FALSE(DebianJessie.IsGentoo()); |
| 255 | |
| 256 | llvm::vfs::InMemoryFileSystem DebianStretchSidFileSystem; |
| 257 | DebianStretchSidFileSystem.addFile(Path: "/etc/debian_version" , ModificationTime: 0, |
| 258 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "stretch/sid\n" )); |
| 259 | DebianStretchSidFileSystem.addFile(Path: "/etc/os-release" , ModificationTime: 0, |
| 260 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "PRETTY_NAME=\"Debian GNU/Linux stretch/sid\"\n" |
| 261 | "NAME=\"Debian GNU/Linux\"\n" |
| 262 | "ID=debian\n" |
| 263 | "HOME_URL=\"http://www.debian.org/\"\n" |
| 264 | "SUPPORT_URL=\"http://www.debian.org/support\"\n" |
| 265 | "BUG_REPORT_URL=\"https://bugs.debian.org/\"\n" )); |
| 266 | |
| 267 | Distro DebianStretchSid{DebianStretchSidFileSystem, llvm::Triple("unknown-pc-linux" )}; |
| 268 | ASSERT_EQ(Distro(Distro::DebianStretch), DebianStretchSid); |
| 269 | ASSERT_FALSE(DebianStretchSid.IsUbuntu()); |
| 270 | ASSERT_FALSE(DebianStretchSid.IsRedhat()); |
| 271 | ASSERT_FALSE(DebianStretchSid.IsOpenSUSE()); |
| 272 | ASSERT_TRUE(DebianStretchSid.IsDebian()); |
| 273 | ASSERT_FALSE(DebianStretchSid.IsGentoo()); |
| 274 | } |
| 275 | |
| 276 | TEST(DistroTest, DetectExherbo) { |
| 277 | llvm::vfs::InMemoryFileSystem ExherboFileSystem; |
| 278 | ExherboFileSystem.addFile(Path: "/etc/os-release" , ModificationTime: 0, |
| 279 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "NAME=\"Exherbo\"\n" |
| 280 | "PRETTY_NAME=\"Exherbo Linux\"\n" |
| 281 | "ID=exherbo\n" |
| 282 | "ANSI_COLOR=\"0;32\"\n" |
| 283 | "HOME_URL=\"https://www.exherbo.org/\"\n" |
| 284 | "SUPPORT_URL=\"irc://irc.freenode.net/#exherbo\"\n" |
| 285 | "BUG_REPORT_URL=\"https://bugs.exherbo.org/\"\n" )); |
| 286 | |
| 287 | Distro Exherbo{ExherboFileSystem, llvm::Triple("unknown-pc-linux" )}; |
| 288 | ASSERT_EQ(Distro(Distro::Exherbo), Exherbo); |
| 289 | ASSERT_FALSE(Exherbo.IsUbuntu()); |
| 290 | ASSERT_FALSE(Exherbo.IsRedhat()); |
| 291 | ASSERT_FALSE(Exherbo.IsOpenSUSE()); |
| 292 | ASSERT_FALSE(Exherbo.IsDebian()); |
| 293 | ASSERT_FALSE(Exherbo.IsGentoo()); |
| 294 | } |
| 295 | |
| 296 | TEST(DistroTest, DetectArchLinux) { |
| 297 | llvm::vfs::InMemoryFileSystem ArchLinuxFileSystem; |
| 298 | ArchLinuxFileSystem.addFile(Path: "/etc/arch-release" , ModificationTime: 0, // (empty) |
| 299 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "" )); |
| 300 | ArchLinuxFileSystem.addFile(Path: "/etc/os-release" , ModificationTime: 0, |
| 301 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "NAME=\"Arch Linux\"\n" |
| 302 | "ID=arch\n" |
| 303 | "PRETTY_NAME=\"Arch Linux\"\n" |
| 304 | "ANSI_COLOR=\"0;36\"\n" |
| 305 | "HOME_URL=\"https://www.archlinux.org/\"\n" |
| 306 | "SUPPORT_URL=\"https://bbs.archlinux.org/\"\n" |
| 307 | "BUG_REPORT_URL=\"https://bugs.archlinux.org/\"\n" )); |
| 308 | |
| 309 | Distro ArchLinux{ArchLinuxFileSystem, llvm::Triple("unknown-pc-linux" )}; |
| 310 | ASSERT_EQ(Distro(Distro::ArchLinux), ArchLinux); |
| 311 | ASSERT_FALSE(ArchLinux.IsUbuntu()); |
| 312 | ASSERT_FALSE(ArchLinux.IsRedhat()); |
| 313 | ASSERT_FALSE(ArchLinux.IsOpenSUSE()); |
| 314 | ASSERT_FALSE(ArchLinux.IsDebian()); |
| 315 | ASSERT_FALSE(ArchLinux.IsGentoo()); |
| 316 | } |
| 317 | |
| 318 | TEST(DistroTest, DetectGentoo) { |
| 319 | llvm::vfs::InMemoryFileSystem GentooFileSystem; |
| 320 | GentooFileSystem.addFile( |
| 321 | Path: "/etc/gentoo-release" , ModificationTime: 0, |
| 322 | Buffer: llvm::MemoryBuffer::getMemBuffer(InputData: "Gentoo Base System release 2.6" )); |
| 323 | GentooFileSystem.addFile( |
| 324 | Path: "/etc/os-release" , ModificationTime: 0, |
| 325 | Buffer: llvm::MemoryBuffer::getMemBuffer( |
| 326 | InputData: "NAME=Gentoo\n" |
| 327 | "ID=gentoo\n" |
| 328 | "PRETTY_NAME=\"Gentoo/Linux\"\n" |
| 329 | "ANSI_COLOR=\"1;32\"\n" |
| 330 | "HOME_URL=\"https://www.gentoo.org/\"\n" |
| 331 | "SUPPORT_URL=\"https://www.gentoo.org/support/\"\n" |
| 332 | "BUG_REPORT_URL=\"https://bugs.gentoo.org/\"\n" )); |
| 333 | |
| 334 | Distro Gentoo{GentooFileSystem, llvm::Triple("unknown-pc-linux" )}; |
| 335 | ASSERT_EQ(Distro(Distro::Gentoo), Gentoo); |
| 336 | ASSERT_FALSE(Gentoo.IsUbuntu()); |
| 337 | ASSERT_FALSE(Gentoo.IsRedhat()); |
| 338 | ASSERT_FALSE(Gentoo.IsOpenSUSE()); |
| 339 | ASSERT_FALSE(Gentoo.IsDebian()); |
| 340 | ASSERT_TRUE(Gentoo.IsGentoo()); |
| 341 | } |
| 342 | |
| 343 | TEST(DistroTest, DetectWindowsAndCrossCompile) { |
| 344 | |
| 345 | class CountingFileSystem : public llvm::vfs::ProxyFileSystem { |
| 346 | public: |
| 347 | CountingFileSystem() : ProxyFileSystem(llvm::vfs::getRealFileSystem()) {} |
| 348 | |
| 349 | llvm::ErrorOr<llvm::vfs::Status> status(const llvm::Twine &Path) override { |
| 350 | ++Count; |
| 351 | return llvm::vfs::ProxyFileSystem::status(Path); |
| 352 | } |
| 353 | |
| 354 | llvm::ErrorOr<std::unique_ptr<llvm::vfs::File>> |
| 355 | openFileForRead(const llvm::Twine &Path) override { |
| 356 | ++Count; |
| 357 | return llvm::vfs::ProxyFileSystem::openFileForRead(Path); |
| 358 | } |
| 359 | |
| 360 | unsigned Count{}; |
| 361 | }; |
| 362 | |
| 363 | llvm::Triple Host(llvm::sys::getProcessTriple()); |
| 364 | if (!Host.isOSWindows()) |
| 365 | GTEST_SKIP(); |
| 366 | |
| 367 | llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> RFS = |
| 368 | llvm::vfs::getRealFileSystem(); |
| 369 | |
| 370 | CountingFileSystem CFileSystem; |
| 371 | Distro LinuxDistro{CFileSystem, llvm::Triple("unknown-pc-linux" )}; |
| 372 | ASSERT_EQ(Distro(Distro::UnknownDistro), LinuxDistro); |
| 373 | ASSERT_GT(CFileSystem.Count, 0U); |
| 374 | |
| 375 | Distro WinDistro{CFileSystem, llvm::Triple("unknown-pc-windows" )}; |
| 376 | ASSERT_EQ(Distro(Distro::UnknownDistro), WinDistro); |
| 377 | ASSERT_GT(CFileSystem.Count, 0U); |
| 378 | |
| 379 | // When running on Windows along with a real file system, ensure that no |
| 380 | // distro is returned if targeting Linux |
| 381 | Distro LinuxRealDistro{*RFS, llvm::Triple("unknown-pc-linux" )}; |
| 382 | ASSERT_EQ(Distro(Distro::UnknownDistro), LinuxRealDistro); |
| 383 | |
| 384 | Distro WinRealDistro{*RFS, llvm::Triple("unknown-pc-windows" )}; |
| 385 | ASSERT_EQ(Distro(Distro::UnknownDistro), WinRealDistro); |
| 386 | } |
| 387 | |
| 388 | TEST(DistroTest, DetectLinux) { |
| 389 | llvm::Triple Host(llvm::sys::getProcessTriple()); |
| 390 | if (!Host.isOSLinux()) |
| 391 | GTEST_SKIP(); |
| 392 | |
| 393 | // When running on Linux, check if the distro is the same as the host when |
| 394 | // targeting Linux |
| 395 | llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> RFS = |
| 396 | llvm::vfs::getRealFileSystem(); |
| 397 | Distro HostDistro{*RFS, Host}; |
| 398 | Distro LinuxRealDistro{*RFS, llvm::Triple("unknown-pc-linux" )}; |
| 399 | ASSERT_EQ(HostDistro, LinuxRealDistro); |
| 400 | } |
| 401 | |
| 402 | } // end anonymous namespace |
| 403 | |