systemd-journal 1.1.2 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/spec/spec_helper.rb CHANGED
@@ -1,43 +1,32 @@
1
1
  require 'rspec'
2
+ require 'json'
2
3
  require 'simplecov'
3
4
 
5
+ module SpecHelper
6
+ def fixture_dir
7
+ @path ||= File.join(File.expand_path(__dir__), 'fixtures')
8
+ end
9
+
10
+ def journal_file
11
+ @file ||= File.join(fixture_dir, 'test.journal')
12
+ end
13
+
14
+ def journal_json
15
+ @json ||= JSON.parse(File.read(File.join(fixture_dir, 'test.json')))
16
+ end
17
+
18
+ def entry_field(index, name)
19
+ journal_json[index][name.to_s.upcase]
20
+ end
21
+ end
22
+
4
23
  SimpleCov.start do
5
24
  add_filter '.bundle/'
6
25
  end
7
26
  require 'systemd/journal'
8
27
 
9
28
  RSpec.configure do |config|
10
- config.before(:each) do
11
-
12
- # Stub open and close calls
13
- dummy_open = ->(ptr, flags, path = nil) do
14
- ptr.write_pointer(nil)
15
- 0
16
- end
17
-
18
- ['', '_directory', '_files', '_container'].each do |suffix|
19
- Systemd::Journal::Native.stub(:"sd_journal_open#{suffix}", &dummy_open)
20
- end
21
- Systemd::Journal::Native.stub(:sd_journal_close).and_return(0)
22
-
23
- # Raise an exception if any native calls are actually called
24
- native_calls = Systemd::Journal::Native.methods.select do |m|
25
- m.to_s.start_with?('sd_')
26
- end
27
29
 
28
- native_calls -= [
29
- :sd_journal_open, :sd_journal_open_directory, :sd_journal_close,
30
- :sd_journal_open_files, :sd_journal_open_container
31
- ]
32
-
33
- build_err_proc = ->(method_name) do
34
- return ->(*params) do
35
- raise RuntimeError.new("#{method_name} called without being stubbed.")
36
- end
37
- end
38
-
39
- native_calls.each do |meth|
40
- Systemd::Journal::Native.stub(meth, &build_err_proc.call(meth))
41
- end
42
- end
30
+ config.disable_monkey_patching!
31
+ config.include SpecHelper
43
32
  end
@@ -1,556 +1,140 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Systemd::Journal do
4
-
5
- describe '#initialize' do
6
- it 'opens a directory if a path is passed' do
7
- Systemd::Journal::Native.should_receive(:sd_journal_open_directory)
8
- Systemd::Journal::Native.should_not_receive(:sd_journal_open)
9
- Systemd::Journal.new(path: '/path/to/journal')
10
- end
11
-
12
- it 'accepts flags as an argument' do
13
- Systemd::Journal::Native.should_receive(:sd_journal_open)
14
- .with(anything, 1234)
15
-
16
- Systemd::Journal.new(flags: 1234)
17
- end
18
-
19
- it 'accepts a files argument to open specific files' do
20
- Systemd::Journal::Native.should_receive(:sd_journal_open_files)
21
- Systemd::Journal.new(files: ['/path/to/journal/1', '/path/to/journal/2'])
22
- end
23
-
24
- it 'accepts a machine name to open a container' do
25
- Systemd::Journal::Native.should_receive(:sd_journal_open_container)
26
- Systemd::Journal.new(container: 'bobs-machine')
27
- end
28
-
29
- it 'raises a Journal Error if a native call fails' do
30
- Systemd::Journal::Native.should_receive(:sd_journal_open).and_return(-1)
31
- expect { Systemd::Journal.new }.to raise_error(Systemd::JournalError)
32
- end
33
-
34
- it 'raises an argument error if conflicting options are passed' do
35
- expect do
36
- Systemd::Journal.new(path: 'p', files: %w{a b})
37
- end.to raise_error(ArgumentError)
38
- expect do
39
- Systemd::Journal.new(container: 'c', files: %w{a b})
40
- end.to raise_error(ArgumentError)
3
+ RSpec.describe Systemd::Journal do
4
+ subject(:j) do
5
+ Systemd::Journal.new(files: [journal_file]).tap do |j|
6
+ j.seek(:head)
7
+ j.move_next
41
8
  end
42
9
  end
43
10
 
44
- describe '#move' do
45
- it 'calls move_next_skip if the value is positive' do
46
- j = Systemd::Journal.new
47
- j.should_receive(:move_next_skip).with(5)
48
- j.move(5)
49
- end
50
-
51
- it 'calls move_next_previous otherwise' do
52
- j = Systemd::Journal.new
53
- j.should_receive(:move_previous_skip).with(5)
54
- j.move(-5)
55
- end
56
- end
57
-
58
- %w{next previous}.each do |direction|
59
- describe "#move_#{direction}" do
60
- it 'returns true on a successful move' do
61
- j = Systemd::Journal.new
62
- Systemd::Journal::Native
63
- .should_receive(:"sd_journal_#{direction}")
64
- .and_return(1)
65
-
66
- j.send(:"move_#{direction}").should eq(true)
67
- end
11
+ describe 'initialize' do
12
+ subject(:j) { Systemd::Journal }
68
13
 
69
- it 'returns false on EOF' do
70
- j = Systemd::Journal.new
71
- Systemd::Journal::Native
72
- .should_receive(:"sd_journal_#{direction}")
73
- .and_return(0)
74
-
75
- j.send(:"move_#{direction}").should eq(false)
76
- end
77
-
78
- it 'raises an exception on failure' do
79
- j = Systemd::Journal.new
80
- Systemd::Journal::Native
81
- .should_receive(:"sd_journal_#{direction}")
82
- .and_return(-1)
83
-
84
- expect do
85
- j.send(:"move_#{direction}")
86
- end.to raise_error(Systemd::JournalError)
87
- end
88
- end
89
-
90
- describe "#move_#{direction}_skip" do
91
- it 'returns the number of records moved by' do
92
- Systemd::Journal::Native
93
- .should_receive(:"sd_journal_#{direction}_skip")
94
- .with(anything, 10)
95
- .and_return(10)
96
-
97
- Systemd::Journal.new.send(:"move_#{direction}_skip", 10).should eq(10)
98
- end
99
-
100
- it 'raises an exception on failure' do
101
- Systemd::Journal::Native
102
- .should_receive(:"sd_journal_#{direction}_skip")
103
- .with(anything, 10)
104
- .and_return(-1)
105
-
106
- j = Systemd::Journal.new
107
-
108
- expect do
109
- j.send(:"move_#{direction}_skip", 10)
110
- end.to raise_error(Systemd::JournalError)
111
- end
14
+ it 'detects invalid argument combinations' do
15
+ expect { j.new(path: '/', files: []) }.to raise_error(ArgumentError)
16
+ expect { j.new(container: '', files: []) }.to raise_error(ArgumentError)
17
+ expect { j.new(container: '', path: '/') }.to raise_error(ArgumentError)
112
18
  end
113
19
  end
114
20
 
115
- describe '#each' do
116
- it 'should reposition to the head of the journal' do
117
- j = Systemd::Journal.new
118
- j.should_receive(:seek).with(:head).and_return(0)
119
- j.stub(:move_next).and_return(nil)
120
- j.each { |e| nil }
121
- end
122
-
123
- it 'should return an enumerator if no block is given' do
124
- j = Systemd::Journal.new
125
- j.each.class.should eq(Enumerator)
126
- end
127
-
128
- it 'should return each entry in the journal' do
129
- entries = [{ '_PID' => 1 }, { '_PID' => 2 }]
130
- entry = nil
131
-
132
- j = Systemd::Journal.new
133
- j.stub(:seek).and_return(0)
134
- j.stub(:current_entry) { entry }
135
- j.stub(:move_next) { entry = entries.shift }
136
-
137
- j.map { |e| e['_PID'] }.should eq([1, 2])
138
- end
139
-
140
- end
141
-
142
- describe '#seek' do
143
- it 'moves to the first entry of the file' do
144
- j = Systemd::Journal.new
145
- Systemd::Journal::Native
146
- .should_receive(:sd_journal_seek_head)
147
- .and_return(0)
148
-
149
- j.seek(:head).should eq(true)
150
- end
151
-
152
- it 'moves to the last entry of the file' do
153
- j = Systemd::Journal.new
154
- Systemd::Journal::Native
155
- .should_receive(:sd_journal_seek_tail)
156
- .and_return(0)
157
-
158
- j.seek(:tail).should eq(true)
159
- end
160
-
161
- it 'seeks based on time when a time is provided' do
162
- j = Systemd::Journal.new
163
- Systemd::Journal::Native
164
- .should_receive(:sd_journal_seek_realtime_usec)
165
- .and_return(0)
166
-
167
- j.seek(Time.now).should eq(true)
168
- end
169
-
170
- it 'seeks based on a cursor when a string is provided' do
171
- j = Systemd::Journal.new
172
-
173
- Systemd::Journal::Native
174
- .should_receive(:sd_journal_seek_cursor)
175
- .with(anything, '123')
176
- .and_return(0)
177
-
178
- j.seek('123')
179
- end
180
-
181
- it 'throws an exception if it doesnt understand the type' do
182
- j = Systemd::Journal.new
183
- expect { j.seek(Object.new) }.to raise_error(ArgumentError)
184
- end
185
- end
186
-
187
- describe '#read_field' do
188
- it 'raises an exception if the call fails' do
189
- j = Systemd::Journal.new
190
- Systemd::Journal::Native
191
- .should_receive(:sd_journal_get_data)
192
- .and_return(-1)
193
-
194
- expect { j.read_field(:message) }.to raise_error(Systemd::JournalError)
195
- end
196
-
197
- it 'parses the returned value correctly.' do
198
- j = Systemd::Journal.new
199
- Systemd::Journal::Native
200
- .should_receive(:sd_journal_get_data) do |ptr, field, out_ptr, len_ptr|
201
- dummy = 'MESSAGE=hello world'
202
- out_ptr.write_pointer(FFI::MemoryPointer.from_string(dummy))
203
- len_ptr.write_size_t(dummy.size)
204
- 0
205
- end
206
-
207
- j.read_field(:message).should eq('hello world')
208
- end
209
- end
210
-
211
- describe '#current_entry' do
212
- before(:each) do
213
- Systemd::Journal::Native
214
- .should_receive(:sd_journal_restart_data)
215
- .and_return(nil)
216
- end
217
-
218
- it 'raises an exception if the call fails' do
219
- j = Systemd::Journal.new
220
- Systemd::Journal::Native
221
- .should_receive(:sd_journal_enumerate_data)
222
- .and_return(-1)
223
-
224
- expect { j.current_entry }.to raise_error(Systemd::JournalError)
225
- end
226
-
227
- it 'returns the correct data' do
228
- j = Systemd::Journal.new
229
- results = ['_PID=100', 'MESSAGE=hello world']
230
-
231
- Systemd::Journal::Native
232
- .should_receive(:sd_journal_enumerate_data)
233
- .exactly(3).times do |ptr, out_ptr, len_ptr|
234
- if results.any?
235
- x = results.shift
236
- out_ptr.write_pointer(FFI::MemoryPointer.from_string(x))
237
- len_ptr.write_size_t(x.length)
238
- 1
239
- else
240
- 0
241
- end
242
- end
243
-
244
- entry = j.current_entry
245
-
246
- entry._pid.should eq('100')
247
- entry.message.should eq('hello world')
248
- end
249
- end
250
-
251
- describe '#query_unique' do
252
- before(:each) do
253
- Systemd::Journal::Native
254
- .should_receive(:sd_journal_restart_unique)
255
- .and_return(nil)
256
- end
257
-
258
- it 'raises an exception if the call fails' do
259
- j = Systemd::Journal.new
260
- Systemd::Journal::Native
261
- .should_receive(:sd_journal_query_unique)
262
- .and_return(-1)
263
-
264
- expect { j.query_unique(:_pid) }.to raise_error(Systemd::JournalError)
265
- end
266
-
267
- it 'raises an exception if the call fails (2)' do
268
- j = Systemd::Journal.new
269
- Systemd::Journal::Native
270
- .should_receive(:sd_journal_query_unique)
271
- .and_return(0)
272
-
273
- Systemd::Journal::Native
274
- .should_receive(:sd_journal_enumerate_unique)
21
+ describe 'query_unique' do
22
+ it 'throws a JournalError on invalid return code' do
23
+ expect(Systemd::Journal::Native).to receive(:sd_journal_enumerate_unique)
275
24
  .and_return(-1)
276
25
 
277
26
  expect { j.query_unique(:_pid) }.to raise_error(Systemd::JournalError)
278
27
  end
279
28
 
280
- it 'returns the correct data' do
281
- j = Systemd::Journal.new
282
- results = ['_PID=100', '_PID=200', '_PID=300']
283
-
284
- Systemd::Journal::Native
285
- .should_receive(:sd_journal_query_unique)
286
- .and_return(0)
29
+ it 'lists all the unique values for the given field' do
30
+ values = j.query_unique(:_transport)
31
+ transports = %w(syslog journal stdout kernel driver)
287
32
 
288
- Systemd::Journal::Native
289
- .should_receive(:sd_journal_enumerate_unique)
290
- .exactly(4).times do |ptr, out_ptr, len_ptr|
291
- if results.any?
292
- x = results.shift
293
- out_ptr.write_pointer(FFI::MemoryPointer.from_string(x))
294
- len_ptr.write_size_t(x.length)
295
- 1
296
- else
297
- 0
298
- end
299
- end
300
-
301
- j.query_unique(:_pid).should eq(%w{100 200 300})
33
+ expect(values.length).to eq(5)
34
+ expect(values).to include(*transports)
302
35
  end
303
-
304
36
  end
305
37
 
306
- describe '#wait' do
307
- it 'raises an exception if the call fails' do
308
- Systemd::Journal::Native.should_receive(:sd_journal_wait).and_return(-1)
309
-
310
- j = Systemd::Journal.new
311
- expect { j.wait(100) }.to raise_error(Systemd::JournalError)
312
- end
313
-
314
- it 'returns the reason we were woken up' do
315
- j = Systemd::Journal.new
316
- Systemd::Journal::Native
317
- .should_receive(:sd_journal_wait)
318
- .and_return(:append)
319
-
320
- j.wait(100).should eq(:append)
321
- end
322
-
323
- it 'returns nil if we reached the timeout.' do
324
- j = Systemd::Journal.new
325
- Systemd::Journal::Native
326
- .should_receive(:sd_journal_wait)
327
- .and_return(:nop)
328
-
329
- j.wait(100).should eq(nil)
330
- end
331
- end
332
-
333
- describe '#add_filter' do
334
- it 'raises an exception if the call fails' do
335
- j = Systemd::Journal.new
336
- Systemd::Journal::Native
337
- .should_receive(:sd_journal_add_match)
38
+ describe 'disk_usage' do
39
+ it 'throws a JournalError on invalid return code' do
40
+ expect(Systemd::Journal::Native).to receive(:sd_journal_get_usage)
338
41
  .and_return(-1)
339
42
 
340
- expect do
341
- j.add_filter(:message, 'test')
342
- end.to raise_error(Systemd::JournalError)
343
- end
344
-
345
- it 'formats the arguments appropriately' do
346
- Systemd::Journal::Native
347
- .should_receive(:sd_journal_add_match)
348
- .with(anything, 'MESSAGE=test', 'MESSAGE=test'.length)
349
- .and_return(0)
350
-
351
- Systemd::Journal.new.add_filter(:message, 'test')
352
- end
353
- end
354
-
355
- describe '#add_filters' do
356
- it 'calls add_filter for each parameter' do
357
- j = Systemd::Journal.new
358
- j.should_receive(:add_filter).with(:priority, 1)
359
- j.should_receive(:add_filter).with(:_exe, '/usr/bin/sshd')
360
-
361
- j.add_filters(priority: 1, _exe: '/usr/bin/sshd')
43
+ expect { j.disk_usage }.to raise_error(Systemd::JournalError)
362
44
  end
363
45
 
364
- it 'expands array arguments to multiple add_filter calls' do
365
- j = Systemd::Journal.new
366
- j.should_receive(:add_filter).with(:priority, 1)
367
- j.should_receive(:add_filter).with(:priority, 2)
368
- j.should_receive(:add_filter).with(:priority, 3)
369
-
370
- j.add_filters(priority: [1, 2, 3])
46
+ it 'returns the disk usage of the example journal file' do
47
+ expect(j.disk_usage).to eq(4005888)
371
48
  end
372
49
  end
373
50
 
374
- describe '#filter' do
375
- it 'clears the existing filters' do
376
- j = Systemd::Journal.new
377
- j.should_receive(:clear_filters)
51
+ describe 'data_threshold' do
52
+ it 'throws a JournalError on invalid return code' do
53
+ expect(Systemd::Journal::Native).to receive(:sd_journal_get_data_threshold)
54
+ .and_return(-1)
378
55
 
379
- j.filter({})
56
+ expect { j.data_threshold }.to raise_error(Systemd::JournalError)
380
57
  end
381
58
 
382
- it 'adds disjunctions between terms' do
383
- j = Systemd::Journal.new
384
- j.stub(:clear_filters).and_return(nil)
385
-
386
- j.should_receive(:add_filter).with(:priority, 1).ordered
387
- j.should_receive(:add_disjunction).ordered
388
- j.should_receive(:add_filter).with(:message, 'hello').ordered
389
-
390
- j.filter({ priority: 1 }, { message: 'hello' })
391
-
59
+ it 'returns the default 64K' do
60
+ expect(j.data_threshold).to eq(0x0010000)
392
61
  end
393
62
  end
394
63
 
395
- describe '#add_conjunction' do
396
- it 'raises an exception if the call fails' do
397
- j = Systemd::Journal.new
398
- Systemd::Journal::Native
399
- .should_receive(:sd_journal_add_conjunction)
64
+ describe 'data_threshold=' do
65
+ it 'throws a JournalError on invalid return code' do
66
+ expect(Systemd::Journal::Native).to receive(:sd_journal_set_data_threshold)
400
67
  .and_return(-1)
401
68
 
402
- expect { j.add_conjunction }.to raise_error(Systemd::JournalError)
69
+ expect { j.data_threshold = 10 }.to raise_error(Systemd::JournalError)
403
70
  end
404
71
  end
405
72
 
406
- describe '#add_disjunction' do
407
- it 'raises an exception if the call fails' do
408
- j = Systemd::Journal.new
409
- Systemd::Journal::Native
410
- .should_receive(:sd_journal_add_disjunction)
73
+ describe 'read_field' do
74
+ it 'throws a JournalError on invalid return code' do
75
+ expect(Systemd::Journal::Native).to receive(:sd_journal_get_data)
411
76
  .and_return(-1)
412
77
 
413
- expect { j.add_disjunction }.to raise_error(Systemd::JournalError)
78
+ expect { j.read_field(:message) }.to raise_error(Systemd::JournalError)
414
79
  end
415
- end
416
80
 
417
- describe '#clear_filters' do
418
- it 'flushes the matches' do
419
- j = Systemd::Journal.new
420
- Systemd::Journal::Native
421
- .should_receive(:sd_journal_flush_matches)
422
- .and_return(nil)
423
-
424
- j.clear_filters
81
+ it 'returns the correct value' do
82
+ expect(j.read_field(:_hostname)).to eq('arch')
425
83
  end
426
84
  end
427
85
 
428
- describe '#disk_usage' do
429
- it 'returns the size used on disk' do
430
- j = Systemd::Journal.new
431
- Systemd::Journal::Native
432
- .should_receive(:sd_journal_get_usage) do |ptr, size_ptr|
433
- size_ptr.write_size_t(12)
434
- 0
435
- end
436
-
437
- j.disk_usage.should eq(12)
438
- end
439
-
440
- it 'raises an error if the call fails' do
441
- j = Systemd::Journal.new
442
- Systemd::Journal::Native
443
- .should_receive(:sd_journal_get_usage)
86
+ describe 'current_entry' do
87
+ it 'throws a JournalError on invalid return code' do
88
+ expect(Systemd::Journal::Native).to receive(:sd_journal_enumerate_data)
444
89
  .and_return(-1)
445
90
 
446
- expect { j.disk_usage }.to raise_error(Systemd::JournalError)
447
- end
448
- end
449
-
450
- describe '#data_threshold=' do
451
- it 'sets the data threshold' do
452
- j = Systemd::Journal.new
453
- Systemd::Journal::Native
454
- .should_receive(:sd_journal_set_data_threshold)
455
- .with(anything, 0x1234)
456
- .and_return(0)
457
-
458
- j.data_threshold = 0x1234
459
- end
460
-
461
- it 'raises a JournalError on failure' do
462
- j = Systemd::Journal.new
463
- Systemd::Journal::Native
464
- .should_receive(:sd_journal_set_data_threshold)
465
- .with(anything, 0x1234)
466
- .and_return(-1)
467
-
468
- expect do
469
- j.data_threshold = 0x1234
470
- end.to raise_error(Systemd::JournalError)
471
- end
472
- end
473
-
474
- describe '#data_threshold' do
475
- it 'gets the data threshold' do
476
- j = Systemd::Journal.new
477
- Systemd::Journal::Native
478
- .should_receive(:sd_journal_get_data_threshold) do |ptr, size_ptr|
479
- size_ptr.write_size_t(0x1234)
480
- 0
481
- end
482
-
483
- j.data_threshold.should eq(0x1234)
91
+ expect { j.current_entry }.to raise_error(Systemd::JournalError)
484
92
  end
485
93
 
486
- it 'raises a JournalError on failure' do
487
- j = Systemd::Journal.new
488
- Systemd::Journal::Native
489
- .should_receive(:sd_journal_get_data_threshold)
490
- .and_return(-3)
491
-
492
- expect { j.data_threshold }.to raise_error(Systemd::JournalError)
94
+ it 'returns a JournalEntry with the correct values' do
95
+ entry = j.current_entry
96
+ expect(entry._hostname).to eq('arch')
97
+ expect(entry.message).to start_with('Allowing runtime journal')
493
98
  end
494
-
495
99
  end
496
100
 
497
- describe '#cursor?' do
498
- it 'returns true if the current cursor is the provided value' do
499
- j = Systemd::Journal.new
500
- Systemd::Journal::Native
501
- .should_receive(:sd_journal_test_cursor)
502
- .with(anything, '1234').and_return(1)
503
-
504
- j.cursor?('1234').should eq(true)
101
+ describe 'each' do
102
+ it 'returns an enumerator' do
103
+ expect(j.each.class).to be Enumerator
505
104
  end
506
105
 
507
- it 'returns false otherwise' do
508
- j = Systemd::Journal.new
509
- Systemd::Journal::Native
510
- .should_receive(:sd_journal_test_cursor)
511
- .with(anything, '1234')
512
- .and_return(0)
106
+ it 'throws a JournalError on invalid return code' do
107
+ expect(Systemd::Journal::Native).to receive(:sd_journal_seek_head)
108
+ .and_return(-1)
513
109
 
514
- j.cursor?('1234').should eq(false)
110
+ expect { j.each }.to raise_error(Systemd::JournalError)
515
111
  end
516
112
 
517
- it 'raises a JournalError on failure' do
518
- j = Systemd::Journal.new
519
- Systemd::Journal::Native
520
- .should_receive(:sd_journal_test_cursor)
521
- .and_return(-3)
113
+ it 'properly enumerates all the entries' do
114
+ entries = j.each.map(&:message)
522
115
 
523
- expect { j.cursor?('123') }.to raise_error(Systemd::JournalError)
116
+ expect(entries.first).to start_with('Allowing runtime journal')
117
+ expect(entries.last).to start_with('ROOT LOGIN ON tty1')
524
118
  end
525
-
526
119
  end
527
120
 
528
- describe '#cursor' do
529
- it 'returns the current cursor' do
530
- j = Systemd::Journal.new
531
- Systemd::Journal::Native
532
- .should_receive(:sd_journal_get_cursor) do |ptr, out_ptr|
533
- # this memory will be manually freed. not setting autorelease to
534
- # false would cause a double free.
535
- str = FFI::MemoryPointer.from_string('5678')
536
- str.autorelease = false
121
+ describe 'catalog_for' do
122
+ subject(:j) { Systemd::Journal }
123
+ let(:message_id) { 'f77379a8490b408bbe5f6940505a777b' }
124
+ let(:message_text) { 'Subject: The Journal has been started' }
537
125
 
538
- out_ptr.write_pointer(str)
539
- 0
540
- end
126
+ it 'throws a JournalError on invalid return code' do
127
+ expect(Systemd::Journal::Native)
128
+ .to receive(:sd_journal_get_catalog_for_message_id)
129
+ .and_return(-1)
541
130
 
542
- j.cursor.should eq('5678')
131
+ expect { j.catalog_for(message_id) }.to raise_error(Systemd::JournalError)
543
132
  end
544
133
 
545
- it 'raises a JournalError on failure' do
546
- j = Systemd::Journal.new
547
- Systemd::Journal::Native
548
- .should_receive(:sd_journal_get_cursor)
549
- .and_return(-3)
550
-
551
- expect { j.cursor }.to raise_error(Systemd::JournalError)
134
+ it 'returns the correct catalog entry' do
135
+ cat = Systemd::Journal.catalog_for(message_id)
136
+ expect(cat).to start_with(message_text)
552
137
  end
553
-
554
138
  end
555
139
 
556
140
  end