aboutsummaryrefslogtreecommitdiff
path: root/hotline/files_test.go
blob: 9bed67003bc5238fd61af3dbeff9788bf10ec48d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
package hotline

import (
	"bytes"
	"encoding/binary"
	"github.com/stretchr/testify/assert"
	"os"
	"path/filepath"
	"testing"
)

func TestEncodeFilePath(t *testing.T) {
	var tests = []struct {
		filePath string
		want     []byte
	}{
		{
			filePath: "kitten1.jpg",
			want: []byte{
				0x00, 0x01, // number of items in path
				0x00, 0x00, // leading path separator
				0x0b,                                                             // length of next path section (11)
				0x6b, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x31, 0x2e, 0x6a, 0x70, 0x67, // kitten1.jpg
			},
		},
		{
			filePath: "foo/kitten1.jpg",
			want: []byte{
				0x00, 0x02, // number of items in path
				0x00, 0x00,
				0x03,
				0x66, 0x6f, 0x6f,
				0x00, 0x00, // leading path separator
				0x0b,                                                             // length of next path section (11)
				0x6b, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x31, 0x2e, 0x6a, 0x70, 0x67, // kitten1.jpg
			},
		},
	}

	for _, test := range tests {
		got := EncodeFilePath(test.filePath)
		if !bytes.Equal(got, test.want) {
			t.Errorf("field mismatch:  want: %#v got: %#v", test.want, got)
		}
	}
}

func TestCalcTotalSize(t *testing.T) {
	cwd, _ := os.Getwd()
	defer func() { _ = os.Chdir(cwd) }()

	_ = os.Chdir("test/config/Files")

	type args struct {
		filePath string
	}
	tests := []struct {
		name    string
		args    args
		want    []byte
		wantErr bool
	}{
		{
			name: "Foo",
			args: args{
				filePath: "test",
			},
			want:    []byte{0x00, 0x00, 0x18, 0x00},
			wantErr: false,
		},
		// TODO: Add more test cases.
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got, err := CalcTotalSize(tt.args.filePath)
			if (err != nil) != tt.wantErr {
				t.Errorf("CalcTotalSize() error = %v, wantErr %v", err, tt.wantErr)
				return
			}
			if !assert.Equal(t, tt.want, got) {
				t.Errorf("CalcTotalSize() got = %v, want %v", got, tt.want)
			}
		})
	}
}

func createTestDirStructure(baseDir string, structure map[string]string) error {
	// First pass: create directories
	for path, content := range structure {
		if content == "dir" {
			if err := os.MkdirAll(filepath.Join(baseDir, path), 0755); err != nil {
				return err
			}
		}
	}

	// Second pass: create files
	for path, content := range structure {
		if content != "dir" {
			fullPath := filepath.Join(baseDir, path)
			dir := filepath.Dir(fullPath)
			if err := os.MkdirAll(dir, 0755); err != nil {
				return err
			}
			if err := os.WriteFile(fullPath, []byte(content), 0644); err != nil {
				return err
			}
		}
	}
	return nil
}

func TestCalcItemCount(t *testing.T) {
	tests := []struct {
		name      string
		structure map[string]string
		expected  uint16
	}{
		{
			name: "directory with files",
			structure: map[string]string{
				"file1.txt":        "content1",
				"file2.txt":        "content2",
				"subdir/":          "dir",
				"subdir/file3.txt": "content3",
			},
			expected: 4, // 3 files and 1 directory, should count 4 items
		},
		{
			name: "directory with hidden files",
			structure: map[string]string{
				".hiddenfile": "hiddencontent",
				"file1.txt":   "content1",
			},
			expected: 1, // 1 non-hidden file
		},
		{
			name:      "empty directory",
			structure: map[string]string{},
			expected:  0, // 0 files
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			// Create a temporary directory for the test
			tempDir, err := os.MkdirTemp("", "test")
			if err != nil {
				t.Fatalf("Failed to create temp dir: %v", err)
			}
			defer func() { _ = os.RemoveAll(tempDir) }()

			// Create the test directory structure
			if err := createTestDirStructure(tempDir, tt.structure); err != nil {
				t.Fatalf("Failed to create test dir structure: %v", err)
			}

			// Calculate item count
			result, err := CalcItemCount(tempDir)
			if err != nil {
				t.Fatalf("CalcItemCount returned an error: %v", err)
			}

			// Convert result to uint16
			count := binary.BigEndian.Uint16(result)
			if count != tt.expected {
				t.Errorf("expected %d, got %d", tt.expected, count)
			}
		})
	}
}