Snap for 12385180 from 21262ecb7fdae863a86bb607f5d3b06c9c6fdbf0 to 24Q4-release

Change-Id: I65cd533ad097e3e9497e3b8ff589cf7fbe0014f7
diff --git a/statsd/src/metrics/NumericValueMetricProducer.cpp b/statsd/src/metrics/NumericValueMetricProducer.cpp
index ae67e8b..c12cf69 100644
--- a/statsd/src/metrics/NumericValueMetricProducer.cpp
+++ b/statsd/src/metrics/NumericValueMetricProducer.cpp
@@ -64,7 +64,6 @@
 
 const NumericValue ZERO_LONG((int64_t)0);
 const NumericValue ZERO_DOUBLE((double)0);
-const NumericValue ZERO_HIST_VALUE(std::move(HistogramValue()));
 
 double toDouble(const NumericValue& value) {
     return value.is<int64_t>() ? value.getValue<int64_t>() : value.getValueOrDefault<double>(0);
@@ -486,7 +485,7 @@
                     } else if (value.is<double>()) {
                         base = ZERO_DOUBLE;
                     } else if (value.is<HistogramValue>()) {
-                        base = ZERO_HIST_VALUE;
+                        base = HistogramValue();
                     }
                 } else {
                     // no base. just update base and return.
@@ -595,7 +594,7 @@
             }
         } else if (aggType == ValueMetric::HISTOGRAM && !value.is<HistogramValue>()) {
             // statsd-aggregated histogram: add raw value to histogram.
-            interval.aggregate = ZERO_HIST_VALUE;
+            interval.aggregate = HistogramValue();
             addValueToHistogram(value, getBinStarts(i),
                                 interval.aggregate.getValue<HistogramValue>());
         } else {
diff --git a/statsd/tests/e2e/ValueMetric_histogram_e2e_test.cpp b/statsd/tests/e2e/ValueMetric_histogram_e2e_test.cpp
index aeb5a11..66a1e51 100644
--- a/statsd/tests/e2e/ValueMetric_histogram_e2e_test.cpp
+++ b/statsd/tests/e2e/ValueMetric_histogram_e2e_test.cpp
@@ -778,7 +778,11 @@
 
     histData[1].push_back({1, 2, 3});  // base updated, no aggregate recorded
 
-    histData[1].push_back({3, 1, 4});  // base updated, no aggregate recorded because 2nd bin
+    histData[1].push_back({2, 6, 3});  // base updated, aggregate updated
+
+    histData[1].push_back({3, 9, 4});  // base updated, aggregate updated
+
+    histData[1].push_back({4, 8, 5});  // base updated, no aggregate recorded because 2nd bin
                                        // decreased
 
     createProcessorWithHistData(histData);
@@ -795,7 +799,13 @@
     processor->mPullerManager->ForceClearPullerCache();
     processor->informPullAlarmFired(baseTimeNs + bucketSizeNs * 5 + 4);
 
-    optional<ConfigMetricsReportList> reports = getReports(baseTimeNs + bucketSizeNs * 6 + 100);
+    processor->mPullerManager->ForceClearPullerCache();
+    processor->informPullAlarmFired(baseTimeNs + bucketSizeNs * 6 + 5);
+
+    processor->mPullerManager->ForceClearPullerCache();
+    processor->informPullAlarmFired(baseTimeNs + bucketSizeNs * 7 + 6);
+
+    optional<ConfigMetricsReportList> reports = getReports(baseTimeNs + bucketSizeNs * 8 + 100);
 
     ASSERT_NE(reports, nullopt);
     ASSERT_EQ(reports->reports_size(), 1);
@@ -808,7 +818,7 @@
 
     EXPECT_EQ(metricReport.value_metrics().data_size(), 1);
     ValueMetricData data = metricReport.value_metrics().data(0);
-    EXPECT_EQ(data.bucket_info_size(), 4);
+    EXPECT_EQ(data.bucket_info_size(), 6);
 
     ValueBucketInfo bucket = data.bucket_info(0);
     ASSERT_EQ(bucket.values_size(), 1);
@@ -823,6 +833,18 @@
     EXPECT_THAT(bucket.values(0), Property(&ValueBucketInfo::Value::has_value_long, IsTrue()));
 
     bucket = data.bucket_info(3);
+    ASSERT_EQ(bucket.values_size(), 2);
+    EXPECT_THAT(bucket.values(0), Property(&ValueBucketInfo::Value::has_value_long, IsTrue()));
+    ASSERT_THAT(bucket.values(1), Property(&ValueBucketInfo::Value::has_histogram, IsTrue()));
+    EXPECT_THAT(bucket.values(1).histogram().count(), ElementsAreArray({1, 4, 0}));
+
+    bucket = data.bucket_info(4);
+    ASSERT_EQ(bucket.values_size(), 2);
+    EXPECT_THAT(bucket.values(0), Property(&ValueBucketInfo::Value::has_value_long, IsTrue()));
+    ASSERT_THAT(bucket.values(1), Property(&ValueBucketInfo::Value::has_histogram, IsTrue()));
+    EXPECT_THAT(bucket.values(1).histogram().count(), ElementsAreArray({1, 3, 1}));
+
+    bucket = data.bucket_info(5);
     ASSERT_EQ(bucket.values_size(), 1);
     EXPECT_THAT(bucket.values(0), Property(&ValueBucketInfo::Value::has_value_long, IsTrue()));
 
diff --git a/statsd/tests/shell/ShellSubscriber_test.cpp b/statsd/tests/shell/ShellSubscriber_test.cpp
index 0245c09..34addb1 100644
--- a/statsd/tests/shell/ShellSubscriber_test.cpp
+++ b/statsd/tests/shell/ShellSubscriber_test.cpp
@@ -309,8 +309,8 @@
         configBytes = protoToBytes(getPulledConfig());
 
         // Used to call pullAndSendHeartbeatsIfNeeded directly without depending on sleep.
-        shellSubscriberClient = std::move(ShellSubscriberClient::create(
-                configBytes, callback, /* startTimeSec= */ 0, uidMap, pullerManager));
+        shellSubscriberClient = ShellSubscriberClient::create(
+                configBytes, callback, /* startTimeSec= */ 0, uidMap, pullerManager);
     }
 
     unique_ptr<ShellSubscriberClient> shellSubscriberClient;