test-guid.c revision bcb4e51a409d94ae670de96afb8483a4f7855294
2e37d45867d081db150ab78dad303b9077aea24fTimo Sirainen/* Copyright (c) 2014-2018 Dovecot authors, see the included COPYING file */
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen#include "test-lib.h"
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen#include "guid.h"
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen#include "ioloop.h"
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen/*
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen * We want earlier timestamps to compare as < with later timestamps, but
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen * guid_128_cmp() doesn't do that because the timestamps in the guid are
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen * stored in little-endian byte order.
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen */
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainenstatic int reverse_guid_128_cmp(const guid_128_t a, const guid_128_t b)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen{
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen int i;
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen for (i = GUID_128_SIZE - 1; i >= 0; i--)
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen if (a[i] != b[i])
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen return (int)a[i] - (int)b[i];
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen return 0;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen}
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainenstatic bool guid_128_has_sane_nsecs(const guid_128_t g)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen{
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen unsigned long nsecs;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainen nsecs = le32_to_cpu_unaligned(g);
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return nsecs < 1000000000UL;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen}
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainenstatic inline void set_fake_time(time_t sec, long usec)
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen{
85a4ae7e8df7ea45a7665828e5edf48a5fc85730Timo Sirainen ioloop_timeval.tv_sec = sec;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen ioloop_timeval.tv_usec = usec;
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen}
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen/*
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen * We muck with the ioloop_timeval in various ways and make sure that the
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen * guids that get generated make sense. To make sure that the guid
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen * generation code takes up our faked timestamp, we use a far-away time (Jan
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen * 1 2038) as the base time. We don't want to go beyond 32-bit signed
85a4ae7e8df7ea45a7665828e5edf48a5fc85730Timo Sirainen * time_t for the base time to avoid issues on systems with 32-bit signed
85a4ae7e8df7ea45a7665828e5edf48a5fc85730Timo Sirainen * time_t.
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen *
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen * While guids really only need to be unique, here we actually enforce that
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen * they are increasing (as defined by reverse_guid_128_cmp()). If guids are
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen * always increasing, they will always be unique.
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen */
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainenstatic void test_ioloop_guid_128_generate(void)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen{
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen const time_t basetime = 2145909600; /* Jan 1 2038 */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen struct timeval saved_ioloop_timeval;
0fd246126fece57712566c725d6353f255f5fcfaTimo Sirainen guid_128_t guids[2];
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen int i;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* save the ioloop_timeval before we start messing with it */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen saved_ioloop_timeval = ioloop_timeval;
d0ef8bc2b961a68dd0f75662c2160bd296b9476bTimo Sirainen
f4616f1875297fb2f583d913c0f01b075bdecd5bTimo Sirainen /*
f4616f1875297fb2f583d913c0f01b075bdecd5bTimo Sirainen * Generating multiple guids within a microsecond should keep
f4616f1875297fb2f583d913c0f01b075bdecd5bTimo Sirainen * incrementing them.
f4616f1875297fb2f583d913c0f01b075bdecd5bTimo Sirainen */
bc93929cdd9000ca560a5f42a27f50ab307f1efbTimo Sirainen test_begin("guid_128_generate() increasing guid within a usec");
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen set_fake_time(basetime, 0);
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen guid_128_generate(guids[1]);
bc93929cdd9000ca560a5f42a27f50ab307f1efbTimo Sirainen for (i = 0; i < 10; i++) {
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen const int this = i % 2;
bc93929cdd9000ca560a5f42a27f50ab307f1efbTimo Sirainen const int prev = 1 - this;
bc93929cdd9000ca560a5f42a27f50ab307f1efbTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen guid_128_generate(guids[this]);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(reverse_guid_128_cmp(guids[prev], guids[this]) < 0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(guid_128_has_sane_nsecs(guids[this]));
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
bc93929cdd9000ca560a5f42a27f50ab307f1efbTimo Sirainen test_end();
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /*
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen * If the current time changes by +1 usec, so should the guids.
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen */
d54ab8987e482a8df250615b44f41fa040c38741Timo Sirainen test_begin("guid_128_generate() increasing guid with usec fast-forward");
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen for (i = 0; i < 10; i++) {
bc93929cdd9000ca560a5f42a27f50ab307f1efbTimo Sirainen const int this = i % 2;
bc93929cdd9000ca560a5f42a27f50ab307f1efbTimo Sirainen const int prev = 1 - this;
bc93929cdd9000ca560a5f42a27f50ab307f1efbTimo Sirainen
bc93929cdd9000ca560a5f42a27f50ab307f1efbTimo Sirainen set_fake_time(basetime, 1 + i);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen guid_128_generate(guids[this]);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(reverse_guid_128_cmp(guids[prev], guids[this]) < 0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(guid_128_has_sane_nsecs(guids[this]));
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_end();
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /*
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen * If the current time changes by +1 sec, so should the guids.
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_begin("guid_128_generate() increasing guid with sec fast-forward");
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen for (i = 0; i < 10; i++) {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen const int this = i % 2;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen const int prev = 1 - this;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen set_fake_time(basetime + 1 + i, 0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen guid_128_generate(guids[this]);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(reverse_guid_128_cmp(guids[prev], guids[this]) < 0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(guid_128_has_sane_nsecs(guids[this]));
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_end();
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen /*
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen * Requesting enough guids should increment the seconds but always
c4b376dd6e0c423006d7ac83a39253bcaf8e7c47Timo Sirainen * produce valid nsecs.
eef4ba0cc3e78f8c26804c1c9251a76580a41f0cTimo Sirainen *
eef4ba0cc3e78f8c26804c1c9251a76580a41f0cTimo Sirainen * (Set a time that leaves us 1000 guids before seconds overflow and
eef4ba0cc3e78f8c26804c1c9251a76580a41f0cTimo Sirainen * then ask for 2500 guids.)
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen */
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainen test_begin("guid_128_generate() proper guid nsec overflow");
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen set_fake_time(basetime + 11, 999999L);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen for (i = 0; i < 2500; i++) {
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen const int this = i % 2;
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen const int prev = 1 - this;
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen
eef4ba0cc3e78f8c26804c1c9251a76580a41f0cTimo Sirainen guid_128_generate(guids[this]);
eef4ba0cc3e78f8c26804c1c9251a76580a41f0cTimo Sirainen test_assert(reverse_guid_128_cmp(guids[prev], guids[this]) < 0);
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen test_assert(guid_128_has_sane_nsecs(guids[this]));
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_end();
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen /*
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen * When ahead by 1500 guids (see previous test), +1 usec shouldn't
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen * have any effect.
bc93929cdd9000ca560a5f42a27f50ab307f1efbTimo Sirainen */
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen test_begin("guid_128_generate() no effect with increasing time when ahead");
a5e89374cb2fb2cad575fee6c3b33a9487ab9b3aTimo Sirainen set_fake_time(basetime + 12, 0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen guid_128_generate(guids[0]);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(reverse_guid_128_cmp(guids[1], guids[0]) < 0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(guid_128_has_sane_nsecs(guids[0]));
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_end();
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen /* not a test - just set a more convenient time */
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen set_fake_time(basetime + 15, 500);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen guid_128_generate(guids[1]);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(reverse_guid_128_cmp(guids[0], guids[1]) < 0);
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen test_assert(guid_128_has_sane_nsecs(guids[1]));
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /*
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen * Time going backwards by 1 usec should have no effect on guids.
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_begin("guid_128_generate() usec time-travel still increasing");
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen set_fake_time(basetime + 15, 499);
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainen guid_128_generate(guids[0]);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(reverse_guid_128_cmp(guids[1], guids[0]) < 0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(guid_128_has_sane_nsecs(guids[0]));
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_end();
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /*
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen * Time going backwards by 1 sec should have no effect on guids.
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen */
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen test_begin("guid_128_generate() sec time-travel still increasing");
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen set_fake_time(basetime + 14, 499);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen guid_128_generate(guids[1]);
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen test_assert(reverse_guid_128_cmp(guids[0], guids[1]) < 0);
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen test_assert(guid_128_has_sane_nsecs(guids[1]));
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_end();
bc93929cdd9000ca560a5f42a27f50ab307f1efbTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* restore the previously saved value just in case */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen ioloop_timeval = saved_ioloop_timeval;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen}
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenvoid test_guid(void)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen{
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen static const guid_128_t test_guid =
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen { 0x01, 0x23, 0x45, 0x67, 0x89,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen 0xab, 0xcd, 0xef,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen 0xAB, 0xCD, 0xEF,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen 0x00, 0x00, 0x00, 0x00, 0x00 };
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen guid_128_t guid1, guid2, guid3;
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen const char *str;
64b61cd24d630223478ccbe1934b9f60f0881f59Timo Sirainen char guidbuf[GUID_128_SIZE*2 + 2];
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen unsigned int i;
d54ab8987e482a8df250615b44f41fa040c38741Timo Sirainen
f210ec6b25f80d06419921e9231465bb114ee971Timo Sirainen test_begin("guid_128_generate()");
f210ec6b25f80d06419921e9231465bb114ee971Timo Sirainen guid_128_generate(guid1);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen guid_128_generate(guid2);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(!guid_128_equals(guid1, guid2));
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen test_assert(guid_128_cmp(guid1, guid2) != 0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_end();
64b61cd24d630223478ccbe1934b9f60f0881f59Timo Sirainen
64b61cd24d630223478ccbe1934b9f60f0881f59Timo Sirainen test_begin("guid_128_is_empty()");
64b61cd24d630223478ccbe1934b9f60f0881f59Timo Sirainen test_assert(!guid_128_is_empty(guid1));
64b61cd24d630223478ccbe1934b9f60f0881f59Timo Sirainen test_assert(!guid_128_is_empty(guid2));
437a8b0fe254057b0c1f1723d689bafa91cae2abTimo Sirainen guid_128_generate(guid3);
64b61cd24d630223478ccbe1934b9f60f0881f59Timo Sirainen guid_128_empty(guid3);
64b61cd24d630223478ccbe1934b9f60f0881f59Timo Sirainen test_assert(guid_128_is_empty(guid3));
64b61cd24d630223478ccbe1934b9f60f0881f59Timo Sirainen test_end();
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
64b61cd24d630223478ccbe1934b9f60f0881f59Timo Sirainen test_begin("guid_128_copy()");
64b61cd24d630223478ccbe1934b9f60f0881f59Timo Sirainen guid_128_copy(guid3, guid1);
64b61cd24d630223478ccbe1934b9f60f0881f59Timo Sirainen test_assert(guid_128_equals(guid3, guid1));
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen test_assert(!guid_128_equals(guid3, guid2));
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen guid_128_copy(guid3, guid2);
eef4ba0cc3e78f8c26804c1c9251a76580a41f0cTimo Sirainen test_assert(!guid_128_equals(guid3, guid1));
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen test_assert(guid_128_equals(guid3, guid2));
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen test_end();
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_begin("guid_128_to_string()");
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen str = guid_128_to_string(guid1);
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen test_assert(guid_128_from_string(str, guid3) == 0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(guid_128_equals(guid3, guid1));
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_end();
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_begin("guid_128_from_string()");
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen /* empty */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen memset(guidbuf, '0', GUID_128_SIZE*2);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen guidbuf[GUID_128_SIZE*2] = '\0';
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen guidbuf[GUID_128_SIZE*2+1] = '\0';
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(guid_128_from_string(guidbuf, guid3) == 0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(guid_128_is_empty(guid3));
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* too large */
f4616f1875297fb2f583d913c0f01b075bdecd5bTimo Sirainen guidbuf[GUID_128_SIZE*2] = '0';
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(guid_128_from_string(guidbuf, guid3) < 0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* too small */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen guidbuf[GUID_128_SIZE*2-1] = '\0';
f4616f1875297fb2f583d913c0f01b075bdecd5bTimo Sirainen test_assert(guid_128_from_string(guidbuf, guid3) < 0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* reset to normal */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen guidbuf[GUID_128_SIZE*2-1] = '0';
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen guidbuf[GUID_128_SIZE*2] = '\0';
f4616f1875297fb2f583d913c0f01b075bdecd5bTimo Sirainen test_assert(guid_128_from_string(guidbuf, guid3) == 0);
f4616f1875297fb2f583d913c0f01b075bdecd5bTimo Sirainen /* upper + lowercase hex chars */
bd1b2615928a1e8be190cb0405754f0aec8cac2fTimo Sirainen i_assert(GUID_128_SIZE*2 > 16 + 6);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen for (i = 0; i < 10; i++)
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen guidbuf[i] = '0' + i;
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen for (i = 0; i < 6; i++)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen guidbuf[10 + i] = 'a' + i;
94f90df2cfb7587bb5af432b2ba065d1c364e1f7Timo Sirainen for (i = 0; i < 6; i++)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen guidbuf[16 + i] = 'A' + i;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(guid_128_from_string(guidbuf, guid3) == 0);
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen test_assert(guid_128_equals(guid3, test_guid));
c63c3c4d548416914b8c6734fe18dd69bb900775Timo Sirainen /* non-hex chars */
94f90df2cfb7587bb5af432b2ba065d1c364e1f7Timo Sirainen guidbuf[0] = 'g';
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(guid_128_from_string(guidbuf, guid3) < 0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen guidbuf[0] = ' ';
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen test_assert(guid_128_from_string(guidbuf, guid3) < 0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(guid_128_from_uuid_string("fee0ceac-0327-11e7-ad39-52540078f374", guid3) == 0);
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen test_assert(guid_128_from_uuid_string("fee0ceac032711e7ad3952540078f374", guid2) == 0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(guid_128_cmp(guid3, guid2) == 0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(guid_128_from_uuid_string("{fee0ceac-0327-11e7-ad39-52540078f374}", guid2) == 0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(guid_128_cmp(guid3, guid2) == 0);
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen test_assert(strcmp(guid_128_to_uuid_string(guid3, FORMAT_RECORD), "fee0ceac-0327-11e7-ad39-52540078f374")==0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(strcmp(guid_128_to_uuid_string(guid3, FORMAT_COMPACT), "fee0ceac032711e7ad3952540078f374")==0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(strcmp(guid_128_to_uuid_string(guid3, FORMAT_MICROSOFT), "{fee0ceac-0327-11e7-ad39-52540078f374}")==0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* failure test */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen test_assert(guid_128_from_uuid_string("fe-e0ceac-0327-11e7-ad39-52540078f374", guid3) < 0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen test_end();
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen test_ioloop_guid_128_generate();
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen}
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen