@@ -58,17 +58,20 @@ pub trait MetricSearcher {
5858
5959// Generate the metric file name from the service name.
6060fn form_metric_filename ( service_name : & str , with_pid : bool ) -> String {
61- let dot = "." ;
6261 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+
6870 if with_pid {
6971 let pid = std:: process:: id ( ) ;
70- filename = format ! ( "{} .pid{}" , filename , pid) ;
72+ filename. push_str ( & format ! ( ".pid{}" , pid) ) ;
7173 }
74+
7275 filename
7376}
7477
@@ -147,3 +150,129 @@ fn filename_comparator(file1: &PathBuf, file2: &PathBuf) -> Ordering {
147150 // same date, compare the file number
148151 name1. cmp ( name2)
149152}
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