logrotate 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,166 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'stringio'
4
+
5
+ module LogRotate
6
+
7
+ #
8
+ # This class is one of the possible return values from the
9
+ # LogRotate::rotate_file method. It contains information about the
10
+ # rotated files.
11
+ #
12
+ class RotateInfoDateExtension
13
+
14
+ #
15
+ # This field is an array of rotated file names and dates. Each
16
+ # element is a hash containing the following fields:
17
+ # +file+:: A rotated file name.
18
+ # +date_time+:: The associated date of the rotated file.
19
+ #
20
+ attr_accessor :rotated_files_and_dates
21
+
22
+ #
23
+ # An array of rotated file names. This list of file names will be
24
+ # the same as the file names listed in the rotated_files_and_dates
25
+ # field.
26
+ #
27
+ attr_accessor :rotated_files
28
+
29
+ #
30
+ # An array of file names that were deleted during the rotate_file
31
+ # method call.
32
+ #
33
+ attr_accessor :deleted_files
34
+
35
+ #
36
+ # The newly rotated file name created by the rotate_file method
37
+ # call.
38
+ #
39
+ attr_accessor :new_rotated_file
40
+
41
+ #
42
+ # ====Description:
43
+ # This method creates a RotateInfoDateExtension instance.
44
+ #
45
+ def initialize(rotated_files_and_dates,
46
+ rotated_files,
47
+ deleted_files,
48
+ new_rotated_file)
49
+ @rotated_files_and_dates = rotated_files_and_dates
50
+ @rotated_files = rotated_files
51
+ @deleted_files = deleted_files
52
+ @new_rotated_file = new_rotated_file
53
+ end
54
+
55
+ def ==(value)
56
+ return (@rotated_files_and_dates == value.rotated_files_and_dates &&
57
+ @rotated_files == value.rotated_files &&
58
+ @deleted_files == value.deleted_files &&
59
+ @new_rotated_file == value.new_rotated_file)
60
+ end
61
+
62
+ def to_s()
63
+ os = StringIO.new
64
+ os.print "Rotated Files And Dates:\n"
65
+ @rotated_files_and_dates.each do |element|
66
+ os.print " file -> ", element[:file], ", date_time -> ", element[:date_time], "\n"
67
+ end
68
+
69
+ os.print "Rotated Files: \n"
70
+ if (@rotated_files.length() > 0)
71
+ os.print " ", @rotated_files.join("\n "), "\n"
72
+ end
73
+
74
+ os.print "Deleted Files:\n"
75
+ if (@deleted_files.length() > 0)
76
+ os.print " ", @deleted_files.join("\n "), "\n"
77
+ end
78
+
79
+ os.print "New Rotated File: \n"
80
+ os.print " ", @new_rotated_file, "\n"
81
+
82
+ return os.string()
83
+ end
84
+ end
85
+
86
+ #
87
+ # This class is one of the possible return values from the
88
+ # LogRotate::rotate_file method. It contains information about the
89
+ # rotated files.
90
+ #
91
+ class RotateInfoIntegerExtension
92
+
93
+ #
94
+ # This field is an array of rotated file names and counts. Each
95
+ # element is a hash containing the following fields:
96
+ # +file+:: A rotated file name.
97
+ # +index+:: The associated index of the rotated file.
98
+ #
99
+ attr_accessor :rotated_files_and_counts
100
+
101
+ #
102
+ # An array of rotated file names. This list of file names will be
103
+ # the same as the file names listed in the rotated_files_and_counts
104
+ # field.
105
+ #
106
+ attr_accessor :rotated_files
107
+
108
+ #
109
+ # An array of file names that were deleted during the rotate_file
110
+ # method call.
111
+ #
112
+ attr_accessor :deleted_files
113
+
114
+ #
115
+ # The newly rotated file name created by the rotate_file method
116
+ # call.
117
+ #
118
+ attr_accessor :new_rotated_file
119
+
120
+ #
121
+ # ====Description:
122
+ # This method creates a RotateInfoIntegerExtension instance.
123
+ #
124
+ def initialize(rotated_files_and_counts,
125
+ rotated_files,
126
+ deleted_files,
127
+ new_rotated_file)
128
+ @rotated_files_and_counts = rotated_files_and_counts
129
+ @rotated_files = rotated_files
130
+ @deleted_files = deleted_files
131
+ @new_rotated_file = new_rotated_file
132
+ end
133
+
134
+ def ==(value)
135
+ return (@rotated_files_and_counts == value.rotated_files_and_counts &&
136
+ @rotated_files == value.rotated_files &&
137
+ @deleted_files == value.deleted_files &&
138
+ @new_rotated_file == value.new_rotated_file)
139
+ end
140
+
141
+ def to_s()
142
+ os = StringIO.new
143
+ os.print "Rotated Files And Counts:\n"
144
+ @rotated_files_and_counts.each do |element|
145
+ os.print " file -> ", element[:file], ", index -> ", element[:index], "\n"
146
+ end
147
+
148
+ os.print "Rotated Files: \n"
149
+ if (@rotated_files.length() > 0)
150
+ os.print " ", @rotated_files.join("\n "), "\n"
151
+ end
152
+
153
+ os.print "Deleted Files:\n"
154
+ if (@deleted_files.length() > 0)
155
+ os.print " ", @deleted_files.join("\n "), "\n"
156
+ end
157
+
158
+ os.print "New Rotated File: \n"
159
+ os.print " ", @new_rotated_file, "\n"
160
+
161
+ return os.string()
162
+ end
163
+
164
+ end
165
+
166
+ end
@@ -1,39 +1,22 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'logrotate'
4
+ require 'logrotate/impl'
5
+ require 'logrotate/rotateinfo'
6
+
7
+ require 'fileutils'
4
8
 
5
9
  require 'test/unit'
6
10
 
7
11
  class LogRotateTest < Test::Unit::TestCase
8
12
  TEMP_DIR = "./temp"
9
13
 
10
- def remove_directory(directory)
11
- if (!File.directory?(directory)) then return end
12
-
13
- entries = Dir.entries(directory).select {|entry| (entry != ".") && (entry != "..") }
14
- entries.map! { |entry| File.join(directory, entry) }
15
-
16
- entries.each do |entry|
17
- if File.directory?(entry)
18
- remove_directory(entry)
19
- else
20
- File.delete(entry)
21
- end
22
- end
23
-
24
- Dir.delete(directory)
25
- end
26
-
27
- def remove_temp_directory
28
- remove_directory(TEMP_DIR)
29
- end
30
-
31
14
  def setup
32
- remove_temp_directory()
15
+ teardown()
33
16
  end
34
17
 
35
18
  def teardown
36
- remove_temp_directory()
19
+ FileUtils::rm_r(TEMP_DIR, :force => true)
37
20
  end
38
21
 
39
22
  def test_rotate_integer_extension()
@@ -46,7 +29,7 @@ class LogRotateTest < Test::Unit::TestCase
46
29
  end
47
30
 
48
31
  def test_rotate_date_extension()
49
- date_time_format = "%F_%T"
32
+ date_time_format = "%F"
50
33
 
51
34
  output_dir = nil
52
35
  rotate_date_extension(3, 10, gzip = false)
@@ -58,6 +41,22 @@ class LogRotateTest < Test::Unit::TestCase
58
41
  rotate_date_extension(3, 10, gzip = true, output_dir)
59
42
  rotate_date_extension(3, 10, gzip = true, output_dir, date_time_format)
60
43
  end
44
+
45
+ def get_expected_results_integer_extension(iteration, base_name, count, gzip, output_dir)
46
+ expected_result = LogRotate::RotateInfoIntegerExtension.new(nil, nil, nil, nil)
47
+ expected_result.rotated_files_and_counts = []
48
+
49
+ 1.upto(iteration > count ? count : iteration) do |i|
50
+ rotated_file = "#{output_dir}/#{base_name}.#{i}" + (gzip ? ".gz" : "")
51
+ expected_result.rotated_files_and_counts.push({ :index => i, :file => rotated_file })
52
+ end
53
+
54
+ expected_result.rotated_files = expected_result.rotated_files_and_counts.map { |entry| entry[:file] }
55
+ expected_result.deleted_files = iteration > count ? [ "#{output_dir}/#{base_name}.#{count}" + (gzip ? ".gz" : "") ] : []
56
+ expected_result.new_rotated_file = "#{output_dir}/#{base_name}.1" + (gzip ? ".gz" : "")
57
+
58
+ return expected_result
59
+ end
61
60
 
62
61
  def rotate_integer_extension(count, rotations, gzip, output_dir = nil)
63
62
  source_dir = "#{TEMP_DIR}"
@@ -75,26 +74,30 @@ class LogRotateTest < Test::Unit::TestCase
75
74
 
76
75
  manipulate_garbage_files(output_dir, base_name, :insert)
77
76
 
78
- #rotate the file
79
- rotations.downto(1) do |i|
77
+ #rotate the file rotations times
78
+ 1.upto(rotations) do |iteration|
79
+ data = rotations - iteration + 1
80
80
  File.open(file, "w") do |file_stream|
81
- file_stream.write("#{i}")
81
+ file_stream.write("#{data}")
82
82
  end
83
83
 
84
84
  options = {:count => count}
85
85
  if (gzip) then options[:gzip] = true end
86
86
  if (is_output_dir) then options[:directory] = output_dir end
87
-
88
- LogRotate.rotate_files(file, options)
87
+
88
+ result = LogRotate.rotate_file(file, options)
89
+
90
+ expected_result = get_expected_results_integer_extension(iteration, base_name, count, gzip, output_dir)
91
+ assert_equal(expected_result, result)
89
92
  end
90
93
 
91
94
  manipulate_garbage_files(output_dir, base_name, :delete)
92
-
95
+
93
96
  #verify there are count rotated files.
94
97
  entries = Dir.glob("#{output_dir}/*").map {|entry| File.split(entry)[1]}
95
98
  assert_equal(entries.length, count)
96
99
 
97
- #verify the contents
100
+ #verify the contents of the remaining files.
98
101
  expected = (1..count).map { |i| "#{base_name}.#{i}" + (gzip ? ".gz" : "") }
99
102
  assert_equal(entries.sort, expected)
100
103
 
@@ -109,11 +112,11 @@ class LogRotateTest < Test::Unit::TestCase
109
112
  end
110
113
  end
111
114
 
112
- remove_temp_directory()
115
+ teardown()
113
116
  end
114
117
 
115
118
  def manipulate_garbage_files(dir, base_name, operation)
116
- bogus_extensions = [ ".back", ".back123", ".2008-10-04_00:00:00foo", ".123x", "." ]
119
+ bogus_extensions = [ ".back", ".back123", ".2008-10-04foo", ".123x" ]
117
120
 
118
121
  bogus_extensions.each do |bogus_extension|
119
122
  bogus_file_1 = File.join(dir, base_name + bogus_extension)
@@ -128,9 +131,40 @@ class LogRotateTest < Test::Unit::TestCase
128
131
  end
129
132
  end
130
133
 
134
+ def get_expected_result_date_extension(iteration, base_name, date_times, count, date_time_format, gzip, output_dir)
135
+ index = iteration - 1
136
+
137
+ expected_result = LogRotate::RotateInfoDateExtension.new(nil, nil, nil, nil)
138
+ expected_result.rotated_files_and_dates = []
139
+ oldest_existing_date_iteration = (iteration - count + 1 <= 1) ? 1 : (iteration - count + 1)
140
+ oldest_existing_date_index = oldest_existing_date_iteration - 1
141
+ index.downto(oldest_existing_date_index) do |i|
142
+ str_date_time = date_times[i].strftime(date_time_format)
143
+ reconstructed_date_time = DateTime.strptime(str_date_time, date_time_format)
144
+ rotated_file = "#{output_dir}/#{base_name}.#{str_date_time}" + (gzip ? ".gz" : "")
145
+
146
+ expected_result.rotated_files_and_dates.push({ :date_time => reconstructed_date_time,
147
+ :file => rotated_file })
148
+ end
149
+
150
+ expected_result.rotated_files = expected_result.rotated_files_and_dates.map { |entry| entry[:file] }
151
+
152
+ if (iteration > count)
153
+ str_date_time = date_times[index - count].strftime(date_time_format)
154
+ expected_result.deleted_files = [ "#{output_dir}/#{base_name}.#{str_date_time}" + (gzip ? ".gz" : "") ]
155
+ else
156
+ expected_result.deleted_files = []
157
+ end
158
+
159
+ str_date_time = date_times[index].strftime(date_time_format)
160
+ expected_result.new_rotated_file = "#{output_dir}/#{base_name}.#{str_date_time}" + (gzip ? ".gz" : "")
161
+
162
+ return expected_result
163
+ end
164
+
131
165
  def rotate_date_extension(count, rotations, gzip,
132
166
  output_dir = nil,
133
- date_time_format = LogRotate::DEFAULT_DATE_TIME_FORMAT)
167
+ date_time_format = LogRotate::Impl::DEFAULT_DATE_TIME_FORMAT)
134
168
 
135
169
  source_dir = "#{TEMP_DIR}"
136
170
  base_name = "file.dat"
@@ -151,7 +185,10 @@ class LogRotateTest < Test::Unit::TestCase
151
185
  now = DateTime.now
152
186
  date_times = (0..(rotations - 1)).map { |i| now + i }
153
187
 
154
- date_times.each do |date_time|
188
+ 1.upto(rotations) do |iteration|
189
+ index = iteration - 1
190
+ date_time = date_times[index]
191
+
155
192
  File.open(file, "w") do |file_stream|
156
193
  file_stream.write(date_time.strftime(date_time_format))
157
194
  end
@@ -161,7 +198,11 @@ class LogRotateTest < Test::Unit::TestCase
161
198
  if (is_output_dir) then options[:directory] = output_dir end
162
199
  if date_time_format then options[:date_time_format] = date_time_format end
163
200
 
164
- LogRotate.rotate_files(file, options)
201
+ result = LogRotate.rotate_file(file, options)
202
+
203
+ expected_result = get_expected_result_date_extension(iteration, base_name, date_times, count,
204
+ date_time_format, gzip, output_dir)
205
+ assert_equal(expected_result, result)
165
206
  end
166
207
 
167
208
  #verify there are count rotated files.
@@ -190,7 +231,7 @@ class LogRotateTest < Test::Unit::TestCase
190
231
  end
191
232
  end
192
233
 
193
- remove_temp_directory()
234
+ teardown()
194
235
  end
195
236
 
196
237
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logrotate
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - DesigningPatterns
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-07-17 00:00:00 -04:00
12
+ date: 2008-08-27 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -40,9 +40,12 @@ files:
40
40
  - README.txt
41
41
  - Rakefile
42
42
  - lib/logrotate.rb
43
+ - lib/logrotate/impl.rb
44
+ - lib/logrotate/logrotate.rb
45
+ - lib/logrotate/rotateinfo.rb
43
46
  - test/test_logrotate.rb
44
47
  has_rdoc: true
45
- homepage: "Project Page: http://rubyforge.org/projects/logrotate/"
48
+ homepage: This package is a library of methods that perform log rotation. The
46
49
  post_install_message:
47
50
  rdoc_options:
48
51
  - --main