示例#1
0
struct data_t *data_dup(struct data_t *data){
	if (data == NULL || data->datasize < 0 || data->data == NULL)
		return NULL;

	return data_create2(data->datasize, data->data);

}
示例#2
0
int testCreate2() {
    int result, data_size = strlen("1234567890abc")+1;
    char *data_s = strdup("1234567890abc");
    struct data_t *data = data_create2(data_size,data_s);

    result = (data->data == data_s) &&
             (data->datasize == data_size);

    data_destroy(data);

    printf("Modulo data -> teste data_create2: %s\n",result?"passou":"nao passou");
    return result;
}
示例#3
0
int testCreate() {
    char *key = strdup("123abc");
    struct data_t *value = data_create2(strlen("1234567890abc")+1,strdup("1234567890abc"));

    struct entry_t *entry = entry_create(key,value);

    int result = (entry->key == key) &&
                 (entry->value == value);

    entry_destroy(entry);

    printf("Modulo entry -> teste entry_create: %s\n",result?"passou":"nao passou");
    return result;
}
示例#4
0
int testValue() {
	int result, size, datasize, datasize_conv;
	short opcode, c_type;
	char *msg_str = NULL;
	char *datastr;
	struct message_t *msg;

	printf("Módulo mensagem -> teste - Value:");

	msg = (struct message_t *) malloc(sizeof(struct message_t));
	msg->opcode = OC_PUT;
	msg->c_type = CT_VALUE;
	datastr = strdup("abc");
	msg->content.data = data_create2(strlen("abc") + 1, datastr);
	size = message_to_buffer(msg, &msg_str);

	opcode = htons(msg->opcode);
	c_type = htons(msg->c_type);
	datasize = msg->content.data->datasize;
	datasize_conv = htonl(datasize);

	char comp_data[datasize];

	memcpy(comp_data, msg_str + 8, datasize);
	result = memcmp(msg_str, &opcode, 2) == 0 &&
		 memcmp(msg_str + 2, &c_type, 2) == 0 &&
		 memcmp(msg_str + 4, &datasize_conv, 4) == 0 &&
		 memcmp(msg_str + 8, &comp_data, datasize) == 0;

	free_message(msg);

	msg = buffer_to_message(msg_str, size);

	result = result && msg->opcode == OC_PUT &&
			   msg->c_type == CT_VALUE &&
			   msg->content.data->datasize == strlen("abc")+1 &&
			   strcmp(msg->content.data->data,"abc") == 0;

	free(msg_str);
	free(datastr);
	//print_message(msg);
	free_message(msg);

	printf(" %s\n", result ? "passou" : "não passou");
	return result;
}
int rtable_put(struct rtable_t *rtable, char *key, struct data_t *data){
   int result;
   struct data_t *NovaData=(struct data_t*)malloc(sizeof(struct data_t));
   NovaData=data_create2(strlen(data),data);
   struct entry_t *entry=(struct entry_t*)malloc(sizeof(struct entry_t));
   entry = entry_create(key, NovaData);
   struct message_t *msg = (struct message_t*)malloc(sizeof(struct message_t));
   msg->opcode = OC_PUT;
   msg->c_type = CT_ENTRY;
   msg->content.entry=entry;
   //network_send_receive(rtable->server, msg);
   if( network_send_receive(rtable->server, msg)->opcode==OC_PUT+1){ //testar se foi colocado efectivamente no servidor
      result=1;
   } else {
      result = -1;
   }
   return result;
}
示例#6
0
int testDup() {
    char *key = strdup("123abc");
    struct data_t *value = data_create2(strlen("1234567890abc")+1,strdup("1234567890abc"));

    struct entry_t *entry = entry_create(key,value);

    struct entry_t *entry2 = entry_dup(entry);

    int result = (entry->key != entry2->key) &&
                 (strcmp(entry->key,entry2->key) == 0) &&
                 (entry->value != entry2->value) &&
                 (entry->value->datasize == entry2->value->datasize) &&
                 (memcmp(entry->value->data, entry2->value->data, entry->value->datasize) == 0);

    entry_destroy(entry);
    entry_destroy(entry2);

    printf("Modulo entry -> teste entry_dup: %s\n",result?"passou":"não passou");
    return result;
}
int main(int argc, char**argv){
	//verifica se tem no argumento o adress_port
	if(argc < 2)
	{
		perror("Poucos ou muitos argumentos");
		return -1;
	}
	char ** outKeys;
	char *input = malloc(100 * sizeof(char));
	struct data_t *inData, *outData;
	struct rtable_t *rtable;
	char *instruction;
	char *inKeyData;
	char *inKey;
	int  numSpace,i;

	if((rtable = rtable_bind(argv[1])) == NULL)
	{
		perror("Erro ao conectar-se ao servidor");
		return -1;
	}

	while(1){
		
		printf("Enter an instruction: ");
		fgets(input, 100, stdin); 

		//Numero de Espaços
		for(i=0,numSpace=0;input[i]!='\0';i++)
			if(input[i] == ' ')
				numSpace++;
		
		switch(numSpace)
		{
			case 0:
				instruction = strtok(input,"\n");
				break;
			case 1:
				instruction = strtok(input," ");
				inKey = strtok(NULL,"\n");
				break;
			case 2:
				instruction = strtok(input," ");
				inKey = strtok(NULL," ");
				inKeyData = strtok(NULL,"\n");
				if(inKey != NULL && inKeyData != NULL)
					inData = data_create2(strlen(inKeyData),inKeyData);
				break;
			default:
				instruction = "";
				break;
		}
		
		if(strcmp(instruction,"put") == 0 && numSpace == 2)
		{
			if(rtable_put(rtable,inKey,inData)==0)
			{
				printf("Operação executada com sucesso\n");
			}
			else
			{
				printf("Operação executa com insucesso\n");
			}
			data_destroy(inData);
		}
		else if(strcmp(instruction,"get") == 0 && numSpace == 1)
		{
			if(strcmp(inKey,"!") == 0)
			{
				outKeys = rtable_get_keys(rtable);
				if(outKeys != NULL)
				{
					printf("Operação executada com sucesso\n");
					for(i = 0; outKeys[i] != NULL ; i++)
					{
						printf("A tabela remota tem a key: %s\n", outKeys[i]);
					}
					rtable_free_keys(outKeys);
				}
				else
				{
					printf("Operação executa com insucesso\n");
				}
			}
			else
			{
				outData = rtable_get(rtable,inKey);
				if(outData != NULL)
				{
					printf("Operação executada com sucesso\n");
					printf("Data recebida com tamanho %d\n",outData->datasize);
					data_destroy(outData);
				}
				else
				{
					printf("Operação executa com insucesso\n");
				}
			}
		}
		else if(strcmp(instruction,"update" ) == 0 && numSpace == 2)
		{
			if(rtable_update(rtable,inKey,inData)==0)
			{
				printf("Operação executada com sucesso\n");	
			}
			else
			{
				printf("Operação executa com insucesso\n");
			}
			data_destroy(inData);
		}
		else if(strcmp(instruction,"del") == 0 && numSpace == 1)
		{
			if(rtable_del(rtable,inKey)==0)
			{
				printf("Operação executada com sucesso\n");	
			}
			else
			{
				printf("Operação executa com insucesso\n");
			}
		}
		else if(strcmp(instruction,"size") == 0 && numSpace == 0)
		{
			printf("Numero de elementos da tabela remota: %d\n",rtable_size(rtable));
		}
		else if(strcmp(instruction,"quit") == 0 && numSpace == 0)
		{
			free(input);
			if(rtable_unbind(rtable)<0)
			{
				perror("rtable_unbind");
				return -1;
			}
			printf("Adeus humano!\n");
			return 0;
		}
		else 
		{
			printf("Non-valid instruction\n");
		}
	}
}
示例#8
0
int testEntry() {
	int result, size, keysize, datasize, datasize_conv;
	short opcode, c_type, keysize_conv;
	char *msg_str = NULL;
	char *datastr = strdup("abc");
	struct message_t *msg;
	struct data_t *d;

	printf("Módulo mensagem -> teste - Entry");

	d = data_create2(strlen(datastr) + 1, datastr);

	msg = (struct message_t *) malloc(sizeof(struct message_t));
	msg->opcode = OC_PUT;
	msg->c_type = CT_ENTRY;
	msg->content.entry = entry_create(datastr, d);
	data_destroy(d);

	size = message_to_buffer(msg, &msg_str);

	opcode = htons(msg->opcode);
	c_type = htons(msg->c_type);
	keysize = strlen(msg->content.entry->key);
	keysize_conv = htons(keysize);

	char comp_key[keysize];

	memcpy(comp_key, msg_str + 6, keysize);
	datasize = msg->content.entry->value->datasize;
	datasize_conv = htonl(datasize);

	char comp_data[datasize];

	memcpy(comp_data, msg_str + 4 + 2 + keysize + 4, datasize);

	result = memcmp(msg_str, &opcode, 2) == 0 &&
		 memcmp(msg_str + 2, &c_type, 2) == 0 &&
		 memcmp(msg_str + 4, &keysize_conv, 2) == 0 &&
		 memcmp(msg_str + 6, &comp_key, keysize) == 0 &&
		 memcmp(msg_str + 6 + keysize, &datasize_conv, 4) == 0 &&
		 memcmp(msg_str + 6 + keysize + 4, &comp_data, datasize) == 0;

	free_message(msg);

	msg = buffer_to_message(msg_str, size);

	result = result && msg->opcode == OC_PUT &&
			   msg->c_type == CT_ENTRY &&
			   strcmp(msg->content.entry->key, datastr) == 0 &&
			   msg->content.entry->value->datasize == strlen(datastr) + 1 &&
			   strcmp(msg->content.entry->value->data, datastr) == 0;

	free(msg_str);
	free(datastr);

	//print_message(msg);
	
	free_message(msg);

	printf(" %s\n", result ? "passou" : "não passou");
	return result;
}