genericopenlibs/cstdlib/TSTLIB/TNETDB.C
changeset 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/cstdlib/TSTLIB/TNETDB.C	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,257 @@
+/*
+* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+* Test of NETDB.H functions - you need a real Internet connection for this!
+* 
+*
+*/
+
+
+
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <libc/netinet/in.h>
+#include <libc/arpa/inet.h>
+#include <netdb.h>
+#include <errno.h>
+
+#include "CTEST.H"	/* includes C interface to EPOC32 threads, and SpawnPosixServer */
+
+test_Data;
+
+#define N_ADDRESSES	3
+unsigned long addresses[N_ADDRESSES][3] =
+	{
+		{ 121, 0x112233, 0x79112233 },	/* class A 121.xxxxxxxx */
+		{ 33771, 0x1122, 0x83eb1122 },	/* class B 131.235.xxxx */
+		{ 12747009,  90, 0xc281015a }	/* class C 194.129.1.xx */
+	};
+
+/**
+@SYMTestCaseID          SYSLIB-STDLIB-CT-1072
+@SYMTestCaseDesc	    Tests for ARPA net functions
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests for all basic network functions 
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+void testArpa()
+	{
+	char* cp;
+	char* cp2;
+	struct in_addr iaddr;
+	unsigned long ul1, ul2;
+	int err;
+	int i;
+
+	test_Next("ARPA/INET.H functions");
+
+	iaddr.s_addr=11;
+	cp="16.33.50.67";
+	err=inet_aton(cp, &iaddr);
+	test(err==1);
+	test(iaddr.s_addr==htonl(0x10213243));
+	test(iaddr.s_addr==inet_addr(cp));
+	cp2=inet_ntoa(iaddr);
+	test(strcmp(cp2,cp)==0);
+
+	iaddr.s_addr=11;
+	err=inet_aton("16.rubbish.67", &iaddr);
+	test(err==0);
+
+	for (i=0;i<N_ADDRESSES;i++)
+		{
+		iaddr=inet_makeaddr(addresses[i][0], addresses[i][1]);
+		test(iaddr.s_addr==ntohl(addresses[i][2]));
+		ul1=inet_netof(iaddr);
+		ul2=inet_lnaof(iaddr);
+		test(ul1==addresses[i][0]);
+		test(ul2==addresses[i][1]);
+		}
+	}
+
+#define N_NAMES	3
+const char* names[N_NAMES][3] = 
+	{
+		{ "phoenix.doc.ic.ac.uk",  "146.169.1.160",    "phoenix.doc.ic.ac.uk" },
+		{ "httpsmtp.test.intra",   "192.168.20.11",   "httpsmtp.test.intra" },
+		{ "unix.sri.com",          "128.18.30.211",    "unix.sri.com" }
+	};
+
+int close_console=0;
+
+/**
+@SYMTestCaseID          SYSLIB-STDLIB-CT-1073
+@SYMTestCaseDesc	    Tests for ARPA net functions
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests for get host by name and host by address functions
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+void testNetDB()
+	{
+	char hostname[128];
+	struct in_addr addr, *addrp;
+	int err, i;
+	struct hostent *hp;
+
+	test_Next("Get Host Name");
+
+	err=gethostname(hostname,sizeof(hostname));
+	test(err==0);
+	printf("  hostname = >%s<\n", hostname);
+
+	test_Next("Get Host By Name");
+
+	for (i=0; i<N_NAMES; i++)
+		{
+		hp=gethostbyname(names[i][0]);
+		test_ok(hp!=0);
+		addrp=(struct in_addr*)(hp->h_addr_list[0]);
+		printf("  %-30s => address %-15s\n", hp->h_name, inet_ntoa(*addrp));
+		test(strcasecmp(hp->h_name,names[i][0])==0);
+		test(addrp->s_addr==inet_addr(names[i][1]));
+		}
+
+	hp=gethostbyname("nosuchname.symbian.com");
+	test_errno(hp==0,ENOENT);
+	test(errno==HOST_NOT_FOUND);
+
+	test_Next("Get Address of \"\"");
+	hp=gethostbyname("");
+	test_ok(hp!=0);
+	addrp=(struct in_addr*)(hp->h_addr_list[0]);
+	printf("  %-30s => address %-15s\n", hp->h_name, inet_ntoa(*addrp));
+
+	test_Next("Get Host By Addr");
+
+	for (i=0; i<N_NAMES; i++)
+		{
+		addr.s_addr=inet_addr(names[i][1]);
+		hp=gethostbyaddr((const char *)&addr,sizeof(addr),AF_INET);
+		test_ok(hp!=0);
+		addrp=(struct in_addr*)(hp->h_addr_list[0]);
+		printf("  address %-15s => %s\n", inet_ntoa(*addrp), hp->h_name);
+		test(addrp->s_addr==addr.s_addr);
+		test(strcasecmp(hp->h_name,names[i][2])==0);
+		}
+
+	addr.s_addr=inet_addr("10.11.199.255");
+	hp=gethostbyaddr((const char *)&addr,sizeof(addr),AF_INET);
+	test_errno(hp==0,ENOENT);
+	test(errno==HOST_NOT_FOUND);
+	
+/*
+	struct sockaddr_in testaddr;
+	int fd;
+	test_Next("Connect to the Imperial College Echo server");
+
+	fd=socket(AF_INET, SOCK_STREAM, 0);
+	test_ok(fd>=0);
+	testaddr.sin_family=AF_INET;
+	testaddr.sin_addr.s_addr=inet_addr("193.63.255.1");
+	testaddr.sin_port=htons(7);	// echo
+	err=connect(fd,(struct sockaddr*)&testaddr, sizeof(testaddr));
+	test(err==0);
+	close(fd);
+*/
+
+	test_Next("Get Address of roundrobin.test.intra which has multiple address");
+	hp=gethostbyname("roundrobin.test.intra");	
+	test_ok(hp!=0);
+
+	if (hp)
+		{
+		if (hp->h_addr_list)
+			{
+			int Index = 0;
+			while (hp->h_addr_list[Index])
+				{
+				addrp = (struct in_addr*)(hp->h_addr_list[Index]);
+				printf("  %-30s => address %-15s\n", hp->h_name, inet_ntoa(*addrp));
+				Index++;
+				}
+			}
+		}
+
+	test_Next("Get Host name of 192.168.255.4 which has multiple host name");
+	addr.s_addr=inet_addr("192.168.255.4");
+	hp=gethostbyaddr((const char *)&addr,sizeof(addr),AF_INET);
+	test_ok(hp!=0);
+
+	if (hp)
+		{
+		addrp=(struct in_addr*)(hp->h_addr_list[0]);
+		printf("  address %-15s => %s\n", inet_ntoa(*addrp), hp->h_name);
+
+		if (hp->h_aliases)
+			{
+			int Index = 0;
+			while (hp->h_aliases[Index])
+				{
+				printf("  address %-15s => %s\n", inet_ntoa(*addrp), hp->h_aliases[Index]);
+				Index++;
+				}
+			}
+		}
+
+	if (close_console)
+		{
+		test_Close();
+		close(0);
+		close(1);
+		close(2);
+		}
+	}
+
+
+int main(int argc, char *argv[])
+	{
+	void* client;
+	int err;
+
+	test_Title("NETDB.H Functionality");
+
+	err=CommInit(0);	/* ensure a workable comms environment */
+	test(err==0);
+
+	testArpa();	/* doesn't use the MSystemInterface so only tested once */
+
+	if (argc==1)
+		{
+		/* Run the test(s) without a CPosixServer first */		
+		testNetDB();
+		}
+
+	test_Next("Do it all using the CPosixServer (for them, not me)");
+	close_console=1;
+
+	start_posix_server();	/* calls SpawnPosixServer from C++ code */
+
+	client=create_thread(testNetDB, "TNETDB NetDB");
+	test(client!=0);
+	start_thread(client);
+	err=wait_for_thread(client);
+	test(err==0);
+
+	test_Close();
+	exit(0);
+	return 0;
+	}