operatingsystem_linux_test.go 6.7 KB

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