Best Syzkaller code snippet using main.populateDir
imagegen.go
Source:imagegen.go
...506 if err != nil {507 tool.Fail(err)508 }509 defer os.RemoveAll(templateDir)510 if err := populateDir(templateDir); err != nil {511 tool.Fail(err)512 }513 shutdown := make(chan struct{})514 osutil.HandleInterrupts(shutdown)515 procs := runtime.NumCPU()516 requests := make(chan *Image, procs)517 go func() {518 for _, image := range images {519 image.templateDir = templateDir520 requests <- image521 }522 close(requests)523 }()524 for p := 0; p < procs; p++ {525 go func() {526 for image := range requests {527 select {528 case <-shutdown:529 image.done <- errShutdown530 default:531 image.done <- image.generate()532 }533 }534 }()535 }536 printResults(images, shutdown, *flagKeepImage, *flagVerbose)537}538func printResults(images []*Image, shutdown chan struct{}, keepImage, verbose bool) {539 good, failed := 0, 0540 hashes := make(map[uint32][]*Image)541 for _, image := range images {542 err := <-image.done543 if image.disk != "" && !keepImage {544 os.Remove(image.disk)545 }546 select {547 case <-shutdown:548 err = errShutdown549 default:550 }551 if err == errShutdown {552 continue553 }554 size := fmt.Sprintf("%vKB", image.size>>10)555 if image.size >= 1<<20 {556 size = fmt.Sprintf("%vMB", image.size>>20)557 }558 res := "ok"559 if err != nil {560 res = fmt.Sprintf("failed:\n\t%v", err)561 }562 if verbose || err != nil {563 fmt.Printf("#%02v: mkfs.%v[%5v] %v: %v\n", image.index, image.fs.Name, size, image.flags, res)564 }565 if err != nil {566 failed++567 continue568 }569 hashes[image.hash] = append(hashes[image.hash], image)570 good++571 }572 fmt.Printf("generated images: %v/%v\n", good, len(images))573 for _, image := range images {574 group := hashes[image.hash]575 if len(group) <= 1 {576 continue577 }578 delete(hashes, image.hash)579 fmt.Printf("equal images:\n")580 for _, image := range group {581 fmt.Printf("\tmkfs.%v %v\n", image.fs.Name, image.flags)582 }583 }584 if failed != 0 {585 os.Exit(1)586 }587}588func generateImages(target *prog.Target, flagFS string, list bool) ([]*Image, error) {589 var images []*Image590 for _, fs := range fileSystems {591 if flagFS != "" && flagFS != fs.Name {592 continue593 }594 index := 0595 enumerateFlags(target, &images, &index, fs, fs.MkfsFlags, 0)596 if list {597 fmt.Printf("%v [%v images]\n", fs.Name, index)598 continue599 }600 files, err := filepath.Glob(filepath.Join("sys", targets.Linux, "test", "syz_mount_image_"+fs.Name+"_*"))601 if err != nil {602 return nil, fmt.Errorf("error reading output dir: %v", err)603 }604 for _, file := range files {605 if err := os.Remove(file); err != nil {606 return nil, fmt.Errorf("error removing output file: %v", err)607 }608 }609 }610 return images, nil611}612func enumerateFlags(target *prog.Target, images *[]*Image, index *int, fs FileSystem, flags []string, flagsIndex int) {613 if flagsIndex == len(fs.MkfsFlagCombinations) {614 *images = append(*images, &Image{615 target: target,616 fs: fs,617 flags: append([]string{}, flags...),618 index: *index,619 done: make(chan error, 1),620 })621 *index++622 return623 }624 for _, flag := range fs.MkfsFlagCombinations[flagsIndex] {625 flags1 := flags626 for _, f := range strings.Split(flag, " ") {627 if f != "" {628 flags1 = append(flags1, f)629 }630 }631 enumerateFlags(target, images, index, fs, flags1, flagsIndex+1)632 }633}634func (image *Image) generate() error {635 var err error636 for image.size = image.fs.MinSize; image.size <= 128<<20; image.size *= 2 {637 if err = image.generateSize(); err == nil {638 return nil639 }640 }641 return err642}643func (image *Image) generateSize() error {644 outFile := filepath.Join("sys", targets.Linux, "test",645 fmt.Sprintf("syz_mount_image_%v_%v", image.fs.Name, image.index))646 image.disk = outFile + ".img"647 f, err := os.Create(image.disk)648 if err != nil {649 return err650 }651 f.Close()652 if err := os.Truncate(image.disk, int64(image.size)); err != nil {653 return err654 }655 if image.fs.Mkfs == nil {656 if _, err := runCmd("mkfs."+image.fs.Name, append(image.flags, image.disk)...); err != nil {657 return err658 }659 } else {660 if err := image.fs.Mkfs(image); err != nil {661 return err662 }663 }664 if !image.fs.ReadOnly {665 // This does not work with runCmd -- sudo does not show password prompt on console.666 cmd := exec.Command("sudo", os.Args[0], "-populate", image.disk, "-fs", image.fs.Name)667 if out, err := cmd.CombinedOutput(); err != nil {668 return fmt.Errorf("image population failed: %v\n%s", err, out)669 }670 }671 data, err := ioutil.ReadFile(image.disk)672 if err != nil {673 return err674 }675 image.hash = crc32.ChecksumIEEE(data)676 out, err := writeImage(image.fs, data)677 if err != nil {678 return err679 }680 p, err := image.target.Deserialize(out, prog.Strict)681 if err != nil {682 return fmt.Errorf("failed to deserialize resulting program: %v", err)683 }684 exec := make([]byte, prog.ExecBufferSize)685 if _, err := p.SerializeForExec(exec); err != nil {686 return fmt.Errorf("failed to serialize for execution: %v", err)687 }688 return osutil.WriteFile(outFile, out)689}690// Runs under sudo in a subprocess.691func populate(disk, fs string) error {692 output, err := runCmd("losetup", "-f", "--show", "-P", disk)693 if err != nil {694 return err695 }696 loop := strings.TrimSpace(string(output))697 defer runCmd("losetup", "-d", loop)698 dir, err := ioutil.TempDir("", "syz-imagegen")699 if err != nil {700 return err701 }702 defer os.RemoveAll(dir)703 if _, err := runCmd("mount", "-t", fs, loop, dir); err != nil {704 return fmt.Errorf("%v\n%s", err, output)705 }706 defer runCmd("umount", dir)707 return populateDir(dir)708}709func populateDir(dir string) error {710 zeros := func(size int) []byte {711 return make([]byte, size)712 }713 nonzeros := func(size int) []byte {714 const fill = "syzkaller"715 return bytes.Repeat([]byte(fill), size/len(fill)+1)[:size]716 }717 if err := os.Mkdir(filepath.Join(dir, "file0"), 0777); err != nil {718 return err719 }720 if err := ioutil.WriteFile(filepath.Join(dir, "file0", "file0"), nonzeros(1050), 0777); err != nil {721 return err722 }723 os.Symlink(filepath.Join(dir, "file0", "file0"), filepath.Join(dir, "file0", "file1"))...
oxfstool.go
Source:oxfstool.go
...70 }71 }72 return kind, size, err73}74func populateDir(fileSet []string, files map[string]ofile, n int) *dirTree {75 var dT dirTree76 c := len(fileSet)77 if c > n {78 sz := c / (n + 1)79 fmt.Println("sz:", sz)80 dT.Name = make([]string, n)81 dT.P = make([]*dirTree, n)82 dT.P0 = populateDir(fileSet[0:sz], files, n)83 for i := 1; i <= n; i++ {84 e := i * sz85 dT.Name[i-1] = fileSet[e]86 z := (i + 1) * sz87 if i == n {88 z = c89 }90 dT.P[i-1] = populateDir(fileSet[e+1:z], files, n)91 }92 } else {93 dT.Name = make([]string, c)94 dT.P = make([]*dirTree, c)95 for e := 0; e < c; e++ {96 dT.Name[e] = fileSet[e]97 }98 }99 return &dT100}101func produceFileData(f *os.File, outfmt int, thisSector int, data []byte) (_ int, _ int, err error) {102 sectorsize := 1024103 if outfmt == EXTENDED || outfmt == PADDEDEXTENDED {104 sectorsize = 4096105 }106 if outfmt == ORIGINAL || outfmt == EXTENDED {107 _, err = f.Seek(((int64(thisSector)/29)-1)*int64(sectorsize), 0)108 } else {109 _, err = f.Seek(PADOFFSET+((int64(thisSector)/29)*int64(sectorsize))-1, 0)110 }111 if err == nil {112 _, err = f.Write(data)113 }114 return thisSector, thisSector + 29, err115}116func produceIndirectBlock(f *os.File, ib *iblock, outfmt int) (err error) {117 if outfmt == ORIGINAL {118 _, err = f.Seek((int64(ib.A/29)-1)*1024, 0)119 } else {120 _, err = f.Seek(PADOFFSET+((int64(ib.A/29))*1024)-1, 0)121 }122 if err == nil {123 err = binary.Write(f, binary.LittleEndian, ib.E)124 }125 return err126}127func produceXIndirectBlock(f *os.File, xb *xblock, outfmt int) (err error) {128 if outfmt == EXTENDED {129 _, err = f.Seek((int64(xb.A/29)-1)*4096, 0)130 } else {131 _, err = f.Seek(PADOFFSET+((int64(xb.A/29))*4096)-1, 0)132 }133 if err == nil {134 err = binary.Write(f, binary.LittleEndian, xb.E)135 }136 return err137}138func produceFile(f *os.File, e ofile, name string, outfmt int, thisSector int, iFHP int, FHPp *oxfsgo.OXFS_HeaderPage) (_ int, _ int, _ int, _ int, err error) {139 nextFree := thisSector140 cFHP := iFHP141 FHPpBmap := 0142 if outfmt == ORIGINAL || outfmt == PADDEDORIGINAL {143 nextFree = thisSector + 29144 var hdrPage oxfsgo.OBFS_FileHeader145 fillsize := 1024 - oxfsgo.OBFS_HeaderSize146 hdrPage.Mark = oxfsgo.OBFS_HeaderMark147 hdrPage.Aleng = int32(len(e.Data)+oxfsgo.OBFS_HeaderSize) / 1024148 hdrPage.Bleng = int32(len(e.Data)+oxfsgo.OBFS_HeaderSize) % 1024149 for x, ch := range []byte(name) {150 hdrPage.Name[x] = ch151 }152 if len(e.Data) >= 1024-oxfsgo.OBFS_HeaderSize {153 copy(hdrPage.Fill[0:fillsize], e.Data[0:fillsize])154 } else {155 copy(hdrPage.Fill[0:len(e.Data)], e.Data[:])156 }157 hdrPage.Sec[0] = oxfsgo.OBFS_DiskAdr(thisSector)158 var ib iblock159 indirectUsed := false160 for n := 1; n <= int(hdrPage.Aleng); n++ {161 var dAdr int162 thisstart := fillsize + ((n - 1) * 1024)163 thisend := thisstart + 1024164 if thisend > len(e.Data) {165 thisend = len(e.Data)166 }167 dAdr, nextFree, err = produceFileData(f, outfmt, nextFree, e.Data[thisstart:thisend])168 if n < oxfsgo.OBFS_SecTabSize {169 hdrPage.Sec[n] = oxfsgo.OBFS_DiskAdr(dAdr)170 } else if ((n - oxfsgo.OBFS_SecTabSize) / 256) < oxfsgo.OBFS_ExTabSize {171 ni := n - oxfsgo.OBFS_SecTabSize172 if ni%256 == 0 {173 if indirectUsed {174 _ = produceIndirectBlock(f, &ib, outfmt)175 }176 indirectUsed = true177 hdrPage.Ext[ni/256] = oxfsgo.OBFS_DiskAdr(nextFree)178 ib.A = int64(nextFree)179 nextFree = nextFree + 29180 }181 ib.E[ni%256] = uint32(dAdr)182 } else {183 // silently truncate file that is too large184 }185 }186 if indirectUsed {187 _ = produceIndirectBlock(f, &ib, outfmt)188 }189 if outfmt == ORIGINAL {190 _, err = f.Seek((int64(thisSector/29)-1)*1024, 0)191 } else {192 _, err = f.Seek(PADOFFSET+((int64(thisSector/29))*1024)-1, 0)193 }194 if err == nil {195 err = binary.Write(f, binary.LittleEndian, hdrPage)196 }197 } else {198 if FHPp.Mark == 0 {199 FHPp.Mark = oxfsgo.OXFS_HeaderMark200 FHPp.Next = 0201 FHPp.Bmap = 0202 for i := 0; i < oxfsgo.OXFS_HdrPgSize; i++ {203 FHPp.Headers[i].Type = 4294967295 // empty slot204 }205 } else {206 FHPp.Bmap = FHPp.Bmap + 1207 if FHPp.Bmap == 63 {208 FHPp.Bmap = 0xFFFFFFFFFFFFFFFF209 if outfmt == EXTENDED {210 _, err = f.Seek((int64(cFHP/29)-1)*4096, 0)211 } else {212 _, err = f.Seek(PADOFFSET+((int64(cFHP/29))*4096)-1, 0)213 }214 if err == nil {215 err = binary.Write(f, binary.LittleEndian, *FHPp)216 }217 cFHP = nextFree218 nextFree = thisSector + 29219 FHPp.Bmap = 0220 for i := 0; i < oxfsgo.OXFS_HdrPgSize; i++ {221 FHPp.Headers[i].Type = 4294967295 // empty slot222 }223 }224 }225 FHPp.Headers[FHPp.Bmap].Type = 0 // regular file226 FHPp.Headers[FHPp.Bmap].Perm = 0227 FHPp.Headers[FHPp.Bmap].Date = 0228 FHPp.Headers[FHPp.Bmap].Length = uint64(len(e.Data))229 fmt.Println(" size ", FHPp.Headers[FHPp.Bmap].Length)230 FHPp.Headers[FHPp.Bmap].Owner = 0231 FHPp.Headers[FHPp.Bmap].Group = 0232 var xb xblock233 indirectUsed := false234 for n := 0; n <= len(e.Data)/4096; n++ {235 var dAdr int236 thisstart := n * 4096237 thisend := thisstart + 4096238 if thisend > len(e.Data) {239 thisend = len(e.Data)240 }241 dAdr, nextFree, err = produceFileData(f, outfmt, nextFree, e.Data[thisstart:thisend])242 if n < 3 {243 FHPp.Headers[FHPp.Bmap].Tab[n] = oxfsgo.OXFS_DiskAdr(dAdr)244 } else if ((n - 3) / 512) < 511 {245 ni := (n - 3) / 512246 if ni%512 == 0 {247 if indirectUsed {248 _ = produceXIndirectBlock(f, &xb, outfmt)249 }250 indirectUsed = true251 FHPp.Headers[FHPp.Bmap].Tab[3] = oxfsgo.OXFS_DiskAdr(nextFree)252 xb.A = int64(nextFree)253 nextFree = nextFree + 29254 }255 xb.E[ni%512] = uint64(dAdr)256 } else {257 // silently truncate file that is too large258 }259 }260 if indirectUsed {261 _ = produceXIndirectBlock(f, &xb, outfmt)262 }263 if outfmt == EXTENDED {264 _, err = f.Seek((int64(cFHP/29)-1)*4096, 0)265 } else {266 _, err = f.Seek(PADOFFSET+((int64(cFHP/29))*4096)-1, 0)267 }268 if err == nil {269 err = binary.Write(f, binary.LittleEndian, *FHPp)270 }271 FHPpBmap = int(FHPp.Bmap)272 }273 fmt.Println("producing file ", name)274 return thisSector, FHPpBmap, nextFree, cFHP, err275}276func produceDir(f *os.File, dT *dirTree, files map[string]ofile, outfmt int, thisSector int, iFHP int, FHPp *oxfsgo.OXFS_HeaderPage) (_ int, _ int, _ int, err error) {277 var storedAt, storedIdx int278 nextFree := thisSector + 29279 if nextFree < 65*29 {280 nextFree = 65 * 29281 }282 cFHP := iFHP283 if cFHP == 0 {284 cFHP = nextFree285 nextFree = nextFree + 29286 }287 if outfmt == ORIGINAL || outfmt == PADDEDORIGINAL {288 var dirPage oxfsgo.OBFS_DirPage289 dirPage.Mark = oxfsgo.OBFS_DirMark290 dirPage.M = int32(len(dT.Name))291 if dT.P0 != nil {292 storedAt, nextFree, _, err = produceDir(f, dT.P0, files, outfmt, nextFree, -1, FHPp)293 dirPage.P0 = oxfsgo.OBFS_DiskAdr(storedAt)294 }295 for i, _ := range dT.P {296 for x, ch := range []byte(dT.Name[i]) {297 dirPage.E[i].Name[x] = ch298 }299 storedAt, _, nextFree, _, err = produceFile(f, files[dT.Name[i]], dT.Name[i], outfmt, nextFree, -1, FHPp)300 dirPage.E[i].Adr = oxfsgo.OBFS_DiskAdr(storedAt)301 if dT.P[i] != nil {302 storedAt, nextFree, _, err = produceDir(f, dT.P[i], files, outfmt, nextFree, -1, FHPp)303 dirPage.E[i].P = oxfsgo.OBFS_DiskAdr(storedAt)304 }305 }306 if outfmt == ORIGINAL {307 _, err = f.Seek((int64(thisSector/29)-1)*1024, 0)308 } else {309 _, err = f.Seek(PADOFFSET+((int64(thisSector/29))*1024)-1, 0)310 }311 if err == nil {312 err = binary.Write(f, binary.LittleEndian, dirPage)313 }314 } else {315 var dirPage oxfsgo.OXFS_DirPage316 dirPage.Mark = oxfsgo.OXFS_DirMark317 dirPage.M = int64(len(dT.Name))318 if dT.P0 != nil {319 storedAt, nextFree, cFHP, err = produceDir(f, dT.P0, files, outfmt, nextFree, cFHP, FHPp)320 dirPage.P0 = oxfsgo.OXFS_DiskAdr(storedAt)321 }322 for i, _ := range dT.P {323 for x, ch := range []byte(dT.Name[i]) {324 dirPage.E[i].Name[x] = ch325 }326 fmt.Print(" producing ", dT.Name[i])327 _, storedIdx, nextFree, cFHP, err = produceFile(f, files[dT.Name[i]], dT.Name[i], outfmt, nextFree, cFHP, FHPp)328 dirPage.E[i].Adr = oxfsgo.OXFS_DiskAdr(cFHP)329 dirPage.E[i].I = byte(storedIdx)330 if dT.P[i] != nil {331 storedAt, nextFree, cFHP, err = produceDir(f, dT.P[i], files, outfmt, nextFree, cFHP, FHPp)332 dirPage.E[i].P = oxfsgo.OXFS_DiskAdr(storedAt)333 }334 }335 if outfmt == EXTENDED {336 _, err = f.Seek((int64(thisSector/29)-1)*4096, 0)337 } else {338 _, err = f.Seek(PADOFFSET+((int64(thisSector/29))*4096)-1, 0)339 }340 if err == nil {341 err = binary.Write(f, binary.LittleEndian, dirPage)342 fmt.Println("dirpage")343 for i := 0; i < int(dirPage.M); i++ {344 fmt.Println(" ", dirPage.E[i].Name, dirPage.E[i].Adr, dirPage.E[i].I, dirPage.E[i].P)345 }346 }347 }348 return thisSector, nextFree, cFHP, err349}350func installBootImage(f *os.File, bootImage []byte, outfmt int) (err error) {351 var i int352 var ssz int64353 if outfmt == EXTENDED || outfmt == PADDEDEXTENDED {354 ssz = 4096355 } else {356 ssz = 1024357 }358 if outfmt == ORIGINAL || outfmt == EXTENDED {359 _, err = f.Seek(ssz, 0)360 } else {361 _, err = f.Seek(PADOFFSET+ssz, 0)362 }363 if err == nil {364 i, err = f.Write(bootImage)365 fmt.Println("boot image bytes written:", i)366 }367 return err368}369func produceDirTree(files map[string]ofile, outfmt int, fw *os.File) (err error) {370 var nA []string371 var FHP oxfsgo.OXFS_HeaderPage372 var FHPp *oxfsgo.OXFS_HeaderPage373 nE := len(files)374 if _, ok := files["_BOOTIMAGE_"]; ok {375 nE = len(files) - 1376 _ = installBootImage(fw, files["_BOOTIMAGE_"].Data, outfmt)377 }378 if err == nil {379 nA = make([]string, nE)380 i := 0381 for fn, _ := range files {382 if fn != "_BOOTIMAGE_" {383 nA[i] = fn384 i++385 }386 }387 rnA := nA[:]388 sort.Strings(rnA)389 dsz := oxfsgo.OBFS_N + (oxfsgo.OBFS_N / 2)390 cFHP := -1391 if outfmt == EXTENDED || outfmt == PADDEDEXTENDED {392 dsz = oxfsgo.OXFS_N + (oxfsgo.OXFS_N / 2)393 cFHP = 0394 FHPp = &FHP395 FHPp.Mark = 0396 FHPp.Next = 0397 }398 dT := populateDir(rnA[:], files, dsz)399 _, _, _, err = produceDir(fw, dT, files, outfmt, 29, cFHP, FHPp)400 }401 return err402}403func producefs(name string, files map[string]ofile, outfmt int, force bool, osize int64, size string) (err error) {404 var fi *os.File405 keys := make([]string, 0, len(files))406 for k := range files {407 keys = append(keys, k)408 }409 sort.Strings(keys)410 if outfmt != LOCALFILES {411 if size == "same" && osize == 0 {412 err = fmt.Errorf("cannot use destination disk image size 'same' if source is files")...
cmd_auto_import_test.go
Source:cmd_auto_import_test.go
1// -*- Mode: Go; indent-tabs-mode: t -*-2/*3 * Copyright (C) 2016 Canonical Ltd4 *5 * This program is free software: you can redistribute it and/or modify6 * it under the terms of the GNU General Public License version 3 as7 * published by the Free Software Foundation.8 *9 * This program is distributed in the hope that it will be useful,10 * but WITHOUT ANY WARRANTY; without even the implied warranty of11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12 * GNU General Public License for more details.13 *14 * You should have received a copy of the GNU General Public License15 * along with this program. If not, see <http://www.gnu.org/licenses/>.16 *17 */18package main_test19import (20 "fmt"21 "io/ioutil"22 "net/http"23 "os"24 "path/filepath"25 . "gopkg.in/check.v1"26 "github.com/snapcore/snapd/boot"27 snap "github.com/snapcore/snapd/cmd/snap"28 "github.com/snapcore/snapd/dirs"29 "github.com/snapcore/snapd/logger"30 "github.com/snapcore/snapd/osutil"31 "github.com/snapcore/snapd/release"32 "github.com/snapcore/snapd/snap/snaptest"33 "github.com/snapcore/snapd/testutil"34)35func makeMockMountInfo(c *C, content string) string {36 fn := filepath.Join(c.MkDir(), "mountinfo")37 err := ioutil.WriteFile(fn, []byte(content), 0644)38 c.Assert(err, IsNil)39 return fn40}41func (s *SnapSuite) TestAutoImportAssertsHappy(c *C) {42 restore := release.MockOnClassic(false)43 defer restore()44 fakeAssertData := []byte("my-assertion")45 n := 046 total := 247 s.RedirectClientToTestServer(func(w http.ResponseWriter, r *http.Request) {48 switch n {49 case 0:50 c.Check(r.Method, Equals, "POST")51 c.Check(r.URL.Path, Equals, "/v2/assertions")52 postData, err := ioutil.ReadAll(r.Body)53 c.Assert(err, IsNil)54 c.Check(postData, DeepEquals, fakeAssertData)55 fmt.Fprintln(w, `{"type": "sync", "result": {"ready": true, "status": "Done"}}`)56 n++57 case 1:58 c.Check(r.Method, Equals, "POST")59 c.Check(r.URL.Path, Equals, "/v2/users")60 postData, err := ioutil.ReadAll(r.Body)61 c.Assert(err, IsNil)62 c.Check(string(postData), Equals, `{"action":"create","sudoer":true,"known":true}`)63 fmt.Fprintln(w, `{"type": "sync", "result": [{"username": "foo"}]}`)64 n++65 default:66 c.Fatalf("unexpected request: %v (expected %d got %d)", r, total, n)67 }68 })69 fakeAssertsFn := filepath.Join(c.MkDir(), "auto-import.assert")70 err := ioutil.WriteFile(fakeAssertsFn, fakeAssertData, 0644)71 c.Assert(err, IsNil)72 mockMountInfoFmt := `7324 0 8:18 / %s rw,relatime shared:1 - ext4 /dev/sdb2 rw,errors=remount-ro,data=ordered`74 content := fmt.Sprintf(mockMountInfoFmt, filepath.Dir(fakeAssertsFn))75 restore = snap.MockMountInfoPath(makeMockMountInfo(c, content))76 defer restore()77 logbuf, restore := logger.MockLogger()78 defer restore()79 rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"auto-import"})80 c.Assert(err, IsNil)81 c.Assert(rest, DeepEquals, []string{})82 c.Check(s.Stdout(), Equals, `created user "foo"`+"\n")83 // matches because we may get a:84 // "WARNING: cannot create syslog logger\n"85 // in the output86 c.Check(logbuf.String(), Matches, fmt.Sprintf("(?ms).*imported %s\n", fakeAssertsFn))87 c.Check(n, Equals, total)88}89func (s *SnapSuite) TestAutoImportAssertsNotImportedFromLoop(c *C) {90 restore := release.MockOnClassic(false)91 defer restore()92 fakeAssertData := []byte("bad-assertion")93 s.RedirectClientToTestServer(func(w http.ResponseWriter, r *http.Request) {94 // assertion is ignored, nothing is posted to this endpoint95 panic("not reached")96 })97 fakeAssertsFn := filepath.Join(c.MkDir(), "auto-import.assert")98 err := ioutil.WriteFile(fakeAssertsFn, fakeAssertData, 0644)99 c.Assert(err, IsNil)100 mockMountInfoFmtWithLoop := `10124 0 8:18 / %s rw,relatime shared:1 - squashfs /dev/loop1 rw,errors=remount-ro,data=ordered`102 content := fmt.Sprintf(mockMountInfoFmtWithLoop, filepath.Dir(fakeAssertsFn))103 restore = snap.MockMountInfoPath(makeMockMountInfo(c, content))104 defer restore()105 rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"auto-import"})106 c.Assert(err, IsNil)107 c.Assert(rest, DeepEquals, []string{})108 c.Check(s.Stdout(), Equals, "")109 c.Check(s.Stderr(), Equals, "")110}111func (s *SnapSuite) TestAutoImportCandidatesHappy(c *C) {112 dirs := make([]string, 4)113 args := make([]interface{}, len(dirs))114 files := make([]string, len(dirs))115 for i := range dirs {116 dirs[i] = c.MkDir()117 args[i] = dirs[i]118 files[i] = filepath.Join(dirs[i], "auto-import.assert")119 err := ioutil.WriteFile(files[i], nil, 0644)120 c.Assert(err, IsNil)121 }122 mockMountInfoFmtWithLoop := `123too short12424 0 8:18 / %[1]s rw,relatime foo ext3 /dev/meep2 no,separator12524 0 8:18 / %[2]s rw,relatime - ext3 /dev/meep2 rw,errors=remount-ro,data=ordered12624 0 8:18 / %[3]s rw,relatime opt:1 - ext4 /dev/meep3 rw,errors=remount-ro,data=ordered12724 0 8:18 / %[4]s rw,relatime opt:1 opt:2 - ext2 /dev/meep1 rw,errors=remount-ro,data=ordered128`129 content := fmt.Sprintf(mockMountInfoFmtWithLoop, args...)130 restore := snap.MockMountInfoPath(makeMockMountInfo(c, content))131 defer restore()132 l, err := snap.AutoImportCandidates()133 c.Check(err, IsNil)134 c.Check(l, DeepEquals, files[1:])135}136func (s *SnapSuite) TestAutoImportAssertsHappyNotOnClassic(c *C) {137 restore := release.MockOnClassic(true)138 defer restore()139 fakeAssertData := []byte("my-assertion")140 s.RedirectClientToTestServer(func(w http.ResponseWriter, r *http.Request) {141 c.Errorf("auto-import on classic is disabled, but something tried to do a %q with %s", r.Method, r.URL.Path)142 })143 fakeAssertsFn := filepath.Join(c.MkDir(), "auto-import.assert")144 err := ioutil.WriteFile(fakeAssertsFn, fakeAssertData, 0644)145 c.Assert(err, IsNil)146 mockMountInfoFmt := `14724 0 8:18 / %s rw,relatime shared:1 - ext4 /dev/sdb2 rw,errors=remount-ro,data=ordered`148 content := fmt.Sprintf(mockMountInfoFmt, filepath.Dir(fakeAssertsFn))149 restore = snap.MockMountInfoPath(makeMockMountInfo(c, content))150 defer restore()151 rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"auto-import"})152 c.Assert(err, IsNil)153 c.Assert(rest, DeepEquals, []string{})154 c.Check(s.Stdout(), Equals, "")155 c.Check(s.Stderr(), Equals, "auto-import is disabled on classic\n")156}157func (s *SnapSuite) TestAutoImportIntoSpool(c *C) {158 restore := release.MockOnClassic(false)159 defer restore()160 logbuf, restore := logger.MockLogger()161 defer restore()162 fakeAssertData := []byte("good-assertion")163 // ensure we can not connect164 snap.ClientConfig.BaseURL = "can-not-connect-to-this-url"165 fakeAssertsFn := filepath.Join(c.MkDir(), "auto-import.assert")166 err := ioutil.WriteFile(fakeAssertsFn, fakeAssertData, 0644)167 c.Assert(err, IsNil)168 mockMountInfoFmt := `16924 0 8:18 / %s rw,relatime shared:1 - squashfs /dev/sc1 rw,errors=remount-ro,data=ordered`170 content := fmt.Sprintf(mockMountInfoFmt, filepath.Dir(fakeAssertsFn))171 restore = snap.MockMountInfoPath(makeMockMountInfo(c, content))172 defer restore()173 rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"auto-import"})174 c.Assert(err, IsNil)175 c.Assert(rest, DeepEquals, []string{})176 c.Check(s.Stdout(), Equals, "")177 // matches because we may get a:178 // "WARNING: cannot create syslog logger\n"179 // in the output180 c.Check(logbuf.String(), Matches, "(?ms).*queuing for later.*\n")181 files, err := ioutil.ReadDir(dirs.SnapAssertsSpoolDir)182 c.Assert(err, IsNil)183 c.Check(files, HasLen, 1)184 c.Check(files[0].Name(), Equals, "iOkaeet50rajLvL-0Qsf2ELrTdn3XIXRIBlDewcK02zwRi3_TJlUOTl9AaiDXmDn.assert")185}186func (s *SnapSuite) TestAutoImportFromSpoolHappy(c *C) {187 restore := release.MockOnClassic(false)188 defer restore()189 fakeAssertData := []byte("my-assertion")190 n := 0191 total := 2192 s.RedirectClientToTestServer(func(w http.ResponseWriter, r *http.Request) {193 switch n {194 case 0:195 c.Check(r.Method, Equals, "POST")196 c.Check(r.URL.Path, Equals, "/v2/assertions")197 postData, err := ioutil.ReadAll(r.Body)198 c.Assert(err, IsNil)199 c.Check(postData, DeepEquals, fakeAssertData)200 fmt.Fprintln(w, `{"type": "sync", "result": {"ready": true, "status": "Done"}}`)201 n++202 case 1:203 c.Check(r.Method, Equals, "POST")204 c.Check(r.URL.Path, Equals, "/v2/users")205 postData, err := ioutil.ReadAll(r.Body)206 c.Assert(err, IsNil)207 c.Check(string(postData), Equals, `{"action":"create","sudoer":true,"known":true}`)208 fmt.Fprintln(w, `{"type": "sync", "result": [{"username": "foo"}]}`)209 n++210 default:211 c.Fatalf("unexpected request: %v (expected %d got %d)", r, total, n)212 }213 })214 fakeAssertsFn := filepath.Join(dirs.SnapAssertsSpoolDir, "1234343")215 err := os.MkdirAll(filepath.Dir(fakeAssertsFn), 0755)216 c.Assert(err, IsNil)217 err = ioutil.WriteFile(fakeAssertsFn, fakeAssertData, 0644)218 c.Assert(err, IsNil)219 logbuf, restore := logger.MockLogger()220 defer restore()221 rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"auto-import"})222 c.Assert(err, IsNil)223 c.Assert(rest, DeepEquals, []string{})224 c.Check(s.Stdout(), Equals, `created user "foo"`+"\n")225 // matches because we may get a:226 // "WARNING: cannot create syslog logger\n"227 // in the output228 c.Check(logbuf.String(), Matches, fmt.Sprintf("(?ms).*imported %s\n", fakeAssertsFn))229 c.Check(n, Equals, total)230 c.Check(osutil.FileExists(fakeAssertsFn), Equals, false)231}232func (s *SnapSuite) TestAutoImportIntoSpoolUnhappyTooBig(c *C) {233 restore := release.MockOnClassic(false)234 defer restore()235 _, restoreLogger := logger.MockLogger()236 defer restoreLogger()237 // fake data is bigger than the default assertion limit238 fakeAssertData := make([]byte, 641*1024)239 // ensure we can not connect240 snap.ClientConfig.BaseURL = "can-not-connect-to-this-url"241 fakeAssertsFn := filepath.Join(c.MkDir(), "auto-import.assert")242 err := ioutil.WriteFile(fakeAssertsFn, fakeAssertData, 0644)243 c.Assert(err, IsNil)244 mockMountInfoFmt := `24524 0 8:18 / %s rw,relatime shared:1 - squashfs /dev/sc1 rw,errors=remount-ro,data=ordered`246 content := fmt.Sprintf(mockMountInfoFmt, filepath.Dir(fakeAssertsFn))247 restore = snap.MockMountInfoPath(makeMockMountInfo(c, content))248 defer restore()249 _, err = snap.Parser(snap.Client()).ParseArgs([]string{"auto-import"})250 c.Assert(err, ErrorMatches, "cannot queue .*, file size too big: 656384")251}252func (s *SnapSuite) TestAutoImportUnhappyInInstallMode(c *C) {253 restore := release.MockOnClassic(false)254 defer restore()255 _, restoreLogger := logger.MockLogger()256 defer restoreLogger()257 mockProcCmdlinePath := filepath.Join(c.MkDir(), "cmdline")258 err := ioutil.WriteFile(mockProcCmdlinePath, []byte("foo=bar snapd_recovery_mode=install snapd_recovery_system=20191118"), 0644)259 c.Assert(err, IsNil)260 restore = boot.MockProcCmdline(mockProcCmdlinePath)261 defer restore()262 _, err = snap.Parser(snap.Client()).ParseArgs([]string{"auto-import"})263 c.Assert(err, IsNil)264 c.Check(s.Stdout(), Equals, "")265 c.Check(s.Stderr(), Equals, "auto-import is disabled in install-mode\n")266}267var mountStatic = []string{"mount", "-t", "ext4,vfat", "-o", "ro", "--make-private"}268func (s *SnapSuite) TestAutoImportFromRemovable(c *C) {269 restore := release.MockOnClassic(false)270 defer restore()271 _, restoreLogger := logger.MockLogger()272 defer restoreLogger()273 rootdir := c.MkDir()274 dirs.SetRootDir(rootdir)275 var umounts []string276 restore = snap.MockSyscallUmount(func(p string, _ int) error {277 umounts = append(umounts, p)278 return nil279 })280 defer restore()281 var tmpdirIdx int282 restore = snap.MockIoutilTempDir(func(where string, p string) (string, error) {283 c.Check(where, Equals, "")284 tmpdirIdx++285 return filepath.Join(rootdir, fmt.Sprintf("/tmp/%s%d", p, tmpdirIdx)), nil286 })287 defer restore()288 mountCmd := testutil.MockCommand(c, "mount", "")289 defer mountCmd.Restore()290 snaptest.PopulateDir(rootdir, [][]string{291 // removable without partitions292 {"sys/block/sdremovable/removable", "1\n"},293 // fixed disk294 {"sys/block/sdfixed/removable", "0\n"},295 // removable with partitions296 {"sys/block/sdpart/removable", "1\n"},297 {"sys/block/sdpart/sdpart1/partition", "1\n"},298 {"sys/block/sdpart/sdpart2/partition", "0\n"},299 {"sys/block/sdpart/sdpart3/partition", "1\n"},300 // removable but subdevices are not partitions?301 {"sys/block/sdother/removable", "1\n"},302 {"sys/block/sdother/sdother1/partition", "0\n"},303 })304 // do not mock mountinfo contents, we just want to observe whether we305 // try to mount and umount the right stuff306 _, err := snap.Parser(snap.Client()).ParseArgs([]string{"auto-import"})307 c.Assert(err, IsNil)308 c.Check(s.Stdout(), Equals, "")309 c.Check(s.Stderr(), Equals, "")310 c.Check(mountCmd.Calls(), DeepEquals, [][]string{311 append(mountStatic, "/dev/sdpart1", filepath.Join(rootdir, "/tmp/snapd-auto-import-mount-1")),312 append(mountStatic, "/dev/sdpart3", filepath.Join(rootdir, "/tmp/snapd-auto-import-mount-2")),313 append(mountStatic, "/dev/sdremovable", filepath.Join(rootdir, "/tmp/snapd-auto-import-mount-3")),314 })315 c.Check(umounts, DeepEquals, []string{316 filepath.Join(rootdir, "/tmp/snapd-auto-import-mount-3"),317 filepath.Join(rootdir, "/tmp/snapd-auto-import-mount-2"),318 filepath.Join(rootdir, "/tmp/snapd-auto-import-mount-1"),319 })320}321func (s *SnapSuite) TestAutoImportNoRemovable(c *C) {322 restore := release.MockOnClassic(false)323 defer restore()324 rootdir := c.MkDir()325 dirs.SetRootDir(rootdir)326 var umounts []string327 restore = snap.MockSyscallUmount(func(p string, _ int) error {328 return fmt.Errorf("unexpected call")329 })330 defer restore()331 mountCmd := testutil.MockCommand(c, "mount", "exit 1")332 defer mountCmd.Restore()333 snaptest.PopulateDir(rootdir, [][]string{334 // fixed disk335 {"sys/block/sdfixed/removable", "0\n"},336 // removable but subdevices are not partitions?337 {"sys/block/sdother/removable", "1\n"},338 {"sys/block/sdother/sdother1/partition", "0\n"},339 })340 _, err := snap.Parser(snap.Client()).ParseArgs([]string{"auto-import"})341 c.Assert(err, IsNil)342 c.Check(s.Stdout(), Equals, "")343 c.Check(s.Stderr(), Equals, "")344 c.Check(mountCmd.Calls(), HasLen, 0)345 c.Check(umounts, HasLen, 0)346}347func (s *SnapSuite) TestAutoImportFromMount(c *C) {348 restore := release.MockOnClassic(false)349 defer restore()350 _, restoreLogger := logger.MockLogger()351 defer restoreLogger()352 mountCmd := testutil.MockCommand(c, "mount", "")353 rootdir := c.MkDir()354 dirs.SetRootDir(rootdir)355 var umounts []string356 restore = snap.MockSyscallUmount(func(p string, _ int) error {357 c.Assert(umounts, HasLen, 0)358 umounts = append(umounts, p)359 return nil360 })361 defer restore()362 var tmpdircalls int363 restore = snap.MockIoutilTempDir(func(where string, p string) (string, error) {364 c.Check(where, Equals, "")365 c.Assert(tmpdircalls, Equals, 0)366 tmpdircalls++367 return filepath.Join(rootdir, fmt.Sprintf("/tmp/%s1", p)), nil368 })369 defer restore()370 // do not mock mountinfo contents, we just want to observe whether we371 // try to mount and umount the right stuff372 _, err := snap.Parser(snap.Client()).ParseArgs([]string{"auto-import", "--mount", "/dev/foobar"})373 c.Assert(err, IsNil)374 c.Check(s.Stdout(), Equals, "")375 c.Check(s.Stderr(), Equals, "")376 c.Check(mountCmd.Calls(), DeepEquals, [][]string{377 append(mountStatic, "/dev/foobar", filepath.Join(rootdir, "/tmp/snapd-auto-import-mount-1")),378 })379 c.Check(umounts, DeepEquals, []string{380 filepath.Join(rootdir, "/tmp/snapd-auto-import-mount-1"),381 })382}...
populateDir
Using AI Code Generation
1import (2func main() {3 if len(os.Args) != 2 {4 fmt.Println("Usage: go run 2.go <directory>")5 os.Exit(1)6 }7 populateDir(dir)8}9func populateDir(dir string) {10 files, err := filepath.Glob(filepath.Join(dir, "*"))11 if err != nil {12 fmt.Println("Error getting file list")13 os.Exit(1)14 }15 for _, file := range files {16 fmt.Println(file)17 }18}
populateDir
Using AI Code Generation
1import (2func main() {3 newFile, err := os.Create("test.txt")4 if err != nil {5 log.Fatal(err)6 }7 defer newFile.Close()8 filePath := filepath.Dir("test.txt")9 populateDir(filePath)10}11func populateDir(path string) {12 newFile, err := os.Create("test1.txt")13 if err != nil {14 log.Fatal(err)15 }16 defer newFile.Close()17 filePath := filepath.Dir("test1.txt")18 newFile1, err := os.Create("test2.txt")19 if err != nil {20 log.Fatal(err)21 }22 defer newFile1.Close()23 filePath1 := filepath.Dir("test2.txt")24 newFile2, err := os.Create("test3.txt")25 if err != nil {26 log.Fatal(err)27 }28 defer newFile2.Close()29 filePath2 := filepath.Dir("test3.txt")30 newFile3, err := os.Create("test4.txt")31 if err != nil {32 log.Fatal(err)33 }34 defer newFile3.Close()35 filePath3 := filepath.Dir("test4.txt")36 newFile4, err := os.Create("test5.txt")37 if err != nil {38 log.Fatal(err)39 }40 defer newFile4.Close()41 filePath4 := filepath.Dir("test5.txt")42 newFile5, err := os.Create("test6.txt")43 if err != nil {44 log.Fatal(err)45 }46 defer newFile5.Close()
populateDir
Using AI Code Generation
1import (2func main() {3 fmt.Println("Enter the path to be populated: ")4 fmt.Scanln(&path)5 os.Chdir(path)6 fmt.Println("Enter the number of files to be created: ")7 fmt.Scanln(&n)8 for i := 0; i < n; i++ {9 fmt.Println("Enter the name of the file: ")10 fmt.Scanln(&name)11 f, err := os.Create(name)12 if err != nil {13 fmt.Println("Error creating file")14 }15 f.Close()16 }17}
populateDir
Using AI Code Generation
1import (2func main() {3 obj.populateDir()4 fmt.Println(obj.dir)5}6import (7func main() {8 obj.populateDir()9 fmt.Println(obj.dir)10}11import (12func main() {13 obj.populateDir()14 fmt.Println(obj.dir)15}16import (17func main() {18 obj.populateDir()19 fmt.Println(obj.dir)20}21import (22func main() {23 obj.populateDir()24 fmt.Println(obj.dir)25}26import (27func main() {28 obj.populateDir()29 fmt.Println(obj.dir)30}31import (32func main() {33 obj.populateDir()34 fmt.Println(obj.dir)35}36import (37func main() {
populateDir
Using AI Code Generation
1import (2func main() {3 fmt.Println("Enter the directory name")4 fmt.Scanln(&dirName)5 fmt.Println("Enter the number of sub-directories")6 fmt.Scanln(&numSubDir)7 fmt.Println("Enter the number of files")8 fmt.Scanln(&numFiles)9 err := os.Mkdir(dirPath, 0777)10 if err != nil {11 fmt.Println("Error creating directory")12 }13 for i := 0; i < numSubDir; i++ {14 fmt.Println("Enter the sub-directory name")15 fmt.Scanln(&subDirName)16 err := os.Mkdir(subDirPath, 0777)17 if err != nil {18 fmt.Println("Error creating sub-directory")19 }20 for j := 0; j < numFiles; j++ {21 fmt.Println("Enter the file name")22 fmt.Scanln(&fileName)23 f, err := os.Create(filePath)24 if err != nil {25 fmt.Println("Error creating file")26 }27 fmt.Println("Enter the file content")28 fmt.Scanln(&fileContent)29 _, err = f.WriteString(fileContent)30 if err != nil {31 fmt.Println("Error writing to file")32 }33 f.Close()34 }35 }36}37import (38func main() {39 fmt.Println("Enter the directory name")40 fmt.Scanln(&dirName)41 err := os.RemoveAll(dirPath)42 if err != nil {43 fmt.Println("Error deleting directory")44 }45}
populateDir
Using AI Code Generation
1import (2func main() {3 m := new(mainClass)4 m.populateDir()5 fmt.Println(m.dir)6 fmt.Println(len(m.dir))7}8import (9func main() {10 m := new(mainClass)11 m.populateDir()12 fmt.Println(m.dir)13 fmt.Println(len(m.dir))14}15import (16type mainClass struct {17}18func (m *mainClass) populateDir() {19 files, err := ioutil.ReadDir("./")20 if err != nil {21 fmt.Println(err)22 }23 m.dir = make(map[string]os.FileInfo)24 for _, f := range files {25 m.dir[f.Name()] = f26 }27 m.sortDir()28}29func (m *mainClass) sortDir() {30 sorted := make([]string, len(m.dir))31 for k := range m.dir {32 }33 sort.Strings(sorted)34 newDir := make(map[string]os.FileInfo)
populateDir
Using AI Code Generation
1import (2func main() {3 dir = new(DirectoryImpl)4 dir.populateDir("C:\\Users\\sudha\\Desktop\\GoLang")5 fmt.Println(dir)6}
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!