operatingsystem_unix_test.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  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. nonContainerizedProc1Cgroup = []byte(`14:name=systemd:/
  134. 13:hugetlb:/
  135. 12:net_prio:/
  136. 11:perf_event:/
  137. 10:bfqio:/
  138. 9:blkio:/
  139. 8:net_cls:/
  140. 7:freezer:/
  141. 6:devices:/
  142. 5:memory:/
  143. 4:cpuacct:/
  144. 3:cpu:/
  145. 2:cpuset:/
  146. `)
  147. containerizedProc1Cgroup = []byte(`9:perf_event:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d
  148. 8:blkio:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d
  149. 7:net_cls:/
  150. 6:freezer:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d
  151. 5:devices:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d
  152. 4:memory:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d
  153. 3:cpuacct:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d
  154. 2:cpu:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d
  155. 1:cpuset:/`)
  156. )
  157. dir := os.TempDir()
  158. proc1Cgroup = filepath.Join(dir, "proc1Cgroup")
  159. defer func() {
  160. os.Remove(proc1Cgroup)
  161. proc1Cgroup = backup
  162. }()
  163. if err := ioutil.WriteFile(proc1Cgroup, nonContainerizedProc1Cgroup, 0600); err != nil {
  164. t.Fatalf("failed to write to %s: %v", proc1Cgroup, err)
  165. }
  166. inContainer, err := IsContainerized()
  167. if err != nil {
  168. t.Fatal(err)
  169. }
  170. if inContainer {
  171. t.Fatal("Wrongly assuming containerized")
  172. }
  173. if err := ioutil.WriteFile(proc1Cgroup, containerizedProc1Cgroup, 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 non-containerized")
  182. }
  183. }
  184. func TestOsReleaseFallback(t *testing.T) {
  185. var backup = etcOsRelease
  186. var altBackup = altOsRelease
  187. dir := os.TempDir()
  188. etcOsRelease = filepath.Join(dir, "etcOsRelease")
  189. altOsRelease = filepath.Join(dir, "altOsRelease")
  190. defer func() {
  191. os.Remove(dir)
  192. etcOsRelease = backup
  193. altOsRelease = altBackup
  194. }()
  195. content := `NAME=Gentoo
  196. ID=gentoo
  197. PRETTY_NAME="Gentoo/Linux"
  198. ANSI_COLOR="1;32"
  199. HOME_URL="http://www.gentoo.org/"
  200. SUPPORT_URL="http://www.gentoo.org/main/en/support.xml"
  201. BUG_REPORT_URL="https://bugs.gentoo.org/"
  202. `
  203. if err := ioutil.WriteFile(altOsRelease, []byte(content), 0600); err != nil {
  204. t.Fatalf("failed to write to %s: %v", etcOsRelease, err)
  205. }
  206. s, err := GetOperatingSystem()
  207. if err != nil || s != "Gentoo/Linux" {
  208. t.Fatalf("Expected %q, got %q (err: %v)", "Gentoo/Linux", s, err)
  209. }
  210. }