github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/pkg/parsers/operatingsystem/operatingsystem_linux_test.go (about) 1 //go:build linux || freebsd 2 3 package operatingsystem // import "github.com/Prakhar-Agarwal-byte/moby/pkg/parsers/operatingsystem" 4 5 import ( 6 "os" 7 "path/filepath" 8 "testing" 9 10 "gotest.tools/v3/assert" 11 ) 12 13 type EtcReleaseParsingTest struct { 14 name string 15 content string 16 expected string 17 expectedErr string 18 } 19 20 func TestGetOperatingSystem(t *testing.T) { 21 tests := []EtcReleaseParsingTest{ 22 { 23 content: `NAME="Ubuntu" 24 PRETTY_NAME_AGAIN="Ubuntu 14.04.LTS" 25 VERSION="14.04, Trusty Tahr" 26 ID=ubuntu 27 ID_LIKE=debian 28 VERSION_ID="14.04" 29 HOME_URL="http://www.ubuntu.com/" 30 SUPPORT_URL="http://help.ubuntu.com/" 31 BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"`, 32 expected: "Linux", 33 }, 34 { 35 content: `NAME="Ubuntu" 36 VERSION="14.04, Trusty Tahr" 37 ID=ubuntu 38 ID_LIKE=debian 39 VERSION_ID="14.04" 40 HOME_URL="http://www.ubuntu.com/" 41 SUPPORT_URL="http://help.ubuntu.com/" 42 BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"`, 43 expected: "Linux", 44 }, 45 { 46 content: `NAME=Gentoo 47 ID=gentoo 48 PRETTY_NAME="Gentoo/Linux" 49 ANSI_COLOR="1;32" 50 HOME_URL="http://www.gentoo.org/" 51 SUPPORT_URL="http://www.gentoo.org/main/en/support.xml" 52 BUG_REPORT_URL="https://bugs.gentoo.org/" 53 `, 54 expected: "Gentoo/Linux", 55 }, 56 { 57 content: `NAME="Ubuntu" 58 VERSION="14.04, Trusty Tahr" 59 ID=ubuntu 60 ID_LIKE=debian 61 PRETTY_NAME="Ubuntu 14.04 LTS" 62 VERSION_ID="14.04" 63 HOME_URL="http://www.ubuntu.com/" 64 SUPPORT_URL="http://help.ubuntu.com/" 65 BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"`, 66 expected: "Ubuntu 14.04 LTS", 67 }, 68 { 69 content: `NAME="Ubuntu" 70 VERSION="14.04, Trusty Tahr" 71 ID=ubuntu 72 ID_LIKE=debian 73 PRETTY_NAME='Ubuntu 14.04 LTS'`, 74 expected: "Ubuntu 14.04 LTS", 75 }, 76 { 77 content: `PRETTY_NAME=Source 78 NAME="Source Mage"`, 79 expected: "Source", 80 }, 81 { 82 content: `PRETTY_NAME=Source 83 PRETTY_NAME="Source Mage"`, 84 expected: "Source Mage", 85 }, 86 } 87 88 runEtcReleaseParsingTests(t, tests, GetOperatingSystem) 89 } 90 91 func TestGetOperatingSystemVersion(t *testing.T) { 92 tests := []EtcReleaseParsingTest{ 93 { 94 name: "ubuntu 14.04", 95 content: `NAME="Ubuntu" 96 PRETTY_NAME="Ubuntu 14.04.LTS" 97 VERSION="14.04, Trusty Tahr" 98 ID=ubuntu 99 ID_LIKE=debian 100 VERSION_ID="14.04" 101 HOME_URL="http://www.ubuntu.com/" 102 SUPPORT_URL="http://help.ubuntu.com/" 103 BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"`, 104 expected: "14.04", 105 }, 106 { 107 name: "gentoo", 108 content: `NAME=Gentoo 109 ID=gentoo 110 PRETTY_NAME="Gentoo/Linux" 111 ANSI_COLOR="1;32" 112 HOME_URL="http://www.gentoo.org/" 113 SUPPORT_URL="http://www.gentoo.org/main/en/support.xml" 114 BUG_REPORT_URL="https://bugs.gentoo.org/" 115 `, 116 }, 117 { 118 name: "dual version id", 119 content: `VERSION_ID="14.04" 120 VERSION_ID=18.04`, 121 expected: "18.04", 122 }, 123 } 124 125 runEtcReleaseParsingTests(t, tests, GetOperatingSystemVersion) 126 } 127 128 func runEtcReleaseParsingTests(t *testing.T, tests []EtcReleaseParsingTest, parsingFunc func() (string, error)) { 129 backup := etcOsRelease 130 131 dir := os.TempDir() 132 etcOsRelease = filepath.Join(dir, "etcOsRelease") 133 134 defer func() { 135 os.Remove(etcOsRelease) 136 etcOsRelease = backup 137 }() 138 139 for _, test := range tests { 140 t.Run(test.name, func(t *testing.T) { 141 if err := os.WriteFile(etcOsRelease, []byte(test.content), 0o600); err != nil { 142 t.Fatalf("failed to write to %s: %v", etcOsRelease, err) 143 } 144 s, err := parsingFunc() 145 if test.expectedErr == "" { 146 assert.NilError(t, err) 147 } else { 148 assert.Error(t, err, test.expectedErr) 149 } 150 assert.Equal(t, s, test.expected) 151 }) 152 } 153 } 154 155 func TestIsContainerized(t *testing.T) { 156 var ( 157 backup = proc1Cgroup 158 nonContainerizedProc1Cgroupsystemd226 = []byte(`9:memory:/init.scope 159 8:net_cls,net_prio:/ 160 7:cpuset:/ 161 6:freezer:/ 162 5:devices:/init.scope 163 4:blkio:/init.scope 164 3:cpu,cpuacct:/init.scope 165 2:perf_event:/ 166 1:name=systemd:/init.scope 167 `) 168 nonContainerizedProc1Cgroup = []byte(`14:name=systemd:/ 169 13:hugetlb:/ 170 12:net_prio:/ 171 11:perf_event:/ 172 10:bfqio:/ 173 9:blkio:/ 174 8:net_cls:/ 175 7:freezer:/ 176 6:devices:/ 177 5:memory:/ 178 4:cpuacct:/ 179 3:cpu:/ 180 2:cpuset:/ 181 `) 182 containerizedProc1Cgroup = []byte(`9:perf_event:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d 183 8:blkio:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d 184 7:net_cls:/ 185 6:freezer:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d 186 5:devices:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d 187 4:memory:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d 188 3:cpuacct:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d 189 2:cpu:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d 190 1:cpuset:/`) 191 nonContainerizedProc1CgroupNotSystemd = []byte(`9:memory:/not/init.scope 192 1:name=not_systemd:/not.init.scope 193 `) 194 ) 195 196 dir := os.TempDir() 197 proc1Cgroup = filepath.Join(dir, "proc1Cgroup") 198 199 defer func() { 200 os.Remove(proc1Cgroup) 201 proc1Cgroup = backup 202 }() 203 204 if err := os.WriteFile(proc1Cgroup, nonContainerizedProc1Cgroup, 0o600); err != nil { 205 t.Fatalf("failed to write to %s: %v", proc1Cgroup, err) 206 } 207 inContainer, err := IsContainerized() 208 if err != nil { 209 t.Fatal(err) 210 } 211 if inContainer { 212 t.Fatal("Wrongly assuming containerized") 213 } 214 215 if err := os.WriteFile(proc1Cgroup, nonContainerizedProc1Cgroupsystemd226, 0o600); err != nil { 216 t.Fatalf("failed to write to %s: %v", proc1Cgroup, err) 217 } 218 inContainer, err = IsContainerized() 219 if err != nil { 220 t.Fatal(err) 221 } 222 if inContainer { 223 t.Fatal("Wrongly assuming containerized for systemd /init.scope cgroup layout") 224 } 225 226 if err := os.WriteFile(proc1Cgroup, nonContainerizedProc1CgroupNotSystemd, 0o600); err != nil { 227 t.Fatalf("failed to write to %s: %v", proc1Cgroup, err) 228 } 229 inContainer, err = IsContainerized() 230 if err != nil { 231 t.Fatal(err) 232 } 233 if !inContainer { 234 t.Fatal("Wrongly assuming non-containerized") 235 } 236 237 if err := os.WriteFile(proc1Cgroup, containerizedProc1Cgroup, 0o600); err != nil { 238 t.Fatalf("failed to write to %s: %v", proc1Cgroup, err) 239 } 240 inContainer, err = IsContainerized() 241 if err != nil { 242 t.Fatal(err) 243 } 244 if !inContainer { 245 t.Fatal("Wrongly assuming non-containerized") 246 } 247 } 248 249 func TestOsReleaseFallback(t *testing.T) { 250 backup := etcOsRelease 251 altBackup := altOsRelease 252 dir := os.TempDir() 253 etcOsRelease = filepath.Join(dir, "etcOsRelease") 254 altOsRelease = filepath.Join(dir, "altOsRelease") 255 256 defer func() { 257 os.Remove(dir) 258 etcOsRelease = backup 259 altOsRelease = altBackup 260 }() 261 content := `NAME=Gentoo 262 ID=gentoo 263 PRETTY_NAME="Gentoo/Linux" 264 ANSI_COLOR="1;32" 265 HOME_URL="http://www.gentoo.org/" 266 SUPPORT_URL="http://www.gentoo.org/main/en/support.xml" 267 BUG_REPORT_URL="https://bugs.gentoo.org/" 268 ` 269 if err := os.WriteFile(altOsRelease, []byte(content), 0o600); err != nil { 270 t.Fatalf("failed to write to %s: %v", etcOsRelease, err) 271 } 272 s, err := GetOperatingSystem() 273 if err != nil || s != "Gentoo/Linux" { 274 t.Fatalf("Expected %q, got %q (err: %v)", "Gentoo/Linux", s, err) 275 } 276 }