content: /*
   * Copyright (C) 2017 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package com.android.statsd.loadtest;
  
  import android.text.format.DateFormat;
  
  import com.android.os.StatsLog;
  
  import java.util.List;
  
  public class DisplayProtoUtils {
      private static final int MAX_NUM_METRICS_TO_DISPLAY = 10;
  
      public static void displayLogReport(StringBuilder sb, StatsLog.ConfigMetricsReportList reports) {
          sb.append("******************** Report ********************\n");
          if (reports.hasConfigKey()) {
              sb.append("ConfigKey: ");
              com.android.os.StatsLog.ConfigMetricsReportList.ConfigKey key = reports.getConfigKey();
              sb.append("\tuid: ").append(key.getUid()).append(" id: ").append(key.getId())
                      .append("\n");
          }
  
          int numMetrics = 0;
          for (StatsLog.ConfigMetricsReport report : reports.getReportsList()) {
              sb.append("StatsLogReport size: ").append(report.getMetricsCount()).append("\n");
              sb.append("Last report time:").append(getDateStr(report.getLastReportElapsedNanos())).
                      append("\n");
              sb.append("Current report time:").append(getDateStr(report.getCurrentReportElapsedNanos())).
                      append("\n");
              for (StatsLog.StatsLogReport log : report.getMetricsList()) {
                  numMetrics++;
                  if (numMetrics > MAX_NUM_METRICS_TO_DISPLAY) {
                      sb.append("... output truncated\n");
                      sb.append("************************************************");
                      return;
                  }
                  sb.append("\n");
                  sb.append("metric id: ").append(log.getMetricId()).append("\n");
  
                  switch (log.getDataCase()) {
                      case DURATION_METRICS:
                          sb.append("Duration metric data\n");
                          displayDurationMetricData(sb, log);
                          break;
                      case EVENT_METRICS:
                          sb.append("Event metric data\n");
                          displayEventMetricData(sb, log);
                          break;
                      case COUNT_METRICS:
                          sb.append("Count metric data\n");
                          displayCountMetricData(sb, log);
                          break;
                      case GAUGE_METRICS:
                          sb.append("Gauge metric data\n");
                          displayGaugeMetricData(sb, log);
                          break;
                      case VALUE_METRICS:
                          sb.append("Value metric data\n");
                          displayValueMetricData(sb, log);
                          break;
                      case DATA_NOT_SET:
                          sb.append("No metric data\n");
                          break;
                  }
              }
          }
          sb.append("************************************************");
      }
  
      public static String getDateStr(long nanoSec) {
          return DateFormat.format("dd/MM hh:mm:ss", nanoSec/1000000).toString();
      }
  
      private static void displayDimension(StringBuilder sb, StatsLog.DimensionsValue dimensionValue) {
          sb.append(dimensionValue.getField()).append(":");
          if (dimensionValue.hasValueBool()) {
              sb.append(dimensionValue.getValueBool());
          } else if (dimensionValue.hasValueFloat()) {
              sb.append(dimensionValue.getValueFloat());
          } else if (dimensionValue.hasValueInt()) {
              sb.append(dimensionValue.getValueInt());
          } else if (dimensionValue.hasValueStr()) {
              sb.append(dimensionValue.getValueStr());
          } else if (dimensionValue.hasValueTuple()) {
              sb.append("{");
              for (StatsLog.DimensionsValue child :
                      dimensionValue.getValueTuple().getDimensionsValueList()) {
                  displayDimension(sb, child);
              }
              sb.append("}");
          }
          sb.append(" ");
      }
  
      public static void displayDurationMetricData(StringBuilder sb, StatsLog.StatsLogReport log) {
          StatsLog.StatsLogReport.DurationMetricDataWrapper durationMetricDataWrapper
                  = log.getDurationMetrics();
          sb.append("Dimension size: ").append(durationMetricDataWrapper.getDataCount()).append("\n");
          for (StatsLog.DurationMetricData duration : durationMetricDataWrapper.getDataList()) {
              sb.append("dimension_in_what: ");
              displayDimension(sb, duration.getDimensionsInWhat());
              sb.append("\n");
              if (duration.hasDimensionsInCondition()) {
                  sb.append("dimension_in_condition: ");
                  displayDimension(sb, duration.getDimensionsInCondition());
                  sb.append("\n");
              }
  
              for (StatsLog.DurationBucketInfo info : duration.getBucketInfoList())  {
                  sb.append("\t[").append(getDateStr(info.getStartBucketElapsedNanos())).append("-")
                          .append(getDateStr(info.getEndBucketElapsedNanos())).append("] -> ")
                          .append(info.getDurationNanos()).append(" ns\n");
              }
          }
      }
  
      public static void displayEventMetricData(StringBuilder sb, StatsLog.StatsLogReport log) {
          sb.append("Contains ").append(log.getEventMetrics().getDataCount()).append(" events\n");
          StatsLog.StatsLogReport.EventMetricDataWrapper eventMetricDataWrapper =
                  log.getEventMetrics();
          for (StatsLog.EventMetricData event : eventMetricDataWrapper.getDataList()) {
              sb.append(getDateStr(event.getElapsedTimestampNanos())).append(": ");
              sb.append(event.getAtom().getPushedCase().toString()).append("\n");
          }
      }
  
      public static void displayCountMetricData(StringBuilder sb, StatsLog.StatsLogReport log) {
          StatsLog.StatsLogReport.CountMetricDataWrapper countMetricDataWrapper
                  = log.getCountMetrics();
          sb.append("Dimension size: ").append(countMetricDataWrapper.getDataCount()).append("\n");
          for (StatsLog.CountMetricData count : countMetricDataWrapper.getDataList()) {
              sb.append("dimension_in_what: ");
              displayDimension(sb, count.getDimensionsInWhat());
              sb.append("\n");
              if (count.hasDimensionsInCondition()) {
                  sb.append("dimension_in_condition: ");
                  displayDimension(sb, count.getDimensionsInCondition());
                  sb.append("\n");
              }
  
              for (StatsLog.CountBucketInfo info : count.getBucketInfoList())  {
                  sb.append("\t[").append(getDateStr(info.getStartBucketElapsedNanos())).append("-")
                          .append(getDateStr(info.getEndBucketElapsedNanos())).append("] -> ")
                          .append(info.getCount()).append("\n");
              }
          }
      }
  
      public static void displayGaugeMetricData(StringBuilder sb, StatsLog.StatsLogReport log) {
          sb.append("Display me!");
      }
  
      public static void displayValueMetricData(StringBuilder sb, StatsLog.StatsLogReport log) {
          sb.append("Display me!");
      }
  }
  