/*
* main.cxx
*
* PWLib application source file for dtmftest
*
* Main program entry point.
*
* Copyright (C) 2004 Post Increment
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
* the License for the specific language governing rights and limitations
* under the License.
*
* The Original Code is Portable Windows Library.
*
* The Initial Developer of the Original Code is Post Increment
*
* Contributor(s): ______________________________________.
*
* $Log: main.cxx,v $
* Revision 1.9 2005/11/30 12:47:40 csoutheren
* Removed tabs, reformatted some code, and changed tags for Doxygen
*
* Revision 1.8 2005/02/13 23:04:18 csoutheren
* Put isrfc1918 option handling before first test (doh!)
*
* Revision 1.7 2005/02/13 22:33:09 csoutheren
* Added ability to test an IP address for RFC1918
*
* Revision 1.6 2005/02/07 12:12:34 csoutheren
* Expanded interface list routines to include IPV6 addresses
* Added IPV6 to GetLocalAddress
*
* Revision 1.5 2005/02/03 12:38:00 csoutheren
* Added tests for URL parsing
*
* Revision 1.4 2005/01/15 19:27:07 csoutheren
* Added test for GetInterfaceTable
* Thanks to Jan Willamowius
*
* Revision 1.3 2004/12/14 14:24:20 csoutheren
* Added PIPSocket::Address::operator*= to compare IPV4 addresses
* to IPV4-compatible IPV6 addresses. More documentation needed
* once this is tested as working
*
* Revision 1.2 2004/12/14 07:49:49 csoutheren
* added some tests
*
* Revision 1.1 2004/12/14 06:50:59 csoutheren
* Initial version
*
*
*/
#include "precompile.h"
#include "main.h"
#include "version.h"
#include <ptlib/sockets.h>
#include <ptclib/url.h>
PCREATE_PROCESS(IPV6Test);
IPV6Test::IPV6Test()
: PProcess("Post Increment", "dtmftest", MAJOR_VERSION, MINOR_VERSION, BUILD_TYPE, BUILD_NUMBER)
{
}
void IPV6Test::Main()
{
PArgList & args = GetArguments();
args.Parse(
"-isrfc1918."
#if PTRACING
"o-output:" "-no-output."
"t-trace." "-no-trace."
#endif
"v-version."
);
#if PTRACING
PTrace::Initialise(args.GetOptionCount('t'),
args.HasOption('o') ? (const char *)args.GetOptionString('o') : NULL,
PTrace::Blocks | PTrace::Timestamp | PTrace::Thread | PTrace::FileAndLine);
#endif
if (args.HasOption('v')) {
cout << "Product Name: " << GetName() << endl
<< "Manufacturer: " << GetManufacturer() << endl
<< "Version : " << GetVersion(TRUE) << endl
<< "System : " << GetOSName() << '-'
<< GetOSHardware() << ' '
<< GetOSVersion() << endl;
return;
}
#if ! P_HAS_IPV6
cout << "error: IPV6 not included in PWLib" << endl;
#else
if (args.HasOption("isrfc1918")) {
if (args.GetCount() == 0)
PError << "error: must supply IP address as argument" << endl;
else {
PIPSocket::Address addr(args[0]);
cout << addr << " is " << (addr.IsRFC1918() ? "" : "not ") << "an RFC1918 address" << endl;
}
return;
}
{
// test #1 - check PIPSocket::IsIpAddressFamilyV6Supported
cout << "test #1: PIPSocket::IsIpAddressFamilyV6Supported ";
if (PIPSocket::IsIpAddressFamilyV6Supported())
cout << "OK";
else
cout << "failed";
cout << endl;
}
// this is an IPV6 compatibility address
const BYTE ipv6Data[] = { 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff,
220, 244, 81, 10 };
const PIPSocket::Address ipv6Addr1(sizeof(ipv6Data), ipv6Data);
{
// test #2 - check V6 constructor
cout << "test #2: PIPSocket::Address(int, const BYTE *) ";
if (ipv6Addr1.GetVersion() == 6)
cout << "OK";
else
cout << "failed";
cout << endl;
}
PIPSocket::Address ipv6Addr2("::ffff:220.244.81.10");
{
// test #3 - check V6 constructor
cout << "test #3: PIPSocket::Address(const PString & str) ";
if (ipv6Addr1.GetVersion() == 6)
cout << "OK";
else
cout << "failed - " << ipv6Addr1 << " <-> " << ipv6Addr2;
cout << endl;
}
{
// test #4 - check comparison for equality
cout << "test #4: PIPSocket::operator == ";
if (ipv6Addr1 == ipv6Addr2)
cout << "OK";
else
cout << "failed - " << ipv6Addr1 << " <-> " << ipv6Addr2;
cout << endl;
}
PIPSocket::Address ipv6Addr3("::ffff:220.244.81.09");
{
// test #5 - check comparison for non-equality
cout << "test #5: PIPSocket::operator != ";
if (ipv6Addr1 != ipv6Addr3)
cout << "OK";
else
cout << "failed";
cout << endl;
}
PIPSocket::Address ipv4Addr("220.244.81.10");
{
// test #6 - check IPV6 comparison to IPV4
cout << "test #6: PIPSocket::operator == with IPV4 (should fail) ";
if (ipv6Addr1 == ipv4Addr)
cout << "OK";
else
cout << "failed";
cout << endl;
}
{
// test #6a - check IPV6 comparison to IPV4
cout << "test #6a: PIPSocket::operator == with IPV4 (should fail) ";
if (ipv6Addr3 == ipv4Addr)
cout << "OK";
else
cout << "failed";
cout << endl;
}
{
// test #7 - check IPV6 comparison to IPV4
cout << "test #7: PIPSocket::operator *= with IPV4 ";
if (ipv6Addr1 *= ipv4Addr)
cout << "OK";
else
cout << "failed";
cout << endl;
}
{
// test #7a - check IPV6 comparison to IPV4
cout << "test #7a: PIPSocket::operator *= with IPV4 (should fail) ";
if (ipv6Addr3 *= ipv4Addr)
cout << "OK";
else
cout << "failed";
cout << endl;
}
{
// test #8 - check if interface table contains IPV6 addresses
cout << "test #8: check if interface table contains IPV6 addresses";
PIPSocket::InterfaceTable if_table;
PIPSocket::GetInterfaceTable( if_table );
// Display the interface table
cout << endl;
cout << "The interface table has " << if_table.GetSize()
<<" entries" << endl;
for (PINDEX i=0; i < if_table.GetSize(); i++) {
PIPSocket::InterfaceEntry if_entry = if_table[i];
cout << i << " " << if_entry << endl;
}
cout << "manual check";
cout << endl;
}
{
// test #9 - see if URLs decode correctly
cout << "test #9: check if parsing IPV6 URLs works" << endl;
PURL url("h323:@[::ffff:220.244.81.10]:1234");
PString addrStr = url.GetHostName();
PIPSocket::Address addr;
PIPSocket::GetHostAddress(addrStr, addr);
WORD port = url.GetPort();
cout << " host string = " << addrStr << " (should be [::ffff:220.244.81.10])\n"
<< " address = " << addr << " (should be ::ffff:220.244.81.10)\n"
<< " port = " << port << " (should be 1234)\n";
}
#endif
}
// End of File ///////////////////////////////////////////////////////////////
syntax highlighted by Code2HTML, v. 0.9.1