Exemplo n.º 1
0
static int EscalateTestMockHelperProcess(int stdin_fd, int stdout_fd) {
  GIOChannel *stdin_stream = g_io_channel_unix_new(stdin_fd);
  GIOChannel *stdout_stream = g_io_channel_unix_new(stdout_fd);
  GError *error = NULL;
  gboolean success = FALSE;

  g_assert(mock_helper_expected_messages);
  g_assert(mock_helper_response_messages);

  for (guint i = 0; i < g_strv_length(mock_helper_expected_messages); i++) {
    EscalateMessage *expected = NULL;
    EscalateMessage *message = NULL;
    EscalateMessage *response = NULL;

    expected = EscalateMessageLoad(mock_helper_expected_messages[i], &error);
    g_assert_no_error(error);
    g_assert(expected);

    message = EscalateMessageRead(stdin_stream, &error);
    g_assert_no_error(error);
    g_assert(message);

    if (mock_helper_response_messages[i]) {
      response = EscalateMessageLoad(mock_helper_response_messages[i], &error);
      g_assert_no_error(error);
      g_assert(response);
    }

    g_assert_cmpint(expected->type, ==, message->type);
    if (!g_variant_equal(expected->values, message->values)) {
      gchar *variant_str = g_variant_print(expected->values, FALSE);
      g_message("Expected: %s", variant_str);
      g_free(variant_str);
      variant_str = g_variant_print(message->values, FALSE);
      g_message("Got: %s", variant_str);
      g_free(variant_str);
      g_error("Message values didn't match what was expected");
    }

    if (response) {
      success = EscalateMessageWrite(response, stdout_stream, &error);
      g_assert_no_error(error);
      g_assert(success);
      EscalateMessageUnref(response);
    }

    EscalateMessageUnref(expected);
    EscalateMessageUnref(message);
  }

  g_io_channel_shutdown(stdin_stream, FALSE, NULL);
  g_io_channel_shutdown(stdout_stream, FALSE, NULL);
  g_io_channel_unref(stdin_stream);
  g_io_channel_unref(stdout_stream);
  return 0;
}
static void TestWrite(gconstpointer user_data) {
  guint index = GPOINTER_TO_UINT(user_data);
  gint fds [] = { 0, 0 };
  GIOChannel *reader = NULL;
  GIOChannel *writer = NULL;
  GThread *thread = NULL;
  EscalateMessage *message = NULL;
  GError *error = NULL;
  gboolean success = FALSE;
  gchar *result = NULL;

  g_assert(g_unix_open_pipe(fds, 0, NULL));
  reader = g_io_channel_unix_new(fds[0]);
  writer = g_io_channel_unix_new(fds[1]);

  thread = g_thread_new("Reader", (GThreadFunc) ReaderThread, reader);

  message = EscalateMessageLoad(example_messages[index], NULL);
  g_assert(message);
  success = EscalateMessageWrite(message, writer, &error);
  g_assert_no_error(error);
  g_assert(success);

  g_assert_cmpint(G_IO_STATUS_NORMAL, ==,
                  g_io_channel_shutdown(writer, TRUE, NULL));

  result = (gchar *) g_thread_join(thread);
  result[strlen(result)-1] = '\0';  // Cut off newline.
  g_assert_cmpstr(example_messages[index], ==, result);

  g_io_channel_unref(reader);
  g_io_channel_unref(writer);
  EscalateMessageUnref(message);
  g_free(result);
}
static void WriteMessage(GIOChannel *channel, const gchar *message_str) {
  GError *error = NULL;
  EscalateMessage *message = EscalateMessageLoad(message_str, &error);
  g_assert_no_error(error);
  g_assert(message);
  gboolean success = EscalateMessageWrite(message, channel, &error);
  g_assert_no_error(error);
  g_assert(success);
  EscalateMessageUnref(message);
}
static void AssertMessage(GIOChannel *channel, const gchar *expected_str) {
  GError *error = NULL;
  EscalateMessage *expected = EscalateMessageLoad(expected_str, &error);
  g_assert_no_error(error);
  g_assert(expected);
  EscalateMessage *message = EscalateMessageRead(channel, &error);
  g_assert_no_error(error);
  g_assert(message);
  g_assert_cmpint(expected->type, ==, message->type);
  g_assert(g_variant_equal(expected->values, message->values));
  EscalateMessageUnref(expected);
  EscalateMessageUnref(message);
}
static void TestDump(gconstpointer user_data) {
  guint index = GPOINTER_TO_UINT(user_data);
  GError *error = NULL;
  EscalateMessage *message = EscalateMessageLoad(example_messages[index],
                                                 &error);
  g_assert_no_error(error);
  g_assert(message);

  gchar *message_str = EscalateMessageDump(message);
  g_assert_cmpstr(example_messages[index], ==, message_str);

  g_free(message_str);
  EscalateMessageUnref(message);
}
static void TestLoad(gconstpointer user_data) {
  guint index = GPOINTER_TO_UINT(user_data);
  GError *error = NULL;
  GVariant *expected_values = CreateExampleMessageValues(index);

  EscalateMessage *message = EscalateMessageLoad(example_messages[index],
                                                 &error);
  g_assert_no_error(error);
  g_assert(message);
  g_assert_cmpint(EscalateMessageGetType(message), ==,
                  example_message_types[index]);
  g_assert(g_variant_equal(expected_values, message->values));

  g_variant_unref(expected_values);
  EscalateMessageUnref(message);
}
static void TestGetValues(gconstpointer user_data) {
  guint index = GPOINTER_TO_UINT(user_data);
  EscalateMessage *message = NULL;
  gint action = 0;
  gint flags = 0;
  gchar *username = NULL;
  gchar *value = NULL;
  gint item_key = 0;
  gchar *item_value = NULL;
  GVariantIter *items_iter = NULL;
  gchar *env_key = NULL;
  gchar *env_value = NULL;
  GVariantIter *env_iter = NULL;

  message = EscalateMessageLoad(example_messages[index], NULL);
  g_assert(message);

  switch (index) {
    case 0:
      EscalateMessageGetValues(message, &action, &flags, &username, &items_iter,
                               &env_iter);
      g_assert_cmpint(1, ==, action);
      g_assert_cmpint(0, ==, flags);
      g_assert_cmpstr("testuser", ==, username);
      g_assert(g_variant_iter_next(items_iter, "{ims}", &item_key,
                                   &item_value));
      g_assert_cmpint(2, ==, item_key);
      g_assert_cmpstr("testuser", ==, item_value);
      g_assert(!g_variant_iter_next(items_iter, "{ims}", NULL, NULL));
      g_variant_iter_free(items_iter);
      g_assert(g_variant_iter_next(env_iter, "{ss}", &env_key, &env_value));
      g_assert_cmpstr("PATH", ==, env_key);
      g_assert_cmpstr("/path", ==, env_value);
      g_assert(!g_variant_iter_next(env_iter, "{ss}", NULL, NULL));
      g_variant_iter_free(env_iter);
      break;
    case 1:
      EscalateMessageGetValues(message, &flags, &value);
      g_assert_cmpint(1, ==, flags);
      g_assert_cmpstr("Password: "******"testpass", ==, value);
      g_assert_cmpint(0, ==, flags);
      break;
    case 3:
      EscalateMessageGetValues(message, &flags, &env_iter);
      g_assert_cmpint(0, ==, flags);
      g_assert(g_variant_iter_next(env_iter, "{ss}", &env_key, &env_value));
      g_assert_cmpstr("PATH", ==, env_key);
      g_assert_cmpstr("/path", ==, env_value);
      g_assert(!g_variant_iter_next(env_iter, "{ss}", NULL, NULL));
      g_variant_iter_free(env_iter);
      break;
    default:
      g_error("No message available for index %d", index);
  }

  g_free(username);
  g_free(value);
  g_free(item_value);
  g_free(env_key);
  g_free(env_value);
  EscalateMessageUnref(message);
}