X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Ftest.cpp;h=402bae95cb33277813d3d1e5e75134f281db0a75;hb=e0889c6c03d48fabc15adf06af811ab2bfc2fe23;hp=7753e1d5f180256f485d383016d1bde03c1ea11a;hpb=112dbba7c4d38bf780e4e2f05bdff106b52ce2f9;p=dragonfireclient.git diff --git a/src/test.cpp b/src/test.cpp index 7753e1d5f..402bae95c 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -22,9 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "debug.h" #include "map.h" #include "player.h" -#include "main.h" #include "socket.h" -#include "connection.h" +#include "network/connection.h" #include "serialization.h" #include "voxel.h" #include "collision.h" @@ -42,7 +41,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/numeric.h" #include "util/serialize.h" #include "noise.h" // PseudoRandom used for random data for compression -#include "clientserver.h" // LATEST_PROTOCOL_VERSION +#include "network/networkprotocol.h" // LATEST_PROTOCOL_VERSION +#include "profiler.h" #include /* @@ -59,7 +59,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #define UTEST(x, fmt, ...)\ {\ if(!(x)){\ - LOGLINEF(LMT_ERROR, "Test (%s) failed: " fmt, #x, ##__VA_ARGS__);\ + dstream << "Test (" #x ") failed: " fmt << std::endl; \ test_failed = true;\ }\ } @@ -147,16 +147,48 @@ struct TestBase struct TestUtilities: public TestBase { + inline float ref_WrapDegrees180(float f) + { + // This is a slower alternative to the wrapDegrees_180() function; + // used as a reference for testing + float value = fmodf(f + 180, 360); + if (value < 0) + value += 360; + return value - 180; + } + + inline float ref_WrapDegrees_0_360(float f) + { + // This is a slower alternative to the wrapDegrees_0_360() function; + // used as a reference for testing + float value = fmodf(f, 360); + if (value < 0) + value += 360; + return value < 0 ? value + 360 : value; + } + + void Run() { - /*infostream<<"wrapDegrees(100.0) = "<getS16("a") == 5); + UASSERT(fabs(group->getFloat("bb") - 2.5) < 0.001); + + Settings *group3 = new Settings; + group3->set("cat", "meow"); + group3->set("dog", "woof"); + + Settings *group2 = new Settings; + group2->setS16("num_apples", 4); + group2->setS16("num_oranges", 53); + group2->setGroup("animals", group3); + group2->set("animals", "cute"); //destroys group 3 + s.setGroup("groupy_thing", group2); + + // Test set failure conditions + UASSERT(s.set("Zoop = Poop\nsome_other_setting", "false") == false); + UASSERT(s.set("sneaky", "\"\"\"\njabberwocky = false") == false); + UASSERT(s.set("hehe", "asdfasdf\n\"\"\"\nsomething = false") == false); + + // Test multiline settings + UASSERT(group->get("ccc") == "testy\n testa "); + + UASSERT(s.get("blarg") == + "some multiline text\n" + " with leading whitespace!"); + + // Test NoiseParams + UASSERT(s.getEntry("np_terrain").is_group == false); + + NoiseParams np; + UASSERT(s.getNoiseParams("np_terrain", np) == true); + UASSERT(fabs(np.offset - 5) < 0.001); + UASSERT(fabs(np.scale - 40) < 0.001); + UASSERT(fabs(np.spread.X - 250) < 0.001); + UASSERT(fabs(np.spread.Y - 250) < 0.001); + UASSERT(fabs(np.spread.Z - 250) < 0.001); + UASSERT(np.seed == 12341); + UASSERT(np.octaves == 5); + UASSERT(fabs(np.persist - 0.7) < 0.001); + + np.offset = 3.5; + np.octaves = 6; + s.setNoiseParams("np_terrain", np); + + UASSERT(s.getEntry("np_terrain").is_group == true); + + // Test writing + std::ostringstream os(std::ios_base::binary); + is.clear(); + is.seekg(0); + + UASSERT(s.updateConfigObject(is, os, "", 0) == true); + //printf(">>>> expected config:\n%s\n", TEST_CONFIG_TEXT_AFTER); + //printf(">>>> actual config:\n%s\n", os.str().c_str()); + UASSERT(os.str() == TEST_CONFIG_TEXT_AFTER); + } catch (SettingNotFoundException &e) { + UASSERT(!"Setting not found!"); + } } }; @@ -428,7 +628,7 @@ struct TestSerialization: public TestBase UASSERT(serializeWideString(L"") == mkstr("\0\0")); UASSERT(serializeLongString("") == mkstr("\0\0\0\0")); UASSERT(serializeJsonString("") == "\"\""); - + std::string teststring = "Hello world!"; UASSERT(serializeString(teststring) == mkstr("\0\14Hello world!")); @@ -554,12 +754,12 @@ struct TestCompress: public TestBase fromdata[1]=5; fromdata[2]=5; fromdata[3]=1; - + std::ostringstream os(std::ios_base::binary); compress(fromdata, os, 0); std::string str_out = os.str(); - + infostream<<"str_out.size()="< "; for(u32 i=0; i "; for(u32 i=0; iget(n).light_propagates == true); @@ -711,28 +910,28 @@ struct TestVoxelManipulator: public TestBase VoxelArea a(v3s16(-1,-1,-1), v3s16(1,1,1)); UASSERT(a.index(0,0,0) == 1*3*3 + 1*3 + 1); UASSERT(a.index(-1,-1,-1) == 0); - + VoxelArea c(v3s16(-2,-2,-2), v3s16(2,2,2)); // An area that is 1 bigger in x+ and z- VoxelArea d(v3s16(-2,-2,-3), v3s16(3,2,2)); - + std::list aa; d.diff(c, aa); - + // Correct results std::vector results; results.push_back(VoxelArea(v3s16(-2,-2,-3),v3s16(3,2,-3))); results.push_back(VoxelArea(v3s16(3,-2,-2),v3s16(3,2,2))); UASSERT(aa.size() == results.size()); - + infostream<<"Result of diff:"<::const_iterator i = aa.begin(); i != aa.end(); ++i) { i->print(infostream); infostream<::iterator j = std::find(results.begin(), results.end(), *i); UASSERT(j != results.end()); results.erase(j); @@ -742,13 +941,13 @@ struct TestVoxelManipulator: public TestBase /* VoxelManipulator */ - + VoxelManipulator v; v.print(infostream, nodedef); infostream<<"*** Setting (-1,0,-1)=2 ***"<get("bind_address"); + try { + bind_addr.Resolve(bind_str.c_str()); + + if (!bind_addr.isIPv6()) { + address = bind_addr; + } + } catch (ResolveError &e) { + } - char rcvbuffer[256]; - memset(rcvbuffer, 0, sizeof(rcvbuffer)); - Address sender; - for(;;) - { - int bytes_read = socket6.Receive(sender, rcvbuffer, sizeof(rcvbuffer)); - if(bytes_read < 0) - break; + // IPv6 socket test + if (g_settings->getBool("enable_ipv6")) { + UDPSocket socket6; + + if (!socket6.init(true, true)) { + /* Note: Failing to create an IPv6 socket is not technically an + error because the OS may not support IPv6 or it may + have been disabled. IPv6 is not /required/ by + minetest and therefore this should not cause the unit + test to fail + */ + dstream << "WARNING: IPv6 socket creation failed (unit test)" + << std::endl; + } else { + const char sendbuffer[] = "hello world!"; + IPv6AddressBytes bytes; + bytes.bytes[15] = 1; + + socket6.Bind(address6); + + try { + socket6.Send(Address(&bytes, port), sendbuffer, sizeof(sendbuffer)); + + sleep_ms(50); + + char rcvbuffer[256] = { 0 }; + Address sender; + + for(;;) { + if (socket6.Receive(sender, rcvbuffer, sizeof(rcvbuffer )) < 0) + break; + } + //FIXME: This fails on some systems + UASSERT(strncmp(sendbuffer, rcvbuffer, sizeof(sendbuffer)) == 0); + UASSERT(memcmp(sender.getAddress6().sin6_addr.s6_addr, + Address(&bytes, 0).getAddress6().sin6_addr.s6_addr, 16) == 0); + } + catch (SendFailedException &e) { + errorstream << "IPv6 support enabled but not available!" + << std::endl; + } } - //FIXME: This fails on some systems - UASSERT(strncmp(sendbuffer, rcvbuffer, sizeof(sendbuffer))==0); - UASSERT(memcmp(sender.getAddress6().sin6_addr.s6_addr, Address(&bytes, 0).getAddress6().sin6_addr.s6_addr, 16) == 0); } // IPv4 socket test { UDPSocket socket(false); - socket.Bind(port); + socket.Bind(address); const char sendbuffer[] = "hello world!"; - socket.Send(Address(127,0,0,1,port), sendbuffer, sizeof(sendbuffer)); + /* + * If there is a bind address, use it. + * It's useful in container environments + */ + if (address != Address(0, 0, 0, 0, port)) { + socket.Send(address, sendbuffer, sizeof(sendbuffer)); + } + else + socket.Send(Address(127, 0, 0 ,1, port), sendbuffer, sizeof(sendbuffer)); sleep_ms(50); - char rcvbuffer[256]; - memset(rcvbuffer, 0, sizeof(rcvbuffer)); + char rcvbuffer[256] = { 0 }; Address sender; - for(;;) - { - int bytes_read = socket.Receive(sender, rcvbuffer, sizeof(rcvbuffer)); - if(bytes_read < 0) + for(;;) { + if (socket.Receive(sender, rcvbuffer, sizeof(rcvbuffer)) < 0) break; } //FIXME: This fails on some systems - UASSERT(strncmp(sendbuffer, rcvbuffer, sizeof(sendbuffer))==0); - UASSERT(sender.getAddress().sin_addr.s_addr == Address(127,0,0,1, 0).getAddress().sin_addr.s_addr); + UASSERT(strncmp(sendbuffer, rcvbuffer, sizeof(sendbuffer)) == 0); + + if (address != Address(0, 0, 0, 0, port)) { + UASSERT(sender.getAddress().sin_addr.s_addr == + address.getAddress().sin_addr.s_addr); + } + else { + UASSERT(sender.getAddress().sin_addr.s_addr == + Address(127, 0, 0, 1, 0).getAddress().sin_addr.s_addr); + } } } }; @@ -1568,7 +1815,7 @@ struct TestConnection: public TestBase SharedBuffer data1(1); data1[0] = 100; Address a(127,0,0,1, 10); - u16 seqnum = 34352; + const u16 seqnum = 34352; con::BufferedPacket p1 = con::makePacket(a, data1, proto_id, peer_id, channel); @@ -1585,7 +1832,7 @@ struct TestConnection: public TestBase UASSERT(readU16(&p1.data[4]) == peer_id); UASSERT(readU8(&p1.data[6]) == channel); UASSERT(readU8(&p1.data[7]) == data1[0]); - + //infostream<<"initial data1[0]="<<((u32)data1[0]&0xff)< p2 = con::makeReliablePacket(data1, seqnum); @@ -1647,37 +1894,56 @@ struct TestConnection: public TestBase Handler hand_server("server"); Handler hand_client("client"); - + + Address address(0, 0, 0, 0, 30001); + Address bind_addr(0, 0, 0, 0, 30001); + /* + * Try to use the bind_address for servers with no localhost address + * For example: FreeBSD jails + */ + std::string bind_str = g_settings->get("bind_address"); + try { + bind_addr.Resolve(bind_str.c_str()); + + if (!bind_addr.isIPv6()) { + address = bind_addr; + } + } catch (ResolveError &e) { + } + infostream<<"** Creating server Connection"< data; - infostream<<"** running client.Receive()"< data = SharedBufferFromString("Hello World!"); + NetworkPacket pkt; + pkt.putRawPacket((u8*) "Hello World !", 14, 0); - infostream<<"** running client.Send()"< sentdata = pkt.oldForgePacket(); - sleep_ms(50); - - u16 peer_id; - SharedBuffer recvdata; - infostream<<"** running server.Receive()"< data1 = SharedBufferFromString("hello1"); - SharedBuffer data2 = SharedBufferFromString("Hello2"); - - Address client_address = - server.GetPeerAddress(peer_id_client); - - infostream<<"*** Sending packets in wrong order (2,1,2)" - <channels[chn]; - u16 sn = ch->next_outgoing_seqnum; - ch->next_outgoing_seqnum = sn+1; - server.Send(peer_id_client, chn, data2, true); - ch->next_outgoing_seqnum = sn; - server.Send(peer_id_client, chn, data1, true); - ch->next_outgoing_seqnum = sn+1; - server.Send(peer_id_client, chn, data2, true); + infostream<<"** running client.Send()"<20) - infostream<<"..."; - infostream< 20) + infostream << "..."; + infostream << std::endl; + + Buffer sentdata = pkt.oldForgePacket(); + + server.Send(peer_id_client, 0, &pkt, true); //sleep_ms(3000); - - SharedBuffer recvdata; - infostream<<"** running client.Receive()"< recvdata; + infostream << "** running client.Receive()" << std::endl; u16 peer_id = 132; u16 size = 0; bool received = false; u32 timems0 = porting::getTimeMs(); - for(;;){ + for(;;) { if(porting::getTimeMs() - timems0 > 5000 || received) break; - try{ - size = client.Receive(peer_id, recvdata); + try { + NetworkPacket pkt; + client.Receive(&pkt); + size = pkt.getSize(); + peer_id = pkt.getPeerId(); + recvdata = pkt.oldForgePacket(); received = true; - }catch(con::NoIncomingDataException &e){ + } catch(con::NoIncomingDataException &e) { } sleep_ms(10); } @@ -1946,37 +2104,67 @@ struct TestConnection: public TestBase infostream<<"..."; infostream<