static void TestDuplicateAndDeleteSet(void)
	// A test of the set duplication and deleting routines.
{
	OSStatus err;
	CFStringRef currentSetID;
	CFStringRef newSetID;
	
	currentSetID = NULL;
	newSetID = NULL;
	err = MoreSCCopyCurrentSet(&currentSetID);
	if (err == noErr) {
		err = MoreSCDuplicateSet(currentSetID, CFSTR("Frog"), &newSetID);
	}
	if (err == noErr) {
		if (!gRunQuiet) {
			fprintf(stderr, "New set ID is ");
			CFShow(newSetID);
		}
		
		err = MoreSCDeleteSet(newSetID);
	}
	
	CFQRelease(currentSetID);
	CFQRelease(newSetID);

	PrintTestResult(err, NULL);
}
static void TestRenameService(void)
	// A test of the MoreSCRenameService routine.
{
	OSStatus 	err;
	CFArrayRef  localServiceIDs;
	CFStringRef originalName;
	CFStringRef newName;
	CFStringRef serviceZero;
	
	localServiceIDs = NULL;
	originalName = NULL;
	newName = NULL;

	// Use NULL for the set ID to indicate that we're operating on
	// the current set.
	//
	// Can't use NULL for a service ID, so we have to come up with 
	// a valid service ID first.  We do this by choosing the first 
	// service ID.
	
	err = MoreSCCopyServiceIDs(NULL, &localServiceIDs, NULL);
	if (err == noErr) {
		assert( CFArrayGetCount(localServiceIDs) > 0 );
		serviceZero = (CFStringRef) CFArrayGetValueAtIndex(localServiceIDs, 0);
		err = MoreSCCopyUserVisibleNameOfService(NULL, serviceZero, &originalName);
	}
	if (err == noErr) {
		err = MoreSCRenameService(NULL, serviceZero, CFSTR("Frog"));
	}
	if (err == noErr) {
		err = MoreSCCopyUserVisibleNameOfService(NULL, serviceZero, &newName);
	}
	if (err == noErr) {
		if ( ! CFEqual(newName, CFSTR("Frog")) ) {
			fprintf(stderr, "*** newName isn't 'Frog'\n");
			CFShow(newName);
		}
		err = MoreSCRenameService(NULL, serviceZero, originalName);
	}
	if (err == noErr) {
		CFQRelease(newName);
		newName = NULL;
		
		err = MoreSCCopyUserVisibleNameOfService(NULL, serviceZero, &newName);
	}
	if (err == noErr) {
		if ( ! CFEqual(newName, originalName) ) {
			fprintf(stderr, "*** newName isn't the same as originalName\n");
			CFShow(newName);
		}
	}
	
	CFQRelease(localServiceIDs);
	CFQRelease(originalName);
	CFQRelease(newName);

	PrintTestResult(err, NULL);
}
static void TestPortScanner(void)
	// A simple test of the port scanner code.  This doesn't do a 
	// lot of automated testing, but you can look at the results 
	// and visually check them.
{
	OSStatus   	err;
	CFArrayRef 	portArray;
	CFIndex 	portCount;
	CFIndex 	portIndex;
	long		order;
	CFNumberRef	supportsHold;
	
	portArray = NULL;
	
	err = MoreSCCreatePortArray(&portArray);
	if (err == noErr) {
		portCount = CFArrayGetCount(portArray);
		for (portIndex = 0; portIndex < portCount; portIndex++) {
			CFDictionaryRef thisPort;
			
			thisPort = (CFDictionaryRef) CFArrayGetValueAtIndex(portArray, portIndex);
			if (!gRunQuiet) {
				fprintf(stderr, "Port %ld\n", portIndex);
				fprintf(stderr, "  device   = ");
				CFShow(CFDictionaryGetValue(thisPort, kSCPropNetInterfaceDeviceName));
				fprintf(stderr, "  name     = ");
				CFShow(CFDictionaryGetValue(thisPort, kSCPropUserDefinedName));
				fprintf(stderr, "  hardware = ");
				CFShow(CFDictionaryGetValue(thisPort, kSCPropNetInterfaceHardware));
				fprintf(stderr, "  variant  = ");
				CFShow(CFDictionaryGetValue(thisPort, kMoreSCPropNetInterfaceHardwareVariant));
				fprintf(stderr, "  type     = ");
				CFShow(CFDictionaryGetValue(thisPort, kSCPropNetInterfaceType));
				fprintf(stderr, "  subtype  = ");
				CFShow(CFDictionaryGetValue(thisPort, kSCPropNetInterfaceSubType));
				fprintf(stderr, "  MAC      = ");
				CFShow(CFDictionaryGetValue(thisPort, kSCPropMACAddress));
				(void) CFNumberGetValue((CFNumberRef) CFDictionaryGetValue(thisPort, CFSTR("SortOrder")), kCFNumberLongType, &order);
				
				supportsHold = (CFNumberRef) CFDictionaryGetValue(thisPort, kSCPropNetInterfaceSupportsModemOnHold);
				if (supportsHold != NULL) {
					long hold;
					
					CFNumberGetValue(supportsHold, kCFNumberLongType, &hold);
					fprintf(stderr, "  hold     = %ld\n", hold);
				}

				fprintf(stderr, "  sort     = %ld\n", order);
			}
		}
	}
	
	CFQRelease(portArray);

	PrintTestResult(err, NULL);
}
static void TestCopySetsDict(void)
	// A test of the MoreSCCopySetsDict routine, which proved key 
	// in tracking down a reference count leak.
{
	OSStatus 		err;
	CFDictionaryRef setsDict;

	setsDict = NULL;
	err = MoreSCCopySetsDict(&setsDict);
	CFQRelease(setsDict);

	PrintTestResult(err, NULL);
}
static void TestRenameSet(void)
	// A test of the MoreSCRenameSet routine.
{
	OSStatus err;
	CFStringRef currentSetID;
	CFStringRef originalName;
	CFStringRef newName;
	
	currentSetID = NULL;
	originalName = NULL;
	newName = NULL;
	
	err = MoreSCCopyCurrentSet(&currentSetID);
	if (err == noErr) {
		err = MoreSCCopyUserVisibleNameOfSet(currentSetID, &originalName);
	}
	if (err == noErr) {
		err = MoreSCRenameSet(currentSetID, CFSTR("Frog"));
	}
	if (err == noErr) {
		err = MoreSCCopyUserVisibleNameOfSet(currentSetID, &newName);
	}
	if (err == noErr) {
		if ( ! CFEqual(newName, CFSTR("Frog")) ) {
			fprintf(stderr, "*** newName isn't 'Frog'\n");
			CFShow(newName);
		}
		err = MoreSCRenameSet(currentSetID, originalName);
	}
	if (err == noErr) {
		CFQRelease(newName);
		newName = NULL;
		
		err = MoreSCCopyUserVisibleNameOfSet(currentSetID, &newName);
	}
	if (err == noErr) {
		if ( ! CFEqual(newName, originalName) ) {
			fprintf(stderr, "*** newName isn't the same as originalName\n");
			CFShow(newName);
		}
	}
	
	CFQRelease(currentSetID);
	CFQRelease(originalName);
	CFQRelease(newName);

	PrintTestResult(err, NULL);
}
static void TestServiceEnumerate(void)
	// A test of the service enumeration routines.
{
	OSStatus  err;
	ItemCount serviceCount;
	ItemCount serviceIndex;
	CFArrayRef localServiceIDs;
	CFArrayRef resolvedServiceIDs;

	localServiceIDs = NULL;
	resolvedServiceIDs = NULL;
	
	err = MoreSCCopyServiceIDs(NULL, &localServiceIDs, &resolvedServiceIDs);
	if (err == noErr) {
		serviceCount = CFArrayGetCount(localServiceIDs);
		for (serviceIndex = 0; serviceIndex < serviceCount; serviceIndex++) {
			CFStringRef userVisible;
			Boolean     active;
			
			userVisible = NULL;
			err = MoreSCCopyUserVisibleNameOfService(NULL, (CFStringRef) CFArrayGetValueAtIndex(localServiceIDs, serviceIndex), &userVisible);
			if (err == noErr) {
				err = MoreSCIsServiceActive(NULL, (CFStringRef) CFArrayGetValueAtIndex(localServiceIDs, serviceIndex), &active);
			}
			if (err == noErr && !gRunQuiet) {
				fprintf(stderr, "#%ld %c ", serviceIndex, (active) ? ' ' : 'X');
				CFShow(userVisible);
				CFShow(CFArrayGetValueAtIndex(localServiceIDs, serviceIndex));
				CFShow(CFArrayGetValueAtIndex(resolvedServiceIDs, serviceIndex));
			}
			
			CFQRelease(userVisible);
			
			if (err != noErr) {
				break;
			}
		}
	}

	CFQRelease(localServiceIDs);
	CFQRelease(resolvedServiceIDs);

	PrintTestResult(err, NULL);
}
static void TestAppleTalk(void)
	// A routine to test the AppleTalk on/off routines.
{
	OSStatus 	err;
	Boolean  	originalState;
	Boolean		newState;

	err = MoreSCIsAppleTalkActive(NULL, &originalState);
	if (err == noErr && !gRunQuiet) {
		fprintf(stderr, "AppleTalk is %s.\n", originalState ? "active" : "inactive");
	}
	if (err == noErr) {
		err = MoreSCSetAppleTalkActive(NULL, !originalState);
	}
	if (err == noErr) {
		err = MoreSCIsAppleTalkActive(NULL, &newState);
	}
	if (err == noErr) {
		if (!gRunQuiet) {
			fprintf(stderr, "AppleTalk is now %s.\n", newState ? "active" : "inactive");
		}
		if (newState != !originalState) {
			fprintf(stderr, "*** Failed to change state.\n");
		}
	}
	if (err == noErr) {
		err = MoreSCSetAppleTalkActive(NULL, originalState);
	}
	if (err == noErr) {
		err = MoreSCIsAppleTalkActive(NULL, &newState);
	}
	if (err == noErr) {
		if (!gRunQuiet) {
			fprintf(stderr, "AppleTalk is now %s.\n", newState ? "active" : "inactive");
		}
		if (newState != originalState) {
			fprintf(stderr, "*** Failed to restore state.\n");
		}
	}

	PrintTestResult(err, NULL);
}
static void TestCreateSet(void)
	// A routine to test the set creation and deletion code. 
	// It compares the newly created set against a set called 
	// "DefaultLocationForMoreSCFTest" to ensure that the set 
	// created by MoreSCF matches a set created by the control 
	// panel.
{
	OSStatus 		err;
	OSStatus 		err2;
	CFStringRef		newSetID;
	CFStringRef		templateSetID;
	
	newSetID = NULL;
	templateSetID = NULL;

	err = MoreSCFindSetByUserVisibleNameAndCopyID(CFSTR(kDefaultLocationName), &templateSetID);
	if (err != noErr || templateSetID == NULL) {
		fprintf(stderr, "*** TestCreateSet requires that you create a default set named '%s' using the Network preferences panel.\n", kDefaultLocationName);
		err = -1;
	}
	if (err == noErr) {
		err = MoreSCNewSet(CFSTR("Frog"), &newSetID);
	}
	if (err == noErr) {
		if (!gRunQuiet) {
			fprintf(stderr, "New set ID is ");
			CFShow(newSetID);
		}
		
		err = CompareSets(newSetID, templateSetID);

		err2 = MoreSCDeleteSet(newSetID);
		if (err == noErr) {
			err = err2;
		}
	}
	
	CFQRelease(newSetID);
	CFQRelease(templateSetID);

	PrintTestResult(err, NULL);
}
static void TestEnumerateEntities(void)
	// A test of the MoreSCCopyEntities routine.
{
	OSStatus 	err;
	CFArrayRef  localServiceIDs;
	ItemCount	entityCount;
	ItemCount	entityIndex;
	CFArrayRef  protocols;
	CFArrayRef  values;
	
	// Use NULL for the set ID to indicate that we're operating on
	// the current set.
	//
	// Can't use NULL for a service ID, so we have to come up with 
	// a valid service ID first.  We do this by choosing the first 
	// service ID.
	
	localServiceIDs = NULL;
	protocols = NULL;
	values = NULL;
	
	err = MoreSCCopyServiceIDs(NULL, &localServiceIDs, NULL);
	if (err == noErr) {
		assert(CFArrayGetCount(localServiceIDs) > 0);
		err = MoreSCCopyEntities(NULL, (CFStringRef) CFArrayGetValueAtIndex(localServiceIDs, 0), &protocols, &values);
	}

	if (err == noErr && !gRunQuiet) {
		entityCount = CFArrayGetCount(protocols);
		for (entityIndex = 0; entityIndex < entityCount; entityIndex++) {
			fprintf(stderr, "#%ld ", entityIndex);
			CFShow(CFArrayGetValueAtIndex(protocols, entityIndex));
			CFShow(CFArrayGetValueAtIndex(values,    entityIndex));
		}
	}

	CFQRelease(localServiceIDs);
	CFQRelease(protocols);
	CFQRelease(values);
	
	PrintTestResult(err, NULL);
}
static void TestDuplicateAndDeleteService(void)
	// A test of the service duplication and deleting routines.
{
	OSStatus 	err;
	CFArrayRef  localServiceIDs;
	CFStringRef newServiceID;
	
	newServiceID = NULL;
	localServiceIDs = NULL;

	// Use NULL for the set ID to indicate that we're operating on
	// the current set.
	//
	// Can't use NULL for a service ID, so we have to come up with 
	// a valid service ID first.  We do this by choosing the first 
	// service ID.
	
	err = MoreSCCopyServiceIDs(NULL, &localServiceIDs, NULL);
	if (err == noErr) {
		assert( CFArrayGetCount(localServiceIDs) > 0 );
		err = MoreSCDuplicateService(NULL, (CFStringRef) CFArrayGetValueAtIndex(localServiceIDs, 0), CFSTR("Frog"), &newServiceID);
	}

	if (err == noErr) {
		if (!gRunQuiet) {
			fprintf(stderr, "New service ID is ");
			CFShow(newServiceID);
		}
		
		err = MoreSCDeleteService(NULL, newServiceID);
	}

	CFQRelease(localServiceIDs);
	CFQRelease(newServiceID);

	PrintTestResult(err, NULL);
}
// ---------------------------------------------------------------------------
// CStunTurnTests::DoRunInterfaceTestsL
// 
// ---------------------------------------------------------------------------
//
void CStunTurnTests::DoRunStunTurnTestsL()
    {
    TInt err( KErrNone );
    
    iConsole.Printf( _L("Create session test") );
    RDebug::Print( _L("\n\nNAT_TEST_START: Create session") );
    //__UHEAP_MARK; 
    TRAP( err, TestCreateSessionL() );
    //__UHEAP_MARKEND;
    RDebug::Print( _L("\nNAT_TEST_STOP: Create session, ERR: %d"), err );
    PrintTestResult( err );
    
    err = KErrNone;
    RDebug::Print( _L("\n\nNAT_TEST_START: Create stream") );
    iConsole.Printf( _L("Create stream test") );
    __UHEAP_MARK;
    TRAP( err, TestCreateStreamL() );
    RDebug::Print( _L("\nNAT_TEST_STOP: Create stream, ERR: %d"), err );
    PrintTestResult( err );
    __UHEAP_MARKEND;
   
    err = KErrNone;
    RDebug::Print( _L("\n\nNAT_TEST_START: Create wrapper") );
    iConsole.Printf( _L("Create wrapper test") );
    __UHEAP_MARK;
    TRAP( err, TestCreateWrapperL() ); 
    RDebug::Print( _L("\nNAT_TEST_STOP: Create wrapper, ERR: %d"), err );
    PrintTestResult( err );
    __UHEAP_MARKEND;
    
    err = KErrNone;
    RDebug::Print( _L("\n\nNAT_TEST_START: Set incoming Address to wrapper") );
    iConsole.Printf( _L("Set Incoming Address to wrapper test") );
    __UHEAP_MARK;
    TRAP( err, SetupTestL() );
    if ( !err )
        {
        __UHEAP_MARK;
        TRAP( err, TestSetIncomingAddrL() );
        __UHEAP_MARKEND;
        TeardownTest();
        }
    else
        {
        RDebug::Print( _L("\nTEST PRINT: Setup fails, ERR: %d"), err );
        }
    RDebug::Print( _L("\nNAT_TEST_STOP: Set incoming Address to wrapper, ERR: %d"), err );
    PrintTestResult( err );
    __UHEAP_MARKEND;
    
    err = KErrNone;
    RDebug::Print( _L("\n\nNAT_TEST_START: Outgoing address") );
    iConsole.Printf( _L("Get outgoing address from wrapper test") );
    __UHEAP_MARK;
    TRAP( err, SetupTestL() );
    if ( !err )
        {
        __UHEAP_MARK;
        TRAP( err, TestOutgoingAddrL() );
        __UHEAP_MARKEND;
        TeardownTest();
        }
    else
        {
        RDebug::Print( _L("\nTEST PRINT: Setup fails, ERR: %d"), err );
        }
    RDebug::Print( _L("\nNAT_TEST_STOP: Outgoing address, ERR: %d"), err );
    PrintTestResult( err );
    __UHEAP_MARKEND;
    
    err = KErrNone;
    RDebug::Print( _L("\n\nNAT_TEST_START: Fetch candidate") );
    iConsole.Printf( _L("Fetch Candidate test") );
    __UHEAP_MARK;
    TRAP( err, TestFetchCandidateL() );
    RDebug::Print( _L("\nNAT_TEST_STOP: Fetch candidate, ERR: %d"), err );
    PrintTestResult( err );
    __UHEAP_MARKEND;
    
    err = KErrNone;
    RDebug::Print( _L("\n\nNAT_TEST_START: Fetch candidate: wrong server address") );
    iConsole.Printf( _L("Fetch Candidate wrong server address test") );
    __UHEAP_MARK;
    TRAP( err, SetupWrongServerAddressTestL() );
    if ( !err )
        {
        __UHEAP_MARK;
        TRAP( err, TestFetchCandidateL() );
        __UHEAP_MARKEND;
        }
    else
        {
        RDebug::Print( _L("\nTEST PRINT: Setup fails, ERR: %d"), err );
        } 
    TeardownWrongServerAddressTest();
    RDebug::Print( _L("\nNAT_TEST_STOP: Fetch candidate wrong server address, ERR: %d"), err );
    PrintTestResult( err );
    __UHEAP_MARKEND;
    
    
    err = KErrNone;
    RDebug::Print( _L("\n\nNAT_TEST_START: Set sending status ") );
    iConsole.Printf( _L("Set Sending Status test") );
    __UHEAP_MARK;
    TRAP( err, SetupTest2L() );
    if ( !err )
        {
        __UHEAP_MARK;
         if ( KProtocolInetUdp == iProtocol )
            {
            TRAP( err, TestSetSendingStatusUDPL() );
            }
        else
            {
            TRAP( err, TestSetSendingStatusTCPL() );
            }
        __UHEAP_MARKEND;
        }
    else
        {
        RDebug::Print( _L("\nTEST PRINT: Setup fails, ERR: %d"), err );
        }
    TeardownTest();
    RDebug::Print( _L("\nNAT_TEST_STOP: Set sending status, ERR: %d"), err );
    PrintTestResult( err );
    __UHEAP_MARKEND;
  
    err = KErrNone;
    RDebug::Print( _L("\n\nNAT_TEST_START: Set receiving status") );
    iConsole.Printf( _L("Set Receiving Status test") );
    __UHEAP_MARK;
    TRAP( err, SetupTest2L() );
    if ( !err )
        {
        __UHEAP_MARK;
        if ( KProtocolInetUdp == iProtocol )
            {
            TRAP( err, TestSetReceivingStatusUDPL() );
            }
        else
            {
            TRAP( err, TestSetReceivingStatusTCPL() );
            }
        __UHEAP_MARKEND;
        TeardownTest();
        }
    else
        {
        RDebug::Print( _L("\nTEST PRINT: Setup fails, ERR: %d"), err );
        }
    
    RDebug::Print( _L("\nNAT_TEST_STOP: Set receiving status, ERR: %d"), err );
    PrintTestResult( err );
    __UHEAP_MARKEND;
    }
static void TestISP(void)
	// A routine to test the ISP support routines.
{
	OSStatus err;
	CFStringRef setID;
	CFStringRef setID2;
	CFStringRef newSetID;
	
	setID = NULL;
	setID2 = NULL;
	newSetID = NULL;
	
	err = MoreSCFindSetByUserVisibleNameAndCopyID(CFSTR(kDefaultLocationName), &setID);
	if (err == noErr) {
		if (setID == NULL) {
			fprintf(stderr, "*** Couldn't find the set '%s'\n", kDefaultLocationName);
		} else if (!gRunQuiet) {
			fprintf(stderr, "Set ID for '%s' is\n", kDefaultLocationName);
			CFShow(setID);
		}
	}
	if (err == noErr) {
		err = MoreSCFindSetByUserVisibleNameAndCopyID(CFSTR("Who would give a set such a silly name"), &setID2);
		if (setID2 != NULL) {
			fprintf(stderr, "*** Found set that shouldn't exist\n");
		}
	}
	if (err == noErr) {
		MoreSCPPPDigest ppp;
		
		BlockZero(&ppp, sizeof(ppp));
		ppp.active            = true;
		ppp.authName          = CFSTR("Quinn");
		ppp.authPassword      = CFSTR("eskimo");
		ppp.commRemoteAddress = CFSTR("123 4567");

		err = MoreSCMakeNewDialupSet(NULL, CFSTR("Frog PPP"), NULL, &ppp, NULL, NULL, &newSetID);
	}
	if (err == noErr) {
		err = MoreSCDeleteSet(newSetID);
	}
	
	CFQRelease(newSetID);
	newSetID = NULL;

	PrintTestResult(err, "dialup");

    err = noErr;
	
	if (err == noErr) {
		MoreSCPPPDigest ppp;
		
		BlockZero(&ppp, sizeof(ppp));
		ppp.active            = true;
		ppp.authName          = CFSTR("Quinn");
		ppp.authPassword      = CFSTR("eskimo");

		err = MoreSCMakeNewPPPoESet(NULL, CFSTR("Frog PPPoE"), &ppp, NULL, NULL, &newSetID);
	}
	if (err == noErr) {
		err = MoreSCDeleteSet(newSetID);
	}
	
	CFQRelease(setID);
	CFQRelease(setID2);
	CFQRelease(newSetID);

	PrintTestResult(err, "PPPoE");
}
static void TestSetEnumerationAndSwitch(void)
	// A test of set enumeration and switching routines.
{
	OSStatus	err;
	CFIndex  	setCount;
	CFIndex	  	setIndex;
	CFArrayRef	setIDs;
	CFIndex		indexOfCurrentSet;
	
	setIDs = NULL;
	
	// Enumeration
	
	err = MoreSCCopySetIDs(&setIDs, &indexOfCurrentSet);
	if (err == noErr) {
		setCount = CFArrayGetCount(setIDs);
		for (setIndex = 0; setIndex < setCount; setIndex++) {
			CFStringRef userVis;
			
			userVis = NULL;
			err = MoreSCCopyUserVisibleNameOfSet( (CFStringRef) CFArrayGetValueAtIndex(setIDs, setIndex), &userVis);
			if (err == noErr && !gRunQuiet) {
				fprintf(stderr, "#%ld %c ", setIndex, (setIndex == indexOfCurrentSet) ? '*' : ' ');
				CFShow(userVis);
				CFShow(CFArrayGetValueAtIndex(setIDs, setIndex));
			}
			CFQRelease(userVis);
			
			if (err != noErr) {
				break;
			}
		}
	}
	if (err == noErr) {
		CFStringRef currentSetID;
		
		currentSetID = NULL;
		err = MoreSCCopyCurrentSet(&currentSetID);
		if (err == noErr && !gRunQuiet) {
			fprintf(stderr, "Current set ID is ");
			CFShow(currentSetID);
		}
		
		CFQRelease(currentSetID);
	}
	
	// Switch
	
	if (err == noErr) {
		ItemCount newSet;
		
		if (indexOfCurrentSet == 0) {
			newSet = 1;
		} else {
			newSet = 0;
		}
		err = MoreSCSetCurrentSet( (CFStringRef) CFArrayGetValueAtIndex(setIDs, newSet));
		if (err == noErr) {
			err = MoreSCSetCurrentSet( (CFStringRef) CFArrayGetValueAtIndex(setIDs, indexOfCurrentSet));
		}
	}

	CFQRelease(setIDs);
	
	PrintTestResult(err, NULL);
}