فهرست منبع

tests: only write cache file if it changed

Tests sometimes fila when running multiple parallel tests using the
same cache file because it is written everytime a test parameter
is read. Since there is no locking, this might fail from time to time.
Sven Nierlein 12 سال پیش
والد
کامیت
843bbfb75a
1فایلهای تغییر یافته به همراه19 افزوده شده و 17 حذف شده
  1. 19 17
      NPTest.pm

+ 19 - 17
NPTest.pm

@@ -422,6 +422,7 @@ sub LoadCache
 {
   return if exists( $CACHE{'_cache_loaded_'} );
 
+  my $fileContents = "";
   if ( -f $CACHEFILENAME )
   {
     my( $fileHandle ) = new IO::File;
@@ -432,44 +433,45 @@ sub LoadCache
       return;
     }
 
-    my( $fileContents ) = join( "\n", <$fileHandle> );
-
+    $fileContents = join("", <$fileHandle>);
     $fileHandle->close();
 
+    chomp($fileContents);
     my( $contentsRef ) = eval $fileContents;
     %CACHE = %{$contentsRef};
 
   }
 
-  $CACHE{'_cache_loaded_'} = 1;
+  $CACHE{'_cache_loaded_'}  = 1;
+  $CACHE{'_original_cache'} = $fileContents;
 }
 
 
 sub SaveCache
 {
   delete $CACHE{'_cache_loaded_'};
+  my $oldFileContents = delete $CACHE{'_original_cache'};
 
-  my( $fileHandle ) = new IO::File;
-
-  if ( ! $fileHandle->open( "> ${CACHEFILENAME}" ) )
-  {
-    print STDERR "NPTest::LoadCache() : Problem saving ${CACHEFILENAME} : $!\n";
-    return;
-  }
-
-  my( $dataDumper ) = new Data::Dumper( [ \%CACHE ] );
-
+  my($dataDumper) = new Data::Dumper([\%CACHE]);
   $dataDumper->Terse(1);
   $dataDumper->Sortkeys(1);
-
   my $data = $dataDumper->Dump();
   $data =~ s/^\s+/  /gmx; # make sure all systems use same amount of whitespace
   $data =~ s/^\s+}/}/gmx;
-  print $fileHandle $data;
+  chomp($data);
 
-  $fileHandle->close();
+  if($oldFileContents ne $data) {
+    my($fileHandle) = new IO::File;
+    if (!$fileHandle->open( "> ${CACHEFILENAME}")) {
+      print STDERR "NPTest::LoadCache() : Problem saving ${CACHEFILENAME} : $!\n";
+      return;
+    }
+    print $fileHandle $data;
+    $fileHandle->close();
+  }
 
-  $CACHE{'_cache_loaded_'} = 1;
+  $CACHE{'_cache_loaded_'}  = 1;
+  $CACHE{'_original_cache'} = $data;
 }
 
 #