X-Git-Url: http://p2p-next.cs.pub.ro/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Flibswift%2Ftests%2Ftransfertest.cpp;fp=src%2Flibswift%2Ftests%2Ftransfertest.cpp;h=9938bc31b5677fc77a8a4f3d7b9d7f6eb0d8019c;hb=45963a7511531cd1656ad5d3847d2dafd015c54d;hp=0000000000000000000000000000000000000000;hpb=d069796805ad79542fd7e4406d1e9c6d2d8c2ef7;p=swifty.git diff --git a/src/libswift/tests/transfertest.cpp b/src/libswift/tests/transfertest.cpp new file mode 100644 index 0000000..9938bc3 --- /dev/null +++ b/src/libswift/tests/transfertest.cpp @@ -0,0 +1,155 @@ +/* + * transfertest.cpp + * swift + * + * Created by Victor Grishchenko on 10/7/09. + * Copyright 2009-2012 TECHNISCHE UNIVERSITEIT DELFT. All rights reserved. + * + */ +//#include +//#include +#include "swift.h" +#include "compat.h" +#include + +using namespace swift; + +const char* BTF = "test_file"; + +Sha1Hash A,B,C,D,E,AB,CD,ABCD,E0,E000,ABCDE000,ROOT; + + +TEST(TransferTest,TBHeap) { + tbheap tbh; + ASSERT_TRUE(tbh.is_empty()); + tbh.push(tintbin(3,bin_t::NONE)); + tbh.push(tintbin(1,bin_t::NONE)); + ASSERT_EQ(2,tbh.size()); + tbh.push(tintbin(2,bin_t::ALL)); + ASSERT_EQ(1,tbh.pop().time); + ASSERT_EQ(bin_t::ALL,tbh.peek().bin); + ASSERT_EQ(2,tbh.pop().time); + ASSERT_EQ(3,tbh.pop().time); +} + + +TEST(TransferTest,TransferFile) { + + AB = Sha1Hash(A,B); + CD = Sha1Hash(C,D); + ABCD = Sha1Hash(AB,CD); + E0 = Sha1Hash(E,Sha1Hash::ZERO); + E000 = Sha1Hash(E0,Sha1Hash::ZERO); + ABCDE000 = Sha1Hash(ABCD,E000); + ROOT = ABCDE000; + //for (bin_t pos(3,0); !pos.is_all(); pos=pos.parent()) { + // ROOT = Sha1Hash(ROOT,Sha1Hash::ZERO); + //printf("m %lli %s\n",(uint64_t)pos.parent(),ROOT.hex().c_str()); + //} + + // now, submit a new file + + FileTransfer* seed_transfer = new FileTransfer(BTF); + HashTree* seed = & seed_transfer->file(); + EXPECT_TRUE(A==seed->hash(bin_t(0,0))); + EXPECT_TRUE(E==seed->hash(bin_t(0,4))); + EXPECT_TRUE(ABCD==seed->hash(bin_t(2,0))); + EXPECT_TRUE(ROOT==seed->root_hash()); + EXPECT_TRUE(ABCD==seed->peak_hash(0)); + EXPECT_TRUE(E==seed->peak_hash(1)); + EXPECT_TRUE(ROOT==seed->root_hash()); + EXPECT_EQ(4100,seed->size()); + EXPECT_EQ(5,seed->size_in_chunks()); + EXPECT_EQ(4100,seed->complete()); + EXPECT_EQ(4100,seed->seq_complete()); + EXPECT_EQ(bin_t(2,0),seed->peak(0)); + + // retrieve it + unlink("copy"); + FileTransfer* leech_transfer = new FileTransfer("copy",seed->root_hash()); + HashTree* leech = & leech_transfer->file(); + leech_transfer->picker().Randomize(0); + // transfer peak hashes + for(int i=0; ipeak_count(); i++) + leech->OfferHash(seed->peak(i),seed->peak_hash(i)); + ASSERT_EQ(5<<10,leech->size()); + ASSERT_EQ(5,leech->size_in_chunks()); + ASSERT_EQ(0,leech->complete()); + EXPECT_EQ(bin_t(2,0),leech->peak(0)); + // transfer data and hashes + // ABCD E000 + // AB CD E0 0 + // AAAA BBBB CCCC DDDD E 0 0 0 + // calculated leech->OfferHash(bin64_t(1,0), seed->hashes[bin64_t(1,0)]); + leech->OfferHash(bin_t(1,1), seed->hash(bin_t(1,1))); + for (int i=0; i<5; i++) { + if (i==2) { // now: stop, save, start + delete leech_transfer; + leech_transfer = new FileTransfer("copy",seed->root_hash(),false); + leech = & leech_transfer->file(); + leech_transfer->picker().Randomize(0); + EXPECT_EQ(2,leech->chunks_complete()); + EXPECT_EQ(bin_t(2,0),leech->peak(0)); + } + bin_t next = leech_transfer->picker().Pick(seed->ack_out(),1,TINT_NEVER); + ASSERT_NE(bin_t::NONE,next); + ASSERT_TRUE(next.base_offset()<5); + uint8_t buf[1024]; //size_t len = seed->storer->ReadData(next,&buf); + size_t len = pread(seed->file_descriptor(),buf,1024,next.base_offset()<<10); + bin_t sibling = next.sibling(); + if (sibling.base_offset()size_in_chunks()) + leech->OfferHash(sibling, seed->hash(sibling)); + uint8_t memo = *buf; + *buf = 'z'; + EXPECT_FALSE(leech->OfferData(next, (char*)buf, len)); + fprintf(stderr,"offer of bad data was refused, OK\n"); + *buf = memo; + EXPECT_TRUE(leech->OfferData(next, (char*)buf, len)); + } + EXPECT_EQ(4100,leech->size()); + EXPECT_EQ(5,leech->size_in_chunks()); + EXPECT_EQ(4100,leech->complete()); + EXPECT_EQ(4100,leech->seq_complete()); + +} +/* + FIXME + - always rehashes (even fresh files) + */ + +int main (int argc, char** argv) { + + unlink("test_file"); + unlink("copy"); + unlink("test_file.mhash"); + unlink("copy.mhash"); + + int f = open(BTF,O_RDWR|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); + if (f < 0) + { + eprintf("Error opening %s\n",BTF); + return -1; + } + uint8_t buf[1024]; + memset(buf,'A',1024); + A = Sha1Hash(buf,1024); + write(f,buf,1024); + memset(buf,'B',1024); + B = Sha1Hash(buf,1024); + write(f,buf,1024); + memset(buf,'C',1024); + C = Sha1Hash(buf,1024); + write(f,buf,1024); + memset(buf,'D',1024); + D = Sha1Hash(buf,1024); + write(f,buf,1024); + memset(buf,'E',4); + E = Sha1Hash(buf,4); + write(f,buf,4); + close(f); + + testing::InitGoogleTest(&argc, argv); + int ret = RUN_ALL_TESTS(); + + return ret; +}