All checks were successful
		
		
	
	Test / Create distribution (push) Successful in 25s
				
			Test / Hakurei (push) Successful in 44s
				
			Test / Sandbox (push) Successful in 41s
				
			Test / Hakurei (race detector) (push) Successful in 44s
				
			Test / Sandbox (race detector) (push) Successful in 41s
				
			Test / Hpkg (push) Successful in 41s
				
			Test / Flake checks (push) Successful in 1m24s
				
			Most tests already had no global state, however parallel was never enabled. This change enables it for all applicable tests. Signed-off-by: Ophestra <cat@gensokyo.uk>
		
			
				
	
	
		
			96 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package vfs_test
 | |
| 
 | |
| import (
 | |
| 	"reflect"
 | |
| 	"slices"
 | |
| 	"strings"
 | |
| 	"testing"
 | |
| 
 | |
| 	"hakurei.app/container/vfs"
 | |
| )
 | |
| 
 | |
| func TestUnfold(t *testing.T) {
 | |
| 	t.Parallel()
 | |
| 
 | |
| 	testCases := []struct {
 | |
| 		name    string
 | |
| 		sample  string
 | |
| 		target  string
 | |
| 		wantErr error
 | |
| 
 | |
| 		want         *vfs.MountInfoNode
 | |
| 		wantCollectF func(n *vfs.MountInfoNode) []*vfs.MountInfoNode
 | |
| 		wantCollectN []string
 | |
| 	}{
 | |
| 		{
 | |
| 			"no match",
 | |
| 			sampleMountinfoBase,
 | |
| 			"/mnt",
 | |
| 			&vfs.DecoderError{Op: "unfold", Line: -1, Err: vfs.UnfoldTargetError("/mnt")}, nil, nil, nil,
 | |
| 		},
 | |
| 		{
 | |
| 			"cover",
 | |
| 			`33 1 0:33 / / rw,relatime shared:1 - tmpfs impure rw,size=16777216k,mode=755
 | |
| 37 33 0:32 / /proc rw,nosuid,nodev,noexec,relatime shared:41 - proc proc rw
 | |
| 551 33 0:121 / /mnt rw,relatime shared:666 - tmpfs tmpfs rw
 | |
| 595 551 0:123 / /mnt rw,relatime shared:990 - tmpfs tmpfs rw
 | |
| 611 595 0:142 / /mnt/etc rw,relatime shared:1112 - tmpfs tmpfs rw
 | |
| 625 644 0:142 /passwd /mnt/etc/passwd rw,relatime shared:1112 - tmpfs tmpfs rw
 | |
| 641 625 0:33 /etc/passwd /mnt/etc/passwd rw,relatime shared:1 - tmpfs impure rw,size=16777216k,mode=755
 | |
| 644 611 0:33 /etc/passwd /mnt/etc/passwd rw,relatime shared:1 - tmpfs impure rw,size=16777216k,mode=755
 | |
| `, "/mnt", nil,
 | |
| 			mn(595, 551, 0, 123, "/", "/mnt", "rw,relatime", o("shared:990"), "tmpfs", "tmpfs", "rw", false,
 | |
| 				mn(611, 595, 0, 142, "/", "/mnt/etc", "rw,relatime", o("shared:1112"), "tmpfs", "tmpfs", "rw", false,
 | |
| 					mn(644, 611, 0, 33, "/etc/passwd", "/mnt/etc/passwd", "rw,relatime", o("shared:1"), "tmpfs", "impure", "rw,size=16777216k,mode=755", true,
 | |
| 						mn(625, 644, 0, 142, "/passwd", "/mnt/etc/passwd", "rw,relatime", o("shared:1112"), "tmpfs", "tmpfs", "rw", true,
 | |
| 							mn(641, 625, 0, 33, "/etc/passwd", "/mnt/etc/passwd", "rw,relatime", o("shared:1"), "tmpfs", "impure", "rw,size=16777216k,mode=755", false,
 | |
| 								nil, nil), nil), nil), nil), nil), func(n *vfs.MountInfoNode) []*vfs.MountInfoNode {
 | |
| 				return []*vfs.MountInfoNode{n, n.FirstChild, n.FirstChild.FirstChild.FirstChild.FirstChild}
 | |
| 			}, []string{"/mnt", "/mnt/etc", "/mnt/etc/passwd"},
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	for _, tc := range testCases {
 | |
| 		t.Run(tc.name, func(t *testing.T) {
 | |
| 			t.Parallel()
 | |
| 
 | |
| 			d := vfs.NewMountInfoDecoder(strings.NewReader(tc.sample))
 | |
| 			got, err := d.Unfold(tc.target)
 | |
| 
 | |
| 			if !reflect.DeepEqual(err, tc.wantErr) {
 | |
| 				t.Errorf("Unfold: error = %v, wantErr %v",
 | |
| 					err, tc.wantErr)
 | |
| 			}
 | |
| 
 | |
| 			if !reflect.DeepEqual(got, tc.want) {
 | |
| 				t.Errorf("Unfold:\ngot  %s\nwant %s",
 | |
| 					mustMarshal(got), mustMarshal(tc.want))
 | |
| 			}
 | |
| 
 | |
| 			if err == nil && tc.wantCollectF != nil {
 | |
| 				t.Run("collective", func(t *testing.T) {
 | |
| 					wantCollect := tc.wantCollectF(got)
 | |
| 					gotCollect := slices.Collect(got.Collective())
 | |
| 					if !reflect.DeepEqual(gotCollect, wantCollect) {
 | |
| 						t.Errorf("Collective: \ngot  %#v\nwant %#v",
 | |
| 							gotCollect, wantCollect)
 | |
| 					}
 | |
| 					t.Run("target", func(t *testing.T) {
 | |
| 						gotCollectN := slices.Collect[string](func(yield func(v string) bool) {
 | |
| 							for _, cur := range gotCollect {
 | |
| 								if !yield(cur.Clean) {
 | |
| 									return
 | |
| 								}
 | |
| 							}
 | |
| 						})
 | |
| 						if !reflect.DeepEqual(gotCollectN, tc.wantCollectN) {
 | |
| 							t.Errorf("Collective: got %q, want %q",
 | |
| 								gotCollectN, tc.wantCollectN)
 | |
| 						}
 | |
| 					})
 | |
| 				})
 | |
| 			}
 | |
| 		})
 | |
| 	}
 | |
| }
 |