operatingsystem_unix_test.go 5.9 KB

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