blob: 2b7926880e88e5cba3d05d5719d342e928fcb399 [file] [log] [blame]
Robin Thellend63bd6572014-08-13 17:31:51 -07001package impl_test
2
3import (
4 "io/ioutil"
5 "os"
6 "path"
7 "testing"
8
9 "veyron/services/mgmt/logreader/impl"
10
11 "veyron2/ipc"
12 "veyron2/naming"
13 "veyron2/rt"
14 "veyron2/security"
15 "veyron2/services/mgmt/logreader"
16 "veyron2/verror"
17)
18
Robin Thellend3d634e82014-08-18 16:02:12 -070019type logFileDispatcher struct {
Robin Thellend63bd6572014-08-13 17:31:51 -070020 root string
21}
22
Robin Thellend3d634e82014-08-18 16:02:12 -070023func (d *logFileDispatcher) Lookup(suffix string) (ipc.Invoker, security.Authorizer, error) {
24 invoker := ipc.ReflectInvoker(logreader.NewServerLogFile(impl.NewLogFileInvoker(d.root, suffix)))
Robin Thellend63bd6572014-08-13 17:31:51 -070025 return invoker, nil, nil
26}
27
Robin Thellend63bd6572014-08-13 17:31:51 -070028func writeAndSync(t *testing.T, w *os.File, s string) {
29 if _, err := w.WriteString(s); err != nil {
30 t.Fatalf("w.WriteString failed: %v", err)
31 }
32 if err := w.Sync(); err != nil {
33 t.Fatalf("w.Sync failed: %v", err)
34 }
35}
36
37func TestReadLogImplNoFollow(t *testing.T) {
38 runtime := rt.Init()
39
40 workdir, err := ioutil.TempDir("", "logreadertest")
41 if err != nil {
42 t.Fatalf("ioutil.TempDir: %v", err)
43 }
44 defer os.RemoveAll(workdir)
Robin Thellend3d634e82014-08-18 16:02:12 -070045 server, endpoint, err := startServer(t, &logFileDispatcher{workdir})
Robin Thellend63bd6572014-08-13 17:31:51 -070046 if err != nil {
47 t.Fatalf("startServer failed: %v", err)
48 }
49 defer stopServer(t, server)
50
51 const testFile = "mylogfile.INFO"
52 writer, err := os.Create(path.Join(workdir, testFile))
53 if err != nil {
54 t.Fatalf("Create failed: %v", err)
55 }
56
57 tests := []string{
58 "Hello World!",
59 "Life is too short",
60 "Have fun",
61 "Play hard",
62 "Break something",
63 "Fix it later",
64 }
65 for _, s := range tests {
66 writeAndSync(t, writer, s+"\n")
67 }
68
69 // Try to access a file that doesn't exist.
70 lf, err := logreader.BindLogFile(naming.JoinAddressName(endpoint, "//doesntexist"))
71 if err != nil {
72 t.Errorf("BindLogFile: %v", err)
73 }
74 _, err = lf.Size(runtime.NewContext())
75 if expected := verror.NotFound; !verror.Is(err, expected) {
76 t.Errorf("unexpected error value, got %v, want: %v", err, expected)
77 }
78
79 // Try to access a file that does exist.
80 lf, err = logreader.BindLogFile(naming.JoinAddressName(endpoint, "//"+testFile))
81 if err != nil {
82 t.Errorf("BindLogFile: %v", err)
83 }
84 _, err = lf.Size(runtime.NewContext())
85 if err != nil {
86 t.Errorf("Size failed: %v", err)
87 }
88
89 // Read without follow.
90 stream, err := lf.ReadLog(runtime.NewContext(), 0, logreader.AllEntries, false)
91 if err != nil {
92 t.Errorf("ReadLog failed: %v", err)
93 }
94 rStream := stream.RecvStream()
95 expectedPosition := int64(0)
96 for count := 0; rStream.Advance(); count++ {
97 entry := rStream.Value()
98 if entry.Position != expectedPosition {
99 t.Errorf("unexpected position. Got %v, want %v", entry.Position, expectedPosition)
100 }
101 if expected := tests[count]; entry.Line != expected {
102 t.Errorf("unexpected content. Got %q, want %q", entry.Line, expected)
103 }
104 expectedPosition += int64(len(entry.Line)) + 1
105 }
106
107 if err := rStream.Err(); err != nil {
108 t.Errorf("unexpected stream error: %v", rStream.Err())
109 }
110 offset, err := stream.Finish()
111 if err != nil {
112 t.Errorf("Finish failed: %v", err)
113 }
114 if offset != expectedPosition {
115 t.Errorf("unexpected offset. Got %q, want %q", offset, expectedPosition)
116 }
117
118 // Read with follow from EOF (where the previous read ended).
119 stream, err = lf.ReadLog(runtime.NewContext(), offset, logreader.AllEntries, false)
120 if err != nil {
121 t.Errorf("ReadLog failed: %v", err)
122 }
123 _, err = stream.Finish()
124 if !verror.Is(err, logreader.EOF) {
125 t.Errorf("unexpected error, got %#v, want EOF", err)
126 }
127}
128
129func TestReadLogImplWithFollow(t *testing.T) {
130 runtime := rt.Init()
131
132 workdir, err := ioutil.TempDir("", "logreadertest")
133 if err != nil {
134 t.Fatalf("ioutil.TempDir: %v", err)
135 }
136 defer os.RemoveAll(workdir)
Robin Thellend3d634e82014-08-18 16:02:12 -0700137 server, endpoint, err := startServer(t, &logFileDispatcher{workdir})
Robin Thellend63bd6572014-08-13 17:31:51 -0700138 if err != nil {
139 t.Fatalf("startServer failed: %v", err)
140 }
141 defer stopServer(t, server)
142
143 const testFile = "mylogfile.INFO"
144 writer, err := os.Create(path.Join(workdir, testFile))
145 if err != nil {
146 t.Fatalf("Create failed: %v", err)
147 }
148
149 tests := []string{
150 "Hello World!",
151 "Life is too short",
152 "Have fun",
153 "Play hard",
154 "Break something",
155 "Fix it later",
156 }
157
158 lf, err := logreader.BindLogFile(naming.JoinAddressName(endpoint, "//"+testFile))
159 if err != nil {
160 t.Errorf("BindLogFile: %v", err)
161 }
162 _, err = lf.Size(runtime.NewContext())
163 if err != nil {
164 t.Errorf("Size failed: %v", err)
165 }
166
167 // Read with follow.
168 stream, err := lf.ReadLog(runtime.NewContext(), 0, int32(len(tests)), true)
169 if err != nil {
170 t.Errorf("ReadLog failed: %v", err)
171 }
172 rStream := stream.RecvStream()
173 writeAndSync(t, writer, tests[0]+"\n")
174 for count, pos := 0, int64(0); rStream.Advance(); count++ {
175 entry := rStream.Value()
176 if entry.Position != pos {
177 t.Errorf("unexpected position. Got %v, want %v", entry.Position, pos)
178 }
179 if expected := tests[count]; entry.Line != expected {
180 t.Errorf("unexpected content. Got %q, want %q", entry.Line, expected)
181 }
182 pos += int64(len(entry.Line)) + 1
183 if count+1 < len(tests) {
184 writeAndSync(t, writer, tests[count+1]+"\n")
185 }
186 }
187
188 if err := rStream.Err(); err != nil {
189 t.Errorf("unexpected stream error: %v", rStream.Err())
190 }
191 _, err = stream.Finish()
192 if err != nil {
193 t.Errorf("Finish failed: %v", err)
194 }
195}