2010-01-14 28 views
6

Soket hataları nasıl taklit edilir? (bazen sunucu veya istemci, bazı soket hatası nedeniyle kesilir ve yeniden üretilmesi imkansızdır.) Bunu yapmak için bir araç arıyordum ama bulamıyorum. Bir araçtan herhangi birini tanıyor veya bunun nasıl yapılacağı konusunda bir kod örneği var mı? (C# veya C/C++)soket hatalarını taklit etme

+2

Ağ kablosunu çıkarın. – Eclipse

cevap

6

Yuvalara erişmek için kullandığınız API'lere bir sarıcı katman ekleyin ve rand() 'nın% 100'ü>%' si için başarısız olmasını sağlayın.

+0

tamam, nasıl yapılacağından emin değilsiniz .. başarısız parçası .. – ra170

+0

@ ra170, sarma işlevinin yerine, gerçek işleve çağırmak yerine, hata kodu ne olursa olsun bu API için "başarısız" anlamına gelir. time –

1

Bu yaz tam olarak aynı problemi yaşadım.

Özel bir Socket sınıfı vardı ve read ya da ya da write bir istisna attığında ne olacağını test etmek istedim. Gerçekten çerçeveler alay Java taklit etmek istedim ve böyle yaptım:

Ben FakeSocket sınıfa Socket sınıfı miras ve bir şey bir SocketExpectation denilen oluşturdu. Daha sonra, birim testlerinde, sahte prizler oluşturdum, beklentileri oluşturdum ve sonra sahte soketi test etmek istediğim koda geçirdim.

uint32_t write(buffer, length); // calls check 
uint32_t read(buffer, length); // calls check 
bool matches(); 
void expect(expectation); 
uint32_t check(CallType, buffer, length) const; 

Onların hepsi oldukça yalındır:

FakeSocket

(gereksiz detaylar elimden) bu yöntemleri vardı. check, geçerli beklentiye karşı argümanları kontrol eder ve her şey plana uygunsa, SocketExpectation gereksinimini yerine getirmeye devam eder. Onları gerektiği gibi

typedef enum { write, read } CallType; 

SocketExpectation(CallType type); 
SocketExpectation &with_arguments(void *a1, uint32_t a2); // expects these args 
SocketExpectation &will_return(uint32_t value); 
SocketExpectation &will_throw(const char * e); // test error handling 
bool matches(); 

daha yöntemleri eklendi: SocketExpectation

(ayrıca soyuldu) bu çevre çizgisine sahiptir.

fake_socket = FakeSocket(); 
fake_socket.expect(SocketExpectation(write).with_arguments(....).will_return(...)); 
fake_socket.expect(SocketExpectation(read).with_arguments(...).will_throw("something")); 
+0

read ve write istisnalar atamıyor –

+0

Bağlantıya beklenmedik bir şey olursa istisnalar atan özel bir yuva sınıfıdır. – laura

0

Bir 'mock' ile bağlantı test altındaki kodu sürücü olarak benim soket kod birimi testleri muhtemelen daha iyi entegrasyon testlerinde olarak tarif edilmektedir: Sonra alakalı yönteme sahte soket geçmesine Bak, böyle yaratacak uzak akran. Uzaktaki eş testin kontrolü altında olduğu için (basit bir istemci ya da sunucu) testin uzaktaki eşin bağlantıyı çeşitli şekillerde bozmasına neden olabilir ve test edilen kodun beklendiği gibi tepki vermesini sağlarım. Kurmak için biraz iş gerekir, ancak tüm parçaları bir kez yerine getirdiğinizde, çoğu durumu test etmek oldukça kolaylaşır.

Yani, benim önerim, karşılaştığınız durumları simüle etmeyi denemekten ziyade onları anlamanız ve sonra onları güvenilir bir şekilde üretmenizdir.

İlgili konular