Ich habe Client-Code geschrieben, der einige Daten über einen Socket senden und eine Antwort vom Remote-Server zurücklesen soll.
Ich möchte diesen Code testen. Die Signatur der Funktion ist etwas in der Art von:
%Vor% Dabei ist fd
der Dateideskriptor des Sockets für den Remote-Server.
Nun blockiert die Funktion call_remote
nach dem Senden der Daten beim Lesen der Antwort vom Server. Wie kann ich einen solchen Remote-Server für Unit-Tests des Codes stubben?
Idealerweise möchte ich etwas wie:
%Vor% Ich möchte, dass stub_behavior
aufgerufen wird und den 42.0
-Wert in den Stubed File Descriptor zurücksendet.
Kann ich das ganz einfach?
Wenn dies ein POSIX-System ist, können Sie fork()
und socketpair()
:
... Sie werden wahrscheinlich eine Fehlerüberprüfung hinzufügen und die Logik ändern, die die Anfrage liest.
Der Dateideskriptor, der von socketpair()
erstellt wurde, ist ein normaler Socket und daher funktionieren Socket-Aufrufe wie send()
und recv()
problemlos.
Sie können alles verwenden, auf das mit einem Dateideskriptor zugegriffen werden kann. Eine Datei oder, wenn Sie das Sperrverhalten simulieren möchten, eine Pipe.
Hinweis: Offensichtliche Socket-spezifische Aufrufe (Setsockopt, fcntl, ioctl, ...) funktionieren nicht.
Ich bin der gleichen Situation begegnet und teile meine Herangehensweise. Ich habe Netzwerk-Dumps erstellt, genau, was der Client senden sollte und wie die Server-Antwort lauten sollte. Ich führte dann einen Byte-für-Byte-Vergleich der Client-Anfrage durch, um sicherzustellen, dass sie übereinstimmte. Wenn die Anfrage gültig ist, lese ich aus der Antwortdatei und sende sie zurück an den Client.
Ich freue mich, weitere Details zur Verfügung zu stellen (wenn ich an einer Maschine mit Zugriff auf diesen Code bin)
Hier ist eine C ++ - Implementierung (ich weiß, die ursprüngliche Frage war für C, aber es ist einfach, wenn gewünscht, zurück in C zu konvertieren). Es funktioniert wahrscheinlich nicht für sehr große Strings, da der Socket wahrscheinlich blockiert, wenn der String nicht gepuffert werden kann. Aber es funktioniert für kleine Unit Tests.
%Vor%Tags und Links c unit-testing c++ sockets stub