github.com/tompreston/snapd@v0.0.0-20210817193607-954edfcb9611/cmd/snap/cmd_debug_bootvars_test.go (about)

     1  // -*- Mode: Go; indent-tabs-mode: t -*-
     2  
     3  /*
     4   * Copyright (C) 2019 Canonical Ltd
     5   *
     6   * This program is free software: you can redistribute it and/or modify
     7   * it under the terms of the GNU General Public License version 3 as
     8   * published by the Free Software Foundation.
     9   *
    10   * This program is distributed in the hope that it will be useful,
    11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    13   * GNU General Public License for more details.
    14   *
    15   * You should have received a copy of the GNU General Public License
    16   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    17   *
    18   */
    19  
    20  package main_test
    21  
    22  import (
    23  	"gopkg.in/check.v1"
    24  
    25  	"github.com/snapcore/snapd/boot"
    26  	"github.com/snapcore/snapd/bootloader"
    27  	"github.com/snapcore/snapd/bootloader/bootloadertest"
    28  	snap "github.com/snapcore/snapd/cmd/snap"
    29  	"github.com/snapcore/snapd/release"
    30  )
    31  
    32  func (s *SnapSuite) TestDebugBootvars(c *check.C) {
    33  	restore := release.MockOnClassic(false)
    34  	defer restore()
    35  	bloader := bootloadertest.Mock("mock", c.MkDir())
    36  	bootloader.Force(bloader)
    37  	err := bloader.SetBootVars(map[string]string{
    38  		"snap_mode":       "try",
    39  		"unrelated":       "thing",
    40  		"snap_core":       "core18_1.snap",
    41  		"snap_try_core":   "core18_2.snap",
    42  		"snap_kernel":     "pc-kernel_3.snap",
    43  		"snap_try_kernel": "pc-kernel_4.snap",
    44  	})
    45  	c.Assert(err, check.IsNil)
    46  
    47  	rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"debug", "boot-vars"})
    48  	c.Assert(err, check.IsNil)
    49  	c.Assert(rest, check.HasLen, 0)
    50  	c.Check(s.Stdout(), check.Equals, `snap_mode=try
    51  snap_core=core18_1.snap
    52  snap_try_core=core18_2.snap
    53  snap_kernel=pc-kernel_3.snap
    54  snap_try_kernel=pc-kernel_4.snap
    55  `)
    56  	c.Check(s.Stderr(), check.Equals, "")
    57  }
    58  
    59  func (s *SnapSuite) TestDebugBootvarsNotOnClassic(c *check.C) {
    60  	restore := release.MockOnClassic(true)
    61  	defer restore()
    62  	_, err := snap.Parser(snap.Client()).ParseArgs([]string{"debug", "boot-vars"})
    63  	c.Assert(err, check.ErrorMatches, `the "boot-vars" command is not available on classic systems`)
    64  }
    65  
    66  func (s *SnapSuite) TestDebugSetBootvars(c *check.C) {
    67  	restore := release.MockOnClassic(false)
    68  	defer restore()
    69  	bloader := bootloadertest.Mock("mock", c.MkDir())
    70  	bootloader.Force(bloader)
    71  	err := bloader.SetBootVars(map[string]string{
    72  		"snap_mode":       "try",
    73  		"unrelated":       "thing",
    74  		"snap_core":       "core18_1.snap",
    75  		"snap_try_core":   "core18_2.snap",
    76  		"snap_kernel":     "pc-kernel_3.snap",
    77  		"snap_try_kernel": "",
    78  	})
    79  	c.Assert(err, check.IsNil)
    80  
    81  	rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"debug", "set-boot-vars",
    82  		"snap_mode=trying", "try_recovery_system=1234", "unrelated="})
    83  	c.Assert(err, check.IsNil)
    84  	c.Check(rest, check.HasLen, 0)
    85  	c.Check(bloader.BootVars, check.DeepEquals, map[string]string{
    86  		"snap_mode":           "trying",
    87  		"unrelated":           "",
    88  		"snap_core":           "core18_1.snap",
    89  		"snap_try_core":       "core18_2.snap",
    90  		"snap_kernel":         "pc-kernel_3.snap",
    91  		"snap_try_kernel":     "",
    92  		"try_recovery_system": "1234",
    93  	})
    94  }
    95  
    96  func (s *SnapSuite) TestDebugGetSetBootvarsWithParams(c *check.C) {
    97  	// the bootloader options are not intercepted by the mocks, so we can
    98  	// only observe the effect indirectly for boot-vars
    99  
   100  	restore := release.MockOnClassic(false)
   101  	defer restore()
   102  	bloader := bootloadertest.Mock("mock", c.MkDir())
   103  	bootloader.Force(bloader)
   104  	err := bloader.SetBootVars(map[string]string{
   105  		"snapd_recovery_system":  "1234",
   106  		"snapd_recovery_mode":    "run",
   107  		"unrelated":              "thing",
   108  		"snap_kernel":            "pc-kernel_3.snap",
   109  		"recovery_system_status": "try",
   110  		"try_recovery_system":    "9999",
   111  	})
   112  	c.Assert(err, check.IsNil)
   113  
   114  	rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"debug", "boot-vars", "--root-dir", boot.InitramfsUbuntuBootDir})
   115  	c.Assert(err, check.IsNil)
   116  	c.Assert(rest, check.HasLen, 0)
   117  	c.Check(s.Stdout(), check.Equals, `snapd_recovery_mode=run
   118  snapd_recovery_system=1234
   119  snapd_recovery_kernel=
   120  snap_kernel=pc-kernel_3.snap
   121  snap_try_kernel=
   122  kernel_status=
   123  recovery_system_status=try
   124  try_recovery_system=9999
   125  snapd_extra_cmdline_args=
   126  snapd_full_cmdline_args=
   127  `)
   128  	c.Check(s.Stderr(), check.Equals, "")
   129  	s.ResetStdStreams()
   130  
   131  	// and make sure that set does not blow up when passed a root dir
   132  	rest, err = snap.Parser(snap.Client()).ParseArgs([]string{"debug", "set-boot-vars", "--root-dir", boot.InitramfsUbuntuBootDir, "foo=bar"})
   133  	c.Assert(err, check.IsNil)
   134  	c.Assert(rest, check.HasLen, 0)
   135  
   136  	v, err := bloader.GetBootVars("foo")
   137  	c.Assert(err, check.IsNil)
   138  	c.Check(v, check.DeepEquals, map[string]string{
   139  		"foo": "bar",
   140  	})
   141  	// and make sure that set does not blow up when passed recover bootloader flag
   142  	rest, err = snap.Parser(snap.Client()).ParseArgs([]string{"debug", "set-boot-vars", "--recovery", "foo=recovery"})
   143  	c.Assert(err, check.IsNil)
   144  	c.Assert(rest, check.HasLen, 0)
   145  
   146  	v, err = bloader.GetBootVars("foo")
   147  	c.Assert(err, check.IsNil)
   148  	c.Check(v, check.DeepEquals, map[string]string{
   149  		"foo": "recovery",
   150  	})
   151  
   152  	// but basic sanity checks are still done
   153  	_, err = snap.Parser(snap.Client()).ParseArgs([]string{"debug", "set-boot-vars", "--recovery", "--root-dir", boot.InitramfsUbuntuBootDir, "foo=recovery"})
   154  	c.Assert(err, check.ErrorMatches, "cannot use run bootloader root-dir with a recovery flag")
   155  }