[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r9434 - in gnunet/src: include util
From: |
gnunet |
Subject: |
[GNUnet-SVN] r9434 - in gnunet/src: include util |
Date: |
Mon, 9 Nov 2009 10:56:54 -0700 |
Author: safey
Date: 2009-11-09 10:56:54 -0700 (Mon, 09 Nov 2009)
New Revision: 9434
Added:
gnunet/src/util/test_peer.c
Modified:
gnunet/src/include/gnunet_configuration_lib.h
gnunet/src/util/Makefile.am
gnunet/src/util/configuration.c
Log:
* test_peer.c is a test case for peer.c
* Changes in configuration.c and gnunet_configuration_lib.h for dumping
configuration diffs between the default configuration object and an edited
configuration.
Modified: gnunet/src/include/gnunet_configuration_lib.h
===================================================================
--- gnunet/src/include/gnunet_configuration_lib.h 2009-11-09 13:24:50 UTC
(rev 9433)
+++ gnunet/src/include/gnunet_configuration_lib.h 2009-11-09 17:56:54 UTC
(rev 9434)
@@ -45,7 +45,18 @@
*/
struct GNUNET_CONFIGURATION_Handle;
+
/**
+ * Used for diffing a configuration object against
+ * the default one
+ */
+typedef struct {
+ struct GNUNET_CONFIGURATION_Handle* cfgNew;
+ struct GNUNET_CONFIGURATION_Handle* cfgDiff;
+} GNUNNET_CONFIGURATION_Diff_Handle;
+
+
+/**
* Create a new configuration object.
* @return fresh configuration object
*/
@@ -105,6 +116,18 @@
int GNUNET_CONFIGURATION_write (struct GNUNET_CONFIGURATION_Handle *cfg,
const char *filename);
+/**
+ * Write only configuration entries that have been changed to configuration
file
+ * @param cfgDefault default configuration
+ * @param cfgNew new configuration
+ * @param filename where to write the configuration diff between default and
new
+ * @return GNUNET_OK on success, GNUNET_SYSERR on error
+ */
+int
+GNUNET_CONFIGURATION_write_diffs(
+ struct GNUNET_CONFIGURATION_Handle *cfgDefault,
+ struct GNUNET_CONFIGURATION_Handle *cfgNew,
+ const char* filename);
/**
* Test if there are configuration options that were
Modified: gnunet/src/util/Makefile.am
===================================================================
--- gnunet/src/util/Makefile.am 2009-11-09 13:24:50 UTC (rev 9433)
+++ gnunet/src/util/Makefile.am 2009-11-09 17:56:54 UTC (rev 9434)
@@ -126,6 +126,7 @@
test_os_load \
test_os_network \
test_os_priority \
+ test_peer \
test_plugin \
test_program \
test_pseudonym \
@@ -289,6 +290,11 @@
test_os_priority_LDADD = \
$(top_builddir)/src/util/libgnunetutil.la
+test_peer_SOURCES = \
+ test_peer.c
+test_peer_LDADD = \
+$(top_builddir)/src/util/libgnunetutil.la
+
test_plugin_SOURCES = \
test_plugin.c
test_plugin_LDADD = \
Modified: gnunet/src/util/configuration.c
===================================================================
--- gnunet/src/util/configuration.c 2009-11-09 13:24:50 UTC (rev 9433)
+++ gnunet/src/util/configuration.c 2009-11-09 17:56:54 UTC (rev 9434)
@@ -462,6 +462,107 @@
/**
+ * A callback function, compares entries from two configurations (default
against a new configuration)
+ * and write the diffs in a diff-configuration object (the callback object).
+ * @param cls the diff configuration (ConfigurationDiffHandle*)
+ * @param section section for the value (of the default conf.)
+ * @param option option name of the value (of the default conf.)
+ * @param value value to copy (of the default conf.)
+ */
+void
+compareEntries(
+ void *cls,
+ const char *section,
+ const char *option,
+ const char *value)
+{
+ struct ConfigSection *secNew;
+ struct ConfigEntry *entNew;
+ GNUNNET_CONFIGURATION_Diff_Handle* cfgDiff =
(GNUNNET_CONFIGURATION_Diff_Handle*)cls;
+
+ secNew = findSection(cfgDiff->cfgNew, section);
+ entNew = findEntry(cfgDiff->cfgNew, section, option);
+ if (secNew && strcmp(entNew->val, value) != 0) {
+ /* Value in the new configuration has been changed */
+ /* Add the changed value to the diff configuration object */
+ struct ConfigEntry *diffEntry = NULL;
+ struct ConfigSection *diffSection = NULL;
+
+ diffSection = cfgDiff->cfgDiff->sections;
+ if (diffSection == NULL) {
+ /* First section */
+ diffSection = GNUNET_malloc(sizeof(struct
ConfigSection));
+ memcpy(diffSection, secNew, sizeof(struct
ConfigSection));
+ cfgDiff->cfgDiff->sections = diffSection;
+ diffSection->entries = NULL;
+ diffSection->next = NULL;
+ }
+ else {
+ while ((strcmp(diffSection->name, secNew->name) != 0)
&& (diffSection->next != NULL)) {
+ diffSection = diffSection->next;
+ }
+ if (strcmp(diffSection->name, secNew->name) != 0) {
+ /* Section not found in diffs configuration */
+ diffSection->next = GNUNET_malloc(sizeof(struct
ConfigSection));
+ memcpy(diffSection->next, secNew, sizeof(struct
ConfigSection));
+ diffSection->next->entries = NULL;
+ diffSection->next->next = NULL;
+ }
+ else {
+ diffEntry = diffSection->entries;
+ }
+ }
+
+ if (diffEntry == NULL) {
+ /* First Entry */
+ diffEntry = GNUNET_malloc(sizeof(struct ConfigEntry));
+ memcpy(diffEntry, entNew, sizeof(struct ConfigEntry));
+ if (diffSection->next == NULL)
+ /* The first Entry of the first Section */
+ diffSection->entries = diffEntry;
+ else
+ /* The first entry of the non-first Section */
+ diffSection->next->entries = diffEntry;
+ diffEntry->next = NULL;
+ }
+ else {
+ while (diffEntry->next != NULL) {
+ diffEntry = diffEntry->next;
+ }
+ diffEntry->next = GNUNET_malloc(sizeof(struct
ConfigEntry));
+ memcpy(diffEntry->next, entNew, sizeof(struct
ConfigEntry));
+ diffEntry->next->next = NULL;
+ }
+ }
+}
+
+
+/**
+ * Write only configuration entries that have been changed to configuration
file
+ * @param cfgDefault default configuration
+ * @param cfgNew new configuration
+ * @param filename where to write the configuration diff between default and
new
+ * @return GNUNET_OK on success, GNUNET_SYSERR on error
+ */
+int
+GNUNET_CONFIGURATION_write_diffs(
+ struct GNUNET_CONFIGURATION_Handle *cfgDefault,
+ struct GNUNET_CONFIGURATION_Handle *cfgNew,
+ const char* filename
+ )
+{
+ GNUNNET_CONFIGURATION_Diff_Handle *diffHandle =
+ GNUNET_malloc(sizeof(GNUNNET_CONFIGURATION_Diff_Handle));
+ diffHandle->cfgDiff = GNUNET_CONFIGURATION_create();
+ diffHandle->cfgDiff->sections = NULL;
+ diffHandle->cfgNew = cfgNew;
+ GNUNET_CONFIGURATION_iterate(cfgDefault, compareEntries, diffHandle);
+
+ return GNUNET_CONFIGURATION_write(diffHandle->cfgDiff, filename);
+}
+
+
+/**
* Set a configuration value that should be a string.
*
* @param cfg configuration to update
Added: gnunet/src/util/test_peer.c
===================================================================
--- gnunet/src/util/test_peer.c (rev 0)
+++ gnunet/src/util/test_peer.c 2009-11-09 17:56:54 UTC (rev 9434)
@@ -0,0 +1,117 @@
+/*
+ This file is part of GNUnet.
+ (C) 2009 Christian Grothoff (and other contributing authors)
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 2, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+/**
+ * @file util/test_peer.c
+ * @brief testcase for peer.c
+ * @author Safey Mohammed
+ */
+
+#include "platform.h"
+#include "gnunet_crypto_lib.h"
+#include "gnunet_peer_lib.h"
+
+#define NUMBER_OF_PEERS 10
+/*#define DEBUG*/
+
+/* Global Variables */
+static struct GNUNET_PeerIdentity** pidArr; /* A list of Peer ID's to play
with */
+
+
+static void generatePeerIdList()
+{
+ int i; /* Loop Index */
+
+ pidArr = GNUNET_malloc(NUMBER_OF_PEERS * sizeof(struct
GNUNET_PeerIdentity*));
+ for (i = 0; i < NUMBER_OF_PEERS; i++ ) {
+ pidArr[i] = GNUNET_malloc(sizeof(struct GNUNET_PeerIdentity));
+ GNUNET_CRYPTO_hash_create_random (GNUNET_CRYPTO_QUALITY_WEAK,
&(pidArr[i]->hashPubKey));
+
+#ifdef DEBUG
+ {
+ struct GNUNET_CRYPTO_HashAsciiEncoded hashAsciiEncoded;
+ GNUNET_CRYPTO_hash_to_enc(&(pidArr[i]->hashPubKey),
&hashAsciiEncoded);
+ printf ("I'm Peer: %s\n", (char*) &hashAsciiEncoded);
+ }
+#endif
+ }
+}
+
+static void destroyPeerIdList()
+{
+ int i;
+ for (i = 0; i < NUMBER_OF_PEERS; i++) {
+ GNUNET_free(pidArr[i]);
+ }
+ GNUNET_free(pidArr);
+}
+
+static int check()
+{
+ int i = 0;
+ GNUNET_PEER_Id pid;
+
+ /* Insert Peers into PeerEntry table and hashmap */
+ for (; i < NUMBER_OF_PEERS; i++) {
+ pid = GNUNET_PEER_intern(pidArr[i]);
+ if ( pid != (i + 1)) {
+ fprintf(stderr, "Unexpected Peer ID returned by intern
function \n");
+ return 1;
+ }
+ }
+
+ /* Referencing the first 3 peers once again */
+ for (i = 0; i < 3; i++) {
+ pid = GNUNET_PEER_intern(pidArr[i]);
+ if (pid != (i + 1)) {
+ fprintf(stderr, "Unexpcted Peer ID returned by intern
function \n");
+ return 1;
+ }
+ }
+
+ /* Dereferencing the first 3 peers once [decrementing their reference
count] */
+ {
+ GNUNET_PEER_Id ids[] = {1, 2, 3};
+ GNUNET_PEER_decrement_rcs(ids, 3);
+ }
+
+ /* re-referencing the first 3 peers using the change_rc function */
+ for (i = 0; i < 3; i++) {
+ GNUNET_PEER_change_rc(i, 1);
+ }
+
+ /* Removing the second Peer from the PeerEntry hash map */
+ GNUNET_PEER_change_rc(2, -2);
+
+ /* convert the pid of the first PeerEntry into that of the third */
+ GNUNET_PEER_resolve(1, pidArr[3]);
+
+ return 0;
+}
+
+int main()
+{
+ int ret;
+ GNUNET_log_setup ("test-peer", "ERROR", NULL);
+ generatePeerIdList();
+ ret = check();
+ destroyPeerIdList();
+
+ return ret;
+}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r9434 - in gnunet/src: include util,
gnunet <=