1 package org.broadinstitute.hellbender.metrics;
2 
3 import htsjdk.samtools.metrics.MetricBase;
4 import htsjdk.samtools.metrics.MetricsFile;
5 import org.apache.hadoop.hdfs.MiniDFSCluster;
6 import org.broadinstitute.hellbender.utils.gcs.BucketUtils;
7 import org.broadinstitute.hellbender.GATKBaseTest;
8 import org.broadinstitute.hellbender.testutils.MiniClusterUtils;
9 import org.testng.Assert;
10 import org.testng.annotations.AfterClass;
11 import org.testng.annotations.BeforeClass;
12 import org.testng.annotations.DataProvider;
13 import org.testng.annotations.Test;
14 
15 import java.io.File;
16 import java.io.IOException;
17 
18 public class MetricsUtilsTest extends GATKBaseTest {
19     private MiniDFSCluster cluster;
20     private String hdfsWorkingDir;
21 
22     @BeforeClass(alwaysRun = true)
setupMiniCluster()23     private void setupMiniCluster() throws IOException {
24         cluster = MiniClusterUtils.getMiniCluster();
25         hdfsWorkingDir = MiniClusterUtils.getWorkingDir(cluster).toString();
26     }
27 
28     @AfterClass(alwaysRun = true)
shutdownMiniCluster()29     private void shutdownMiniCluster() {
30        MiniClusterUtils.stopCluster(cluster);
31     }
32 
33     @DataProvider(name = "metricsPaths")
getMetricsPaths()34     public Object[][] getMetricsPaths(){
35         return new Object[][]{
36                 {"metrics"},
37                 {getGCPTestStaging()},
38                 {hdfsWorkingDir}
39         };
40     }
41 
42     public static class TestMetric extends MetricBase {
43         public Integer value1 = 0;
44         public Integer value2 = 0;
45     }
46 
47     @Test(dataProvider = "metricsPaths", groups = "bucket")
testSaveMetrics(String destinationPrefix)48     public void testSaveMetrics(String destinationPrefix) throws IOException {
49         final String outputPath = BucketUtils.getTempFilePath(destinationPrefix, ".txt");
50         TestMetric testMetric = new TestMetric();
51         testMetric.value1 = 10;
52         testMetric.value2 = 5;
53 
54         final MetricsFile<TestMetric, ?> metrics = new MetricsFile<>();
55         metrics.addMetric(testMetric);
56         MetricsUtils.saveMetrics(metrics, outputPath);
57         Assert.assertTrue(BucketUtils.fileExists(outputPath));
58         File localCopy = copyFileToLocalTmpFile(outputPath);
59 
60         final File expectedMetrics = createTempFile("expectedMetrics", ".txt");
61         metrics.write(expectedMetrics);
62 
63         Assert.assertTrue(MetricsFile.areMetricsEqual(localCopy, expectedMetrics));
64     }
65 
copyFileToLocalTmpFile(String outputPath)66     private File copyFileToLocalTmpFile(String outputPath) throws IOException {
67         File localCopy = createTempFile("local_metrics_copy",".txt");
68         BucketUtils.copyFile(outputPath, localCopy.getAbsolutePath());
69         return localCopy;
70     }
71 }
72