vkbench: initial commit

This is the initial commit of vkbench. And contains a example test,
submitTest, which submit empty command buffers into the queue.

BUG=chromium:936705
TEST=build and run 'vkbench --notemp'

Change-Id: Ica55d97ac2348da7527cd17418fe4a989d30748e
Signed-off-by: Po-Hsien Wang <pwang@chromium.org>
diff --git a/src/utils.cc b/src/utils.cc
new file mode 100644
index 0000000..6d665a8
--- /dev/null
+++ b/src/utils.cc
@@ -0,0 +1,101 @@
+// Copyright 2019 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "utils.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+#include <chrono>
+#include <fstream>
+#include <sstream>
+#include <string>
+#include <vector>
+
+const std::string kTemperatureScript =
+    "/usr/local/autotest/bin/temperature.py --maximum";
+
+void PrintDateTime() {
+  time_t timer;
+  char buffer[26];
+  time(&timer);
+  struct tm* tm_info = localtime(&timer);
+  strftime(buffer, 26, "%Y-%m-%d %H:%M:%S", tm_info);
+  LOG("# DateTime: %s", buffer)
+}
+
+/* Execute a shell command and return its file descriptor for reading output. */
+/* @param command: command to be run. */
+/* @param result: the stdout of the command output. */
+/* @return true if the command is executed successfully. */
+bool ExecuteCommand(const std::string& kCommand,
+                    std::string* result = nullptr) {
+  FILE* fd = popen(kCommand.c_str(), "r");
+  if (!fd) {
+    return false;
+  }
+
+  if (result) {
+    fseek(fd, 0, SEEK_END);
+    long size = ftell(fd);
+    fseek(fd, 0, SEEK_SET);
+    fread(&result[0], sizeof(char), size, fd);
+  }
+  return pclose(fd) == 0;
+}
+
+std::vector<std::string> SplitString(const std::string& kInput,
+                                     char delimiter) {
+  std::vector<std::string> result;
+  std::stringstream srcStream(kInput);
+
+  std::string token;
+  while (getline(srcStream, token, delimiter)) {
+    result.push_back(token);
+  }
+  return result;
+}
+
+// Returns currently measured temperature.
+double GetMachineTemperature() {
+  std::string temp_str;
+  double temperature;
+  if (!ExecuteCommand(kTemperatureScript, &temp_str)) {
+    return 10000;
+  }
+  temperature = strtod(temp_str.c_str(), nullptr);
+  if (temperature < 10.0 || temperature > 150.0) {
+    DEBUG("Warning: ignoring temperature reading of %f'C.", temperature)
+  }
+  return temperature;
+}
+
+// Waits up to timeout seconds to reach cold_temperature in Celsius.
+// @param cold_temperature: the target temperature in celsius.
+// @param timeout: the timeout to wait.
+// @param temperature: the final temperature of the machine.
+// @return: the total second of wait time.
+double WaitForCoolMachine(double cold_temperature,
+                          double timeout,
+                          double* temperature) {
+  uint64_t start, now, end;
+  start = now = GetUTime();
+  end = now + 1e6 * timeout;
+  do {
+    *temperature = GetMachineTemperature();
+    if (*temperature < cold_temperature)
+      break;
+    sleep(1.0);
+    now = GetUTime();
+  } while (now < end);
+  return 1.0e-6 * (now - start);
+}
+
+bool IsItemInVector(const std::vector<std::string>& list,
+                    const char* value,
+                    bool empty_value = false) {
+  if (list.empty())
+    return empty_value;
+  return !(find(list.begin(), list.end(), std::string(value)) == list.end());
+}