/* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 * Jonathan Schleifer * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" #import "OFKernelEventObserver.h" #import "OFString.h" #import "OFTCPSocket.h" #import "OFAutoreleasePool.h" #import "TestsAppDelegate.h" static OFString *module = @"OFKernelEventObserverSocket"; static OFKernelEventObserver *observer; static int events = 0; static id expectedObject; static bool readData = false, expectEOS = false; static OFTCPSocket *accepted = nil; @interface ObserverDelegate: OFObject - (void)objectIsReadyForReading: (id)object; @end @implementation ObserverDelegate - (void)objectIsReadyForReading: (id)object { events++; OF_ENSURE(object == expectedObject); if ([object isListening]) { accepted = [[object accept] retain]; [accepted writeBuffer: "0" length: 1]; } else if (readData) { char buf; if (expectEOS) OF_ENSURE([object readIntoBuffer: &buf length: 1] == 0); else { OF_ENSURE([object readIntoBuffer: &buf length: 1] == 1); OF_ENSURE(buf == '0'); } } } @end @implementation TestsAppDelegate (OFKernelEventObserverTests) - (void)kernelEventObserverTests { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; ObserverDelegate *delegate = [[[ObserverDelegate alloc] init] autorelease]; OFTCPSocket *sock1 = [OFTCPSocket socket]; OFTCPSocket *sock2 = [OFTCPSocket socket]; uint16_t port; port = [sock1 bindToHost: @"127.0.0.1" port: 0]; [sock1 listen]; TEST(@"+[observer]", (observer = [OFKernelEventObserver observer]) && R([observer setDelegate: delegate])) TEST(@"-[addObjectForReading:]", R([observer addObjectForReading: sock1])) [sock2 connectToHost: @"127.0.0.1" port: port]; TEST(@"-[observe] waiting for connection", (expectedObject = sock1) && [observer observeForTimeInterval: 0.01]) [accepted autorelease]; TEST(@"-[observe] waiting for data", (expectedObject = sock2) && R([observer addObjectForReading: sock2]) && [observer observeForTimeInterval: 0.01]) TEST(@"-[observe] keeping event until read", R(readData = true) && [observer observeForTimeInterval: 0.01]) TEST(@"-[observe] time out due to no events", R(readData = false) && ![observer observeForTimeInterval: 0.01]) [accepted close]; TEST(@"-[observe] closed connection", R(readData = true) && R(expectEOS = true) && [observer observeForTimeInterval: 0.01]) TEST(@"-[observe] correct number of events", events == 4) [pool drain]; } @end