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  }