Michal Gorny | 593970f | 2016-11-28 21:11:22 +0000 | [diff] [blame^] | 1 | //===- unittests/Driver/DistroTest.cpp --- ToolChains tests ---------------===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | // |
| 10 | // Unit tests for Distro detection. |
| 11 | // |
| 12 | //===----------------------------------------------------------------------===// |
| 13 | |
| 14 | #include "clang/Driver/Distro.h" |
| 15 | #include "clang/Basic/VirtualFileSystem.h" |
| 16 | #include "llvm/Support/raw_ostream.h" |
| 17 | #include "gtest/gtest.h" |
| 18 | using namespace clang; |
| 19 | using namespace clang::driver; |
| 20 | |
| 21 | namespace { |
| 22 | |
| 23 | // The tests include all release-related files for each distribution |
| 24 | // in the VFS, in order to make sure that earlier tests do not |
| 25 | // accidentally result in incorrect distribution guess. |
| 26 | |
| 27 | TEST(DistroTest, DetectUbuntu) { |
| 28 | vfs::InMemoryFileSystem UbuntuTrustyFileSystem; |
| 29 | // Ubuntu uses Debian Sid version. |
| 30 | UbuntuTrustyFileSystem.addFile("/etc/debian_version", 0, |
| 31 | llvm::MemoryBuffer::getMemBuffer("jessie/sid\n")); |
| 32 | UbuntuTrustyFileSystem.addFile("/etc/lsb-release", 0, |
| 33 | llvm::MemoryBuffer::getMemBuffer("DISTRIB_ID=Ubuntu\n" |
| 34 | "DISTRIB_RELEASE=14.04\n" |
| 35 | "DISTRIB_CODENAME=trusty\n" |
| 36 | "DISTRIB_DESCRIPTION=\"Ubuntu 14.04 LTS\"\n")); |
| 37 | UbuntuTrustyFileSystem.addFile("/etc/os-release", 0, |
| 38 | llvm::MemoryBuffer::getMemBuffer("NAME=\"Ubuntu\"\n" |
| 39 | "VERSION=\"14.04, Trusty Tahr\"\n" |
| 40 | "ID=ubuntu\n" |
| 41 | "ID_LIKE=debian\n" |
| 42 | "PRETTY_NAME=\"Ubuntu 14.04 LTS\"\n" |
| 43 | "VERSION_ID=\"14.04\"\n" |
| 44 | "HOME_URL=\"http://www.ubuntu.com/\"\n" |
| 45 | "SUPPORT_URL=\"http://help.ubuntu.com/\"\n" |
| 46 | "BUG_REPORT_URL=\"http://bugs.launchpad.net/ubuntu/\"\n")); |
| 47 | |
| 48 | Distro UbuntuTrusty{UbuntuTrustyFileSystem}; |
| 49 | ASSERT_EQ(Distro(Distro::UbuntuTrusty), UbuntuTrusty); |
| 50 | ASSERT_TRUE(UbuntuTrusty.IsUbuntu()); |
| 51 | ASSERT_FALSE(UbuntuTrusty.IsRedhat()); |
| 52 | ASSERT_FALSE(UbuntuTrusty.IsOpenSUSE()); |
| 53 | ASSERT_FALSE(UbuntuTrusty.IsDebian()); |
| 54 | |
| 55 | vfs::InMemoryFileSystem UbuntuYakketyFileSystem; |
| 56 | UbuntuYakketyFileSystem.addFile("/etc/debian_version", 0, |
| 57 | llvm::MemoryBuffer::getMemBuffer("stretch/sid\n")); |
| 58 | UbuntuYakketyFileSystem.addFile("/etc/lsb-release", 0, |
| 59 | llvm::MemoryBuffer::getMemBuffer("DISTRIB_ID=Ubuntu\n" |
| 60 | "DISTRIB_RELEASE=16.10\n" |
| 61 | "DISTRIB_CODENAME=yakkety\n" |
| 62 | "DISTRIB_DESCRIPTION=\"Ubuntu 16.10\"\n")); |
| 63 | UbuntuYakketyFileSystem.addFile("/etc/os-release", 0, |
| 64 | llvm::MemoryBuffer::getMemBuffer("NAME=\"Ubuntu\"\n" |
| 65 | "VERSION=\"16.10 (Yakkety Yak)\"\n" |
| 66 | "ID=ubuntu\n" |
| 67 | "ID_LIKE=debian\n" |
| 68 | "PRETTY_NAME=\"Ubuntu 16.10\"\n" |
| 69 | "VERSION_ID=\"16.10\"\n" |
| 70 | "HOME_URL=\"http://www.ubuntu.com/\"\n" |
| 71 | "SUPPORT_URL=\"http://help.ubuntu.com/\"\n" |
| 72 | "BUG_REPORT_URL=\"http://bugs.launchpad.net/ubuntu/\"\n" |
| 73 | "PRIVACY_POLICY_URL=\"http://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\n" |
| 74 | "VERSION_CODENAME=yakkety\n" |
| 75 | "UBUNTU_CODENAME=yakkety\n")); |
| 76 | |
| 77 | Distro UbuntuYakkety{UbuntuYakketyFileSystem}; |
| 78 | ASSERT_EQ(Distro(Distro::UbuntuYakkety), UbuntuYakkety); |
| 79 | ASSERT_TRUE(UbuntuYakkety.IsUbuntu()); |
| 80 | ASSERT_FALSE(UbuntuYakkety.IsRedhat()); |
| 81 | ASSERT_FALSE(UbuntuYakkety.IsOpenSUSE()); |
| 82 | ASSERT_FALSE(UbuntuYakkety.IsDebian()); |
| 83 | } |
| 84 | |
| 85 | TEST(DistroTest, DetectRedhat) { |
| 86 | vfs::InMemoryFileSystem Fedora25FileSystem; |
| 87 | Fedora25FileSystem.addFile("/etc/system-release-cpe", 0, |
| 88 | llvm::MemoryBuffer::getMemBuffer("cpe:/o:fedoraproject:fedora:25\n")); |
| 89 | // Both files are symlinks to fedora-release. |
| 90 | Fedora25FileSystem.addFile("/etc/system-release", 0, |
| 91 | llvm::MemoryBuffer::getMemBuffer("Fedora release 25 (Twenty Five)\n")); |
| 92 | Fedora25FileSystem.addFile("/etc/redhat-release", 0, |
| 93 | llvm::MemoryBuffer::getMemBuffer("Fedora release 25 (Twenty Five)\n")); |
| 94 | Fedora25FileSystem.addFile("/etc/fedora-release", 0, |
| 95 | llvm::MemoryBuffer::getMemBuffer("Fedora release 25 (Twenty Five)\n")); |
| 96 | Fedora25FileSystem.addFile("/etc/os-release", 0, |
| 97 | llvm::MemoryBuffer::getMemBuffer("NAME=Fedora\n" |
| 98 | "VERSION=\"25 (Twenty Five)\"\n" |
| 99 | "ID=fedora\n" |
| 100 | "VERSION_ID=25\n" |
| 101 | "PRETTY_NAME=\"Fedora 25 (Twenty Five)\"\n" |
| 102 | "ANSI_COLOR=\"0;34\"\n" |
| 103 | "CPE_NAME=\"cpe:/o:fedoraproject:fedora:25\"\n" |
| 104 | "HOME_URL=\"https://fedoraproject.org/\"\n" |
| 105 | "BUG_REPORT_URL=\"https://bugzilla.redhat.com/\"\n" |
| 106 | "REDHAT_BUGZILLA_PRODUCT=\"Fedora\"\n" |
| 107 | "REDHAT_BUGZILLA_PRODUCT_VERSION=25\n" |
| 108 | "REDHAT_SUPPORT_PRODUCT=\"Fedora\"\n" |
| 109 | "REDHAT_SUPPORT_PRODUCT_VERSION=25\n" |
| 110 | "PRIVACY_POLICY_URL=https://fedoraproject.org/wiki/Legal:PrivacyPolicy\n")); |
| 111 | Distro Fedora25{Fedora25FileSystem}; |
| 112 | ASSERT_EQ(Distro(Distro::Fedora), Fedora25); |
| 113 | ASSERT_FALSE(Fedora25.IsUbuntu()); |
| 114 | ASSERT_TRUE(Fedora25.IsRedhat()); |
| 115 | ASSERT_FALSE(Fedora25.IsOpenSUSE()); |
| 116 | ASSERT_FALSE(Fedora25.IsDebian()); |
| 117 | |
| 118 | vfs::InMemoryFileSystem CentOS7FileSystem; |
| 119 | CentOS7FileSystem.addFile("/etc/system-release-cpe", 0, |
| 120 | llvm::MemoryBuffer::getMemBuffer("cpe:/o:centos:centos:7\n")); |
| 121 | // Both files are symlinks to centos-release. |
| 122 | CentOS7FileSystem.addFile("/etc/system-release", 0, |
| 123 | llvm::MemoryBuffer::getMemBuffer("CentOS Linux release 7.2.1511 (Core) \n")); |
| 124 | CentOS7FileSystem.addFile("/etc/redhat-release", 0, |
| 125 | llvm::MemoryBuffer::getMemBuffer("CentOS Linux release 7.2.1511 (Core) \n")); |
| 126 | CentOS7FileSystem.addFile("/etc/centos-release", 0, |
| 127 | llvm::MemoryBuffer::getMemBuffer("CentOS Linux release 7.2.1511 (Core) \n")); |
| 128 | CentOS7FileSystem.addFile("/etc/centos-release-upstream", 0, |
| 129 | llvm::MemoryBuffer::getMemBuffer("Derived from Red Hat Enterprise Linux 7.2 (Source)\n")); |
| 130 | CentOS7FileSystem.addFile("/etc/os-release", 0, |
| 131 | llvm::MemoryBuffer::getMemBuffer("NAME=\"CentOS Linux\"\n" |
| 132 | "VERSION=\"7 (Core)\"\n" |
| 133 | "ID=\"centos\"\n" |
| 134 | "ID_LIKE=\"rhel fedora\"\n" |
| 135 | "VERSION_ID=\"7\"\n" |
| 136 | "PRETTY_NAME=\"CentOS Linux 7 (Core)\"\n" |
| 137 | "ANSI_COLOR=\"0;31\"\n" |
| 138 | "CPE_NAME=\"cpe:/o:centos:centos:7\"\n" |
| 139 | "HOME_URL=\"https://www.centos.org/\"\n" |
| 140 | "BUG_REPORT_URL=\"https://bugs.centos.org/\"\n" |
| 141 | "\n" |
| 142 | "CENTOS_MANTISBT_PROJECT=\"CentOS-7\"\n" |
| 143 | "CENTOS_MANTISBT_PROJECT_VERSION=\"7\"\n" |
| 144 | "REDHAT_SUPPORT_PRODUCT=\"centos\"\n" |
| 145 | "REDHAT_SUPPORT_PRODUCT_VERSION=\"7\"\n")); |
| 146 | |
| 147 | Distro CentOS7{CentOS7FileSystem}; |
| 148 | ASSERT_EQ(Distro(Distro::RHEL7), CentOS7); |
| 149 | ASSERT_FALSE(CentOS7.IsUbuntu()); |
| 150 | ASSERT_TRUE(CentOS7.IsRedhat()); |
| 151 | ASSERT_FALSE(CentOS7.IsOpenSUSE()); |
| 152 | ASSERT_FALSE(CentOS7.IsDebian()); |
| 153 | } |
| 154 | |
| 155 | TEST(DistroTest, DetectOpenSUSE) { |
| 156 | vfs::InMemoryFileSystem OpenSUSELeap421FileSystem; |
| 157 | OpenSUSELeap421FileSystem.addFile("/etc/SuSE-release", 0, |
| 158 | llvm::MemoryBuffer::getMemBuffer("openSUSE 42.1 (x86_64)\n" |
| 159 | "VERSION = 42.1\n" |
| 160 | "CODENAME = Malachite\n" |
| 161 | "# /etc/SuSE-release is deprecated and will be removed in the future, use /etc/os-release instead\n")); |
| 162 | OpenSUSELeap421FileSystem.addFile("/etc/os-release", 0, |
| 163 | llvm::MemoryBuffer::getMemBuffer("NAME=\"openSUSE Leap\"\n" |
| 164 | "VERSION=\"42.1\"\n" |
| 165 | "VERSION_ID=\"42.1\"\n" |
| 166 | "PRETTY_NAME=\"openSUSE Leap 42.1 (x86_64)\"\n" |
| 167 | "ID=opensuse\n" |
| 168 | "ANSI_COLOR=\"0;32\"\n" |
| 169 | "CPE_NAME=\"cpe:/o:opensuse:opensuse:42.1\"\n" |
| 170 | "BUG_REPORT_URL=\"https://bugs.opensuse.org\"\n" |
| 171 | "HOME_URL=\"https://opensuse.org/\"\n" |
| 172 | "ID_LIKE=\"suse\"\n")); |
| 173 | |
| 174 | Distro OpenSUSELeap421{OpenSUSELeap421FileSystem}; |
| 175 | ASSERT_EQ(Distro(Distro::OpenSUSE), OpenSUSELeap421); |
| 176 | ASSERT_FALSE(OpenSUSELeap421.IsUbuntu()); |
| 177 | ASSERT_FALSE(OpenSUSELeap421.IsRedhat()); |
| 178 | ASSERT_TRUE(OpenSUSELeap421.IsOpenSUSE()); |
| 179 | ASSERT_FALSE(OpenSUSELeap421.IsDebian()); |
| 180 | |
| 181 | vfs::InMemoryFileSystem OpenSUSE132FileSystem; |
| 182 | OpenSUSE132FileSystem.addFile("/etc/SuSE-release", 0, |
| 183 | llvm::MemoryBuffer::getMemBuffer("openSUSE 13.2 (x86_64)\n" |
| 184 | "VERSION = 13.2\n" |
| 185 | "CODENAME = Harlequin\n" |
| 186 | "# /etc/SuSE-release is deprecated and will be removed in the future, use /etc/os-release instead\n")); |
| 187 | OpenSUSE132FileSystem.addFile("/etc/os-release", 0, |
| 188 | llvm::MemoryBuffer::getMemBuffer("NAME=openSUSE\n" |
| 189 | "VERSION=\"13.2 (Harlequin)\"\n" |
| 190 | "VERSION_ID=\"13.2\"\n" |
| 191 | "PRETTY_NAME=\"openSUSE 13.2 (Harlequin) (x86_64)\"\n" |
| 192 | "ID=opensuse\n" |
| 193 | "ANSI_COLOR=\"0;32\"\n" |
| 194 | "CPE_NAME=\"cpe:/o:opensuse:opensuse:13.2\"\n" |
| 195 | "BUG_REPORT_URL=\"https://bugs.opensuse.org\"\n" |
| 196 | "HOME_URL=\"https://opensuse.org/\"\n" |
| 197 | "ID_LIKE=\"suse\"\n")); |
| 198 | |
| 199 | Distro OpenSUSE132{OpenSUSE132FileSystem}; |
| 200 | ASSERT_EQ(Distro(Distro::OpenSUSE), OpenSUSE132); |
| 201 | ASSERT_FALSE(OpenSUSE132.IsUbuntu()); |
| 202 | ASSERT_FALSE(OpenSUSE132.IsRedhat()); |
| 203 | ASSERT_TRUE(OpenSUSE132.IsOpenSUSE()); |
| 204 | ASSERT_FALSE(OpenSUSE132.IsDebian()); |
| 205 | |
| 206 | vfs::InMemoryFileSystem SLES10FileSystem; |
| 207 | SLES10FileSystem.addFile("/etc/SuSE-release", 0, |
| 208 | llvm::MemoryBuffer::getMemBuffer("SUSE Linux Enterprise Server 10 (x86_64)\n" |
| 209 | "VERSION = 10\n" |
| 210 | "PATCHLEVEL = 4\n")); |
| 211 | SLES10FileSystem.addFile("/etc/lsb_release", 0, |
| 212 | llvm::MemoryBuffer::getMemBuffer("LSB_VERSION=\"core-2.0-noarch:core-3.0-noarch:core-2.0-x86_64:core-3.0-x86_64\"\n")); |
| 213 | |
| 214 | // SLES10 is unsupported and therefore evaluates to unknown |
| 215 | Distro SLES10{SLES10FileSystem}; |
| 216 | ASSERT_EQ(Distro(Distro::UnknownDistro), SLES10); |
| 217 | ASSERT_FALSE(SLES10.IsUbuntu()); |
| 218 | ASSERT_FALSE(SLES10.IsRedhat()); |
| 219 | ASSERT_FALSE(SLES10.IsOpenSUSE()); |
| 220 | ASSERT_FALSE(SLES10.IsDebian()); |
| 221 | } |
| 222 | |
| 223 | TEST(DistroTest, DetectDebian) { |
| 224 | vfs::InMemoryFileSystem DebianJessieFileSystem; |
| 225 | DebianJessieFileSystem.addFile("/etc/debian_version", 0, |
| 226 | llvm::MemoryBuffer::getMemBuffer("8.6\n")); |
| 227 | DebianJessieFileSystem.addFile("/etc/os-release", 0, |
| 228 | llvm::MemoryBuffer::getMemBuffer("PRETTY_NAME=\"Debian GNU/Linux 8 (jessie)\"\n" |
| 229 | "NAME=\"Debian GNU/Linux\"\n" |
| 230 | "VERSION_ID=\"8\"\n" |
| 231 | "VERSION=\"8 (jessie)\"\n" |
| 232 | "ID=debian\n" |
| 233 | "HOME_URL=\"http://www.debian.org/\"\n" |
| 234 | "SUPPORT_URL=\"http://www.debian.org/support\"\n" |
| 235 | "BUG_REPORT_URL=\"https://bugs.debian.org/\"\n")); |
| 236 | |
| 237 | Distro DebianJessie{DebianJessieFileSystem}; |
| 238 | ASSERT_EQ(Distro(Distro::DebianJessie), DebianJessie); |
| 239 | ASSERT_FALSE(DebianJessie.IsUbuntu()); |
| 240 | ASSERT_FALSE(DebianJessie.IsRedhat()); |
| 241 | ASSERT_FALSE(DebianJessie.IsOpenSUSE()); |
| 242 | ASSERT_TRUE(DebianJessie.IsDebian()); |
| 243 | |
| 244 | vfs::InMemoryFileSystem DebianStretchSidFileSystem; |
| 245 | DebianStretchSidFileSystem.addFile("/etc/debian_version", 0, |
| 246 | llvm::MemoryBuffer::getMemBuffer("stretch/sid\n")); |
| 247 | DebianStretchSidFileSystem.addFile("/etc/os-release", 0, |
| 248 | llvm::MemoryBuffer::getMemBuffer("PRETTY_NAME=\"Debian GNU/Linux stretch/sid\"\n" |
| 249 | "NAME=\"Debian GNU/Linux\"\n" |
| 250 | "ID=debian\n" |
| 251 | "HOME_URL=\"http://www.debian.org/\"\n" |
| 252 | "SUPPORT_URL=\"http://www.debian.org/support\"\n" |
| 253 | "BUG_REPORT_URL=\"https://bugs.debian.org/\"\n")); |
| 254 | |
| 255 | Distro DebianStretchSid{DebianStretchSidFileSystem}; |
| 256 | ASSERT_EQ(Distro(Distro::DebianStretch), DebianStretchSid); |
| 257 | ASSERT_FALSE(DebianStretchSid.IsUbuntu()); |
| 258 | ASSERT_FALSE(DebianStretchSid.IsRedhat()); |
| 259 | ASSERT_FALSE(DebianStretchSid.IsOpenSUSE()); |
| 260 | ASSERT_TRUE(DebianStretchSid.IsDebian()); |
| 261 | } |
| 262 | |
| 263 | TEST(DistroTest, DetectExherbo) { |
| 264 | vfs::InMemoryFileSystem ExherboFileSystem; |
| 265 | ExherboFileSystem.addFile("/etc/exherbo-release", 0, // (ASCII art) |
| 266 | llvm::MemoryBuffer::getMemBuffer("")); |
| 267 | ExherboFileSystem.addFile("/etc/os-release", 0, |
| 268 | llvm::MemoryBuffer::getMemBuffer("NAME=\"Exherbo\"\n" |
| 269 | "PRETTY_NAME=\"Exherbo Linux\"\n" |
| 270 | "ID=\"exherbo\"\n" |
| 271 | "ANSI_COLOR=\"0;32\"\n" |
| 272 | "HOME_URL=\"https://www.exherbo.org/\"\n" |
| 273 | "SUPPORT_URL=\"irc://irc.freenode.net/#exherbo\"\n" |
| 274 | "BUG_REPORT_URL=\"https://bugs.exherbo.org/\"\n")); |
| 275 | |
| 276 | Distro Exherbo{ExherboFileSystem}; |
| 277 | ASSERT_EQ(Distro(Distro::Exherbo), Exherbo); |
| 278 | ASSERT_FALSE(Exherbo.IsUbuntu()); |
| 279 | ASSERT_FALSE(Exherbo.IsRedhat()); |
| 280 | ASSERT_FALSE(Exherbo.IsOpenSUSE()); |
| 281 | ASSERT_FALSE(Exherbo.IsDebian()); |
| 282 | } |
| 283 | |
| 284 | TEST(DistroTest, DetectArchLinux) { |
| 285 | vfs::InMemoryFileSystem ArchLinuxFileSystem; |
| 286 | ArchLinuxFileSystem.addFile("/etc/arch-release", 0, // (empty) |
| 287 | llvm::MemoryBuffer::getMemBuffer("")); |
| 288 | ArchLinuxFileSystem.addFile("/etc/os-release", 0, |
| 289 | llvm::MemoryBuffer::getMemBuffer("NAME=\"Arch Linux\"\n" |
| 290 | "ID=arch\n" |
| 291 | "PRETTY_NAME=\"Arch Linux\"\n" |
| 292 | "ANSI_COLOR=\"0;36\"\n" |
| 293 | "HOME_URL=\"https://www.archlinux.org/\"\n" |
| 294 | "SUPPORT_URL=\"https://bbs.archlinux.org/\"\n" |
| 295 | "BUG_REPORT_URL=\"https://bugs.archlinux.org/\"\n")); |
| 296 | |
| 297 | Distro ArchLinux{ArchLinuxFileSystem}; |
| 298 | ASSERT_EQ(Distro(Distro::ArchLinux), ArchLinux); |
| 299 | ASSERT_FALSE(ArchLinux.IsUbuntu()); |
| 300 | ASSERT_FALSE(ArchLinux.IsRedhat()); |
| 301 | ASSERT_FALSE(ArchLinux.IsOpenSUSE()); |
| 302 | ASSERT_FALSE(ArchLinux.IsDebian()); |
| 303 | } |
| 304 | |
| 305 | } // end anonymous namespace |