github.com/hugh712/snapd@v0.0.0-20200910133618-1a99902bd583/osutil/overlay_linux_test.go (about) 1 // -*- Mode: Go; indent-tabs-mode: t -*- 2 3 /* 4 * Copyright (C) 2016-2018 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 osutil_test 21 22 import ( 23 . "gopkg.in/check.v1" 24 25 "github.com/snapcore/snapd/osutil" 26 ) 27 28 type overlaySuite struct{} 29 30 var _ = Suite(&overlaySuite{}) 31 32 func (s *overlaySuite) TestIsRootWritableOverlay(c *C) { 33 cases := []struct { 34 mountinfo string 35 overlay string 36 errorPattern string 37 }{{ 38 // Errors from parsing mountinfo are propagated. 39 mountinfo: "bad syntax", 40 errorPattern: "cannot parse mountinfo:.*, .*", 41 }, { 42 // overlay mounted on / are recognized 43 // casper mount source /cow 44 mountinfo: "31 1 0:26 / / rw,relatime shared:1 - overlay /cow rw,lowerdir=//filesystem.squashfs,upperdir=/cow/upper,workdir=/cow/work", 45 overlay: "/upper", 46 }, { 47 // casper mount source upperdir trailing slash 48 mountinfo: "31 1 0:26 / / rw,relatime shared:1 - overlay /cow rw,lowerdir=//filesystem.squashfs,upperdir=/cow/upper/,workdir=/cow/work", 49 overlay: "/upper", 50 }, { 51 // casper mount source trailing slash 52 mountinfo: "31 1 0:26 / / rw,relatime shared:1 - overlay /cow/ rw,lowerdir=//filesystem.squashfs,upperdir=/cow/upper,workdir=/cow/work", 53 overlay: "/upper", 54 }, { 55 // non-casper mount source 56 mountinfo: "31 1 0:26 / / rw,relatime shared:1 - overlay overlay rw,lowerdir=//filesystem.squashfs,upperdir=/cow/upper,workdir=/cow/work", 57 overlay: "/cow/upper", 58 }, { 59 // overlay mounted elsewhere are ignored 60 mountinfo: "31 1 0:26 /elsewhere /elsewhere rw,relatime shared:1 - overlay /cow rw,lowerdir=//filesystem.squashfs,upperdir=/cow/upper,workdir=/cow/work", 61 }, { 62 mountinfo: "31 1 0:26 /elsewhere /elsewhere rw,relatime shared:1 - overlay overlay rw,lowerdir=//filesystem.squashfs,upperdir=/cow/upper,workdir=/cow/work", 63 }, { 64 // casper overlay which results in empty upperdir are ignored 65 mountinfo: "31 1 0:26 / / rw,relatime shared:1 - overlay /upper rw,lowerdir=//filesystem.squashfs,upperdir=/upper,workdir=/cow/work", 66 }, { 67 // overlay with relative paths, AARE or double quotes are 68 // ignored 69 mountinfo: "31 1 0:26 / / rw,relatime shared:1 - overlay /cow rw,lowerdir=//filesystem.squashfs,upperdir=cow/upper,workdir=/cow/work", 70 }, { 71 mountinfo: "31 1 0:26 / / rw,relatime shared:1 - overlay /cow rw,lowerdir=//filesystem.squashfs,upperdir=/cow/bad?upper,workdir=/cow/work", 72 }, { 73 mountinfo: "31 1 0:26 / / rw,relatime shared:1 - overlay /cow rw,lowerdir=//filesystem.squashfs,upperdir=/cow/bad*upper,workdir=/cow/work", 74 }, { 75 mountinfo: "31 1 0:26 / / rw,relatime shared:1 - overlay /cow rw,lowerdir=//filesystem.squashfs,upperdir=/cow/bad[upper,workdir=/cow/work", 76 }, { 77 mountinfo: "31 1 0:26 / / rw,relatime shared:1 - overlay overlay rw,lowerdir=//filesystem.squashfs,upperdir=/cow/bad]upper,workdir=/cow/work", 78 }, { 79 mountinfo: "31 1 0:26 / / rw,relatime shared:1 - overlay overlay rw,lowerdir=//filesystem.squashfs,upperdir=/cow/bad{upper,workdir=/cow/work", 80 }, { 81 mountinfo: "31 1 0:26 / / rw,relatime shared:1 - overlay overlay rw,lowerdir=//filesystem.squashfs,upperdir=/cow/bad}upper,workdir=/cow/work", 82 }, { 83 mountinfo: "31 1 0:26 / / rw,relatime shared:1 - overlay overlay rw,lowerdir=//filesystem.squashfs,upperdir=/cow/bad^upper,workdir=/cow/work", 84 }, { 85 mountinfo: "31 1 0:26 / / rw,relatime shared:1 - overlay overlay rw,lowerdir=//filesystem.squashfs,upperdir=/cow/bad\"upper,workdir=/cow/work", 86 }, { 87 // The special cased version for 18.10 server release 88 mountinfo: "28 0 0:24 / / rw,realtime shared:1 - overlay overlayroot rw,lowerdir=/media/root-ro,upperdir=/media/root-rw/overlay,workdir=/media/root-rw/overlay-workdir/_", 89 overlay: "/overlay", 90 }, { 91 // The special cased version for Manjaro live CD, 92 mountinfo: "37 1 0:24 / / rw,realtime shared:1 - overlay overlay rw,lowerdir=/run/miso/sfs/livefs:/run/miso/sfs/mhwdfs:/run/miso/sfs/desktopfs:/run/miso/sfs/rootfs,upperdir=/run/miso/overlay_root/upper,workdir=/run/miso/overlay_root/work,index=off", 93 overlay: "/upper", 94 }} 95 for _, tc := range cases { 96 restore := osutil.MockMountInfo(tc.mountinfo) 97 defer restore() 98 99 overlay, err := osutil.IsRootWritableOverlay() 100 if tc.errorPattern != "" { 101 c.Assert(err, ErrorMatches, tc.errorPattern, Commentf("test case %#v", tc)) 102 } else { 103 c.Assert(err, IsNil) 104 } 105 c.Assert(overlay, Equals, tc.overlay) 106 } 107 }