@@ -58,17 +58,20 @@ pub trait MetricSearcher {
58
58
59
59
// Generate the metric file name from the service name.
60
60
fn form_metric_filename ( service_name : & str , with_pid : bool ) -> String {
61
- let dot = "." ;
62
61
let separator = "-" ;
63
- let mut filename = String :: new ( ) ;
64
- if service_name. contains ( dot) {
65
- filename = service_name. replace ( dot, separator) ;
66
- }
67
- let mut filename = format ! ( "{}{}{}" , filename, separator, METRIC_FILENAME_SUFFIX ) ;
62
+ let mut filename = if service_name. contains ( '.' ) {
63
+ service_name. replace ( '.' , separator)
64
+ } else {
65
+ service_name. to_string ( )
66
+ } ;
67
+
68
+ filename. push_str ( & format ! ( "{}{}" , separator, METRIC_FILENAME_SUFFIX ) ) ;
69
+
68
70
if with_pid {
69
71
let pid = std:: process:: id ( ) ;
70
- filename = format ! ( "{} .pid{}" , filename , pid) ;
72
+ filename. push_str ( & format ! ( ".pid{}" , pid) ) ;
71
73
}
74
+
72
75
filename
73
76
}
74
77
@@ -147,3 +150,129 @@ fn filename_comparator(file1: &PathBuf, file2: &PathBuf) -> Ordering {
147
150
// same date, compare the file number
148
151
name1. cmp ( name2)
149
152
}
153
+
154
+ #[ cfg( test) ]
155
+ mod tests {
156
+ use std:: {
157
+ fs:: File ,
158
+ path:: { Path , PathBuf } ,
159
+ } ;
160
+
161
+ use tempfile:: tempdir;
162
+
163
+ use crate :: log:: metric:: {
164
+ filename_comparator, filename_matches, form_metric_filename, list_metric_files,
165
+ } ;
166
+
167
+ #[ test]
168
+ fn test_form_metric_filename ( ) {
169
+ let app_name1 = "foo-test" ;
170
+ let app_name2 = "foo.test" ;
171
+ let mf1 = form_metric_filename ( app_name1, false ) ;
172
+ let mf2 = form_metric_filename ( app_name2, false ) ;
173
+ assert_eq ! ( "foo-test-metrics.log" , mf1) ;
174
+ assert_eq ! ( mf1, mf2) ;
175
+
176
+ let mf1_pid = form_metric_filename ( app_name2, true ) ;
177
+ assert ! ( mf1_pid. ends_with( & std:: process:: id( ) . to_string( ) ) ) ;
178
+ }
179
+
180
+ #[ test]
181
+ fn test_filename_matches ( ) {
182
+ let test_cases = vec ! [
183
+ (
184
+ "~/logs/csp/app1-metric.log.2018-12-24.1111" ,
185
+ "~/logs/csp/app1-metric.log" ,
186
+ true ,
187
+ ) ,
188
+ (
189
+ "~/logs/csp/app1-metric.log-2018-12-24.1111" ,
190
+ "~/logs/csp/app1-metric.log" ,
191
+ false ,
192
+ ) ,
193
+ (
194
+ "~/logs/csp/app2-metric.log.2018-12-24.1111" ,
195
+ "~/logs/csp/app1-metric.log" ,
196
+ false ,
197
+ ) ,
198
+ ] ;
199
+
200
+ for ( filename, base_filename, expected) in test_cases {
201
+ assert_eq ! ( filename_matches( filename, base_filename) , expected) ;
202
+ }
203
+ }
204
+
205
+ #[ test]
206
+ fn test_filename_comparator_no_pid ( ) {
207
+ let mut arr = vec ! [
208
+ PathBuf :: from( "metrics.log.2018-03-06" ) ,
209
+ PathBuf :: from( "metrics.log.2018-03-07" ) ,
210
+ PathBuf :: from( "metrics.log.2018-03-07.51" ) ,
211
+ PathBuf :: from( "metrics.log.2018-03-07.10" ) ,
212
+ PathBuf :: from( "metrics.log.2018-03-06.100" ) ,
213
+ ] ;
214
+ arr. sort_by ( filename_comparator) ;
215
+
216
+ let expected = vec ! [
217
+ PathBuf :: from( "metrics.log.2018-03-06" ) ,
218
+ PathBuf :: from( "metrics.log.2018-03-06.100" ) ,
219
+ PathBuf :: from( "metrics.log.2018-03-07" ) ,
220
+ PathBuf :: from( "metrics.log.2018-03-07.10" ) ,
221
+ PathBuf :: from( "metrics.log.2018-03-07.51" ) ,
222
+ ] ;
223
+
224
+ assert_eq ! ( expected, arr) ;
225
+ }
226
+
227
+ #[ test]
228
+ fn test_filename_comparator_with_pid ( ) {
229
+ let mut arr = vec ! [
230
+ PathBuf :: from( "metrics.log.pid21879.2018-03-06" ) ,
231
+ PathBuf :: from( "metrics.log.pid21879.2018-03-07" ) ,
232
+ PathBuf :: from( "metrics.log.pid21879.2018-03-07.51" ) ,
233
+ PathBuf :: from( "metrics.log.pid21879.2018-03-07.10" ) ,
234
+ PathBuf :: from( "metrics.log.pid21879.2018-03-06.100" ) ,
235
+ ] ;
236
+ arr. sort_by ( filename_comparator) ;
237
+
238
+ let expected = vec ! [
239
+ PathBuf :: from( "metrics.log.pid21879.2018-03-06" ) ,
240
+ PathBuf :: from( "metrics.log.pid21879.2018-03-06.100" ) ,
241
+ PathBuf :: from( "metrics.log.pid21879.2018-03-07" ) ,
242
+ PathBuf :: from( "metrics.log.pid21879.2018-03-07.10" ) ,
243
+ PathBuf :: from( "metrics.log.pid21879.2018-03-07.51" ) ,
244
+ ] ;
245
+
246
+ assert_eq ! ( expected, arr) ;
247
+ }
248
+
249
+ #[ test]
250
+ fn test_list_metric_files ( ) {
251
+ let temp_dir = tempdir ( ) . expect ( "Failed to create temporary directory" ) ;
252
+
253
+ let base_dir = temp_dir. path ( ) . to_path_buf ( ) ;
254
+ let file_pattern = Path :: new ( "app1-metrics.log" ) ;
255
+
256
+ // Create temporary files and directories for testing
257
+ let paths = [
258
+ "app1-metrics.log.2020-02-14" ,
259
+ "app1-metrics.log.2020-02-14.12" ,
260
+ "app1-metrics.log.2020-02-14.32" ,
261
+ "app1-metrics.log.2020-02-15" ,
262
+ "app1-metrics.log.2020-02-16" ,
263
+ "app1-metrics.log.2020-02-16.100" ,
264
+ "app2-metrics.log.2020-02-14" ,
265
+ ] ;
266
+
267
+ for path in paths. iter ( ) {
268
+ let file_path = temp_dir. path ( ) . join ( path) ;
269
+ File :: create ( & file_path) . expect ( "Failed to create test file" ) ;
270
+ }
271
+
272
+ let result =
273
+ list_metric_files ( & base_dir, file_pattern) . expect ( "Failed to list metric files" ) ;
274
+
275
+ // Assert that the number of files found matches the expected count
276
+ assert_eq ! ( result. len( ) , 6 ) ;
277
+ }
278
+ }
0 commit comments