1 #include <muleunit/test.h>
3 #include <wx/filename.h>
5 #include <tags/FileTags.h>
13 using namespace muleunit
;
17 void test_taglist_serialization(TagPtrList
& taglist
, byte
* packet
, uint64 packet_len
);
19 template <class T1
, class T2
>
20 void AssertEquals(const T1
& a
, const T2
& b
)
25 struct BLOBValue
: std::vector
<byte
>
27 BLOBValue(uint32 _length
, const byte
* _ptr
)
28 : std::vector
<byte
> (_ptr
, _ptr
+ _length
)
32 struct BSOBValue
: std::vector
<byte
>
34 BSOBValue(uint8 _length
, const byte
* _ptr
)
35 : std::vector
<byte
> (_ptr
, _ptr
+ _length
)
39 BLOBValue
valid_tag_value(const BLOBValue
& x
) { return x
; }
40 BSOBValue
valid_tag_value(const BSOBValue
& x
) { return x
; }
41 CMD4Hash
valid_tag_value(const CMD4Hash
& x
) { return x
; }
42 float valid_tag_value(float x
) { return x
; }
43 wxString
valid_tag_value(const wxString
& x
) { return x
; }
44 uint64
valid_tag_value(int x
) { return x
; }
45 uint64
valid_tag_value(long long x
) { return x
; }
46 uint64
valid_tag_value(uint64 x
) { return x
; }
49 wxString
toString(const T
& value
)
57 wxString
toString(T
& value
)
65 wxString
toString(const CMD4Hash
& value
)
67 return value
.Encode();
71 wxString
toString(CMemFile
& buf
)
73 uint64 curpos
= buf
.GetPosition();
75 buf
.Seek(0, wxFromStart
);
76 for (uint64 i
= 0; i
< buf
.GetLength(); i
++) {
77 result
+= wxString::Format(wxT("0x%02x,"), buf
.ReadUInt8());
79 buf
.Seek(curpos
, wxFromStart
);
85 wxString
toString(const BSOBValue
& buf
)
88 for (uint64 i
= 0; i
< buf
.size(); i
++) {
89 result
+= wxString::Format(wxT("0x%02x,"), buf
[i
]);
95 wxString
toString(const BLOBValue
& buf
)
98 for (uint64 i
= 0; i
< buf
.size(); i
++) {
99 result
+= wxString::Format(wxT("0x%02x,"), buf
[i
]);
105 void AssertEquals(const CMD4Hash
& a
, const CMD4Hash
& b
)
107 CONTEXT(wxT("Compare CMD4Hashes"));
108 ASSERT_EQUALS(a
.Encode(), b
.Encode());
112 void AssertEquals(const BSOBValue
& a
, const BSOBValue
& b
)
114 CONTEXT(wxT("Compare BSOBValue"));
115 ASSERT_EQUALS(toString(a
), toString(b
));
119 void AssertEquals(const BLOBValue
& a
, const BLOBValue
& b
)
121 CONTEXT(wxT("Compare BLOBValue"));
122 ASSERT_EQUALS(toString(a
), toString(b
));
125 void CheckTagName(const wxString
& tagName
, CTag
* tag
)
127 CONTEXT(wxT("Checking string tagname"));
128 ASSERT_EQUALS(tagName
, tag
->GetName());
131 void CheckTagName(uint8 tagName
, CTag
* tag
)
133 CONTEXT(wxT("Checking int tagname"));
134 ASSERT_EQUALS(tagName
, tag
->GetNameID());
138 typedef bool (CTag::*CTagTypeChecker
)() const;
141 struct CTagAccess
{};
144 struct CTagAccess
<wxString
>
146 static bool IsRightType(CTag
* tag
)
151 static const wxString
& GetValue(CTag
* tag
)
153 return tag
->GetStr();
158 struct CTagAccess
<CMD4Hash
>
160 static bool IsRightType(CTag
* tag
)
162 return tag
->IsHash();
165 static const CMD4Hash
& GetValue(CTag
* tag
)
167 return tag
->GetHash();
172 struct CTagAccess
<float>
174 static bool IsRightType(CTag
* tag
)
176 return tag
->IsFloat();
179 static float GetValue(CTag
* tag
)
181 return tag
->GetFloat();
186 struct CTagAccess
<uint64
>
188 static bool IsRightType(CTag
* tag
)
193 static uint64
GetValue(CTag
* tag
)
195 return tag
->GetInt();
200 struct CTagAccess
<BLOBValue
>
202 static bool IsRightType(CTag
* tag
)
204 return tag
->IsBlob();
207 static BLOBValue
GetValue(CTag
* tag
)
209 return BLOBValue(tag
->GetBlobSize(), tag
->GetBlob());
214 struct CTagAccess
<BSOBValue
>
216 static bool IsRightType(CTag
* tag
)
218 return tag
->IsBsob();
221 static BSOBValue
GetValue(CTag
* tag
) {
222 return BSOBValue(tag
->GetBsobSize(), tag
->GetBsob());
227 void CheckTagValue(V tagValue
, CTag
* tag
)
229 CONTEXT(wxT("Check tag value"));
231 AssertEquals(tagValue
, CTagAccess
< V
>::GetValue(tag
));
235 void CheckTagType(V
, CTag
* tag
)
237 CONTEXT(wxT("Check tag type"));
238 ASSERT_EQUALS(true, CTagAccess
<V
>::IsRightType(tag
));
241 template<class V
, class TName
>
242 void CheckTagData(CTag
* tag
, TName tagName
, const V
& tagValue
)
244 CONTEXT(wxT("Expected tag value:") + toString(tagValue
));
245 CONTEXT(wxT("Parsed tag info:") + tag
->GetFullInfo());
247 CheckTagType(tagValue
, tag
);
248 CheckTagName(tagName
, tag
);
249 CheckTagValue(valid_tag_value(tagValue
), tag
);
252 void test_taglist_serialization(TagPtrList
& taglist
, byte
* packet
, uint64 packet_len
)
257 CONTEXT(wxT("Writing taglist to CMemFile"));
259 fout
.WriteTagPtrList(taglist
);
263 fout
.Seek(0, wxFromStart
);
266 CONTEXT(wxT("Check taglist serialization length"));
267 ASSERT_EQUALS(packet_len
, fout
.GetLength());
270 std::vector
<byte
> buf(packet_len
);
273 CONTEXT(wxT("Reading back serialized taglist bytes from CMemFile"));
274 fout
.Read(&buf
[0], packet_len
);
277 for (uint64 i
= 0; i
< packet_len
; i
++) {
278 CONTEXT(wxString::Format(wxT("Comparing serialized byte #%d"), i
));
280 ASSERT_EQUALS(packet
[i
], buf
[i
]);
284 void ReadTagPtrList(TagPtrList
& taglist
, byte
* packet
, uint64 packet_len
)
287 CONTEXT(wxT("Reading taglist from buffer"));
288 CMemFile
fin(packet
, packet_len
);
289 fin
.ReadTagPtrList(&taglist
, true);
292 CONTEXT(wxT("Verify position is at end of packet"));
293 ASSERT_EQUALS(packet_len
, fin
.GetPosition());
297 TEST_M(CTag
, ReadTagList1
, wxT("Kad: Parse taglist from Kad packet with UTF8 string #1"))
301 /*Tag1*/ 0x02, 0x01, 0x00, 0x01, 0x22, 0x00, 0x47, 0x65, 0x6d, 0x20, 0x42, 0x6f, 0x79, 0x20, 0x2d,
302 0x20, 0x53, 0x61, 0x72, 0xc3, 0xa0, 0x20, 0x70, 0x65, 0x72, 0x63, 0x68, 0xc3, 0xa8, 0x20, 0x74,
303 0x69, 0x20, 0x61, 0x6d, 0x6f, 0x2e, 0x6d, 0x70, 0x33,
304 /*Tag2*/ 0x03, 0x01, 0x00, 0x02, 0x1d, 0x6f, 0x1f, 0x00,
305 /*Tag3*/ 0x09, 0x01, 0x00, 0x15, 0x01,
306 /*Tag4*/ 0x02, 0x01, 0x00, 0x03, 0x05, 0x00, 0x41, 0x75, 0x64, 0x69, 0x6f,
307 /*Tag5*/ 0x09, 0x01, 0x00, 0xd3, 0x6b,
308 /*Tag6*/ 0x09, 0x01, 0x00, 0xd4, 0x9a,
309 /*Tag7*/ 0x03, 0x01, 0x00, 0x33, 0x2f, 0x00, 0x01, 0x01
313 ReadTagPtrList(taglist
, packet
, sizeof (packet
));
314 TagPtrList::iterator it
= taglist
.begin();
316 CheckTagData(*it
++, TAG_FILENAME
, valid_tag_value(wxT("Gem Boy - Sarà perchè ti amo.mp3")));
317 CheckTagData(*it
++, TAG_FILESIZE
, valid_tag_value(2060061));
318 CheckTagData(*it
++, TAG_SOURCES
, valid_tag_value(1));
319 CheckTagData(*it
++, TAG_FILETYPE
, valid_tag_value(ED2KFTSTR_AUDIO
));
320 CheckTagData(*it
++, TAG_MEDIA_LENGTH
, valid_tag_value(107));
321 CheckTagData(*it
++, TAG_MEDIA_BITRATE
, valid_tag_value(154));
322 CheckTagData(*it
++, TAG_PUBLISHINFO
, valid_tag_value(16842799));
324 ASSERT_TRUE(it
== taglist
.end());
325 test_taglist_serialization(taglist
, packet
, sizeof (packet
));
326 deleteTagPtrListEntries(&taglist
);
329 TEST_M(CTag
, ReadTagList2
, wxT("Kad: Parse taglist from Kad packet with UTF8 string #2"))
333 /*Tag1*/0x02, 0x01, 0x00, 0x01, 0x33, 0x00, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61,
334 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x31,
335 0x38, 0x39, 0x33, 0x2d, 0xe2, 0x82, 0xac, 0xe2, 0x82, 0xac, 0xc3, 0xa8, 0xc3, 0xa9, 0xc3, 0xa7,
336 0xc3, 0xa0, 0xc3, 0xb9, 0xc2, 0xa7, 0x2e, 0x74, 0x78, 0x74,
337 /*Tag2*/0x09, 0x01, 0x00, 0x02, 0x0d,
338 /*Tag3*/0x09, 0x01, 0x00, 0x15, 0x00,
339 /*Tag4*/0x02, 0x01, 0x00, 0x03, 0x03, 0x00, 0x44, 0x6f, 0x63, 0x03, 0x01, 0x00,
340 0x33, 0xe8, 0x03, 0x01, 0x01
344 ReadTagPtrList(taglist
, packet
, sizeof (packet
));
345 TagPtrList::iterator it
= taglist
.begin();
347 CheckTagData(*it
++, TAG_FILENAME
, valid_tag_value(wxT("Serialization Test File 1893-€€èéçà ù§.txt")));
348 CheckTagData(*it
++, TAG_FILESIZE
, valid_tag_value(13));
349 CheckTagData(*it
++, TAG_SOURCES
, valid_tag_value(0));
350 CheckTagData(*it
++, TAG_FILETYPE
, valid_tag_value(ED2KFTSTR_DOCUMENT
));
351 CheckTagData(*it
++, TAG_PUBLISHINFO
, valid_tag_value(16843752));
353 ASSERT_TRUE(it
== taglist
.end());
354 test_taglist_serialization(taglist
, packet
, sizeof (packet
));
355 deleteTagPtrListEntries(&taglist
);
359 TEST_M(CTag
, Float
, wxT("Kad: Read/Write floats"))
363 /*Tag1*/0x04, 0x01, 0x00, 0xFF, 0x79, 0xe9, 0xf6, 0x42,
364 /*Tag2*/0x04, 0x01, 0x00, 0xFF, 0x79, 0xd9, 0xd6, 0x42,
368 ReadTagPtrList(taglist
, packet
, sizeof (packet
));
369 TagPtrList::iterator it
= taglist
.begin();
371 CheckTagData(*it
++, TAG_SOURCETYPE
, valid_tag_value((float) 123.456));
372 CheckTagData(*it
++, TAG_SOURCETYPE
, valid_tag_value((float) 107.424751));
374 ASSERT_TRUE(it
== taglist
.end());
375 test_taglist_serialization(taglist
, packet
, sizeof (packet
));
376 deleteTagPtrListEntries(&taglist
);
379 TEST_M(CTag
, CMD4Hash
, wxT("Kad: Read/Write CMD4Hash"))
385 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
386 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
390 ReadTagPtrList(taglist
, packet
, sizeof (packet
));
391 TagPtrList::iterator it
= taglist
.begin();
394 ASSERT_TRUE(hash
.Decode("000102030405060708090A0B0C0D0E0F"));
396 CheckTagData(*it
++, TAG_SOURCETYPE
, valid_tag_value(hash
));
398 ASSERT_TRUE(it
== taglist
.end());
399 test_taglist_serialization(taglist
, packet
, sizeof (packet
));
400 deleteTagPtrListEntries(&taglist
);
403 template<class T
, class V
>
404 void check_single_kad_tag(byte
* packet
, size_t packet_len
, T tagName
, V tagValue
)
406 CMemFile
buf(packet
, packet_len
);
407 CONTEXT(wxT("Starting buffer: ") + toString(buf
));
408 CTag
* tag
= buf
.ReadTag(true);
410 CheckTagData(tag
, tagName
, valid_tag_value(tagValue
));
412 CONTEXT(wxT("Check end of buffer"));
413 ASSERT_EQUALS(packet_len
, buf
.GetPosition());
418 newbuf
.WriteTag(*tag
);
420 CONTEXT(wxT("Serialized : ") + toString(newbuf
));
422 newbuf
.Seek(0, wxFromStart
);
423 for (size_t i
= 0; i
< packet_len
; i
++) {
424 CONTEXT(wxString::Format(wxT("Comparing byte #%d"), i
));
426 ASSERT_EQUALS(packet
[i
], newbuf
.ReadUInt8());
429 ASSERT_EQUALS(packet_len
, buf
.GetPosition());
434 TEST_M(CTag
, KadBsob
, wxT("Kad: Read/Write BSOB"))
437 /*Tag1*/ 0x0A, 0x01, 0x00, 0x02, 0x04, 0x01, 0x02, 0x03, 0x04,
439 byte raw_data
[] = {0x01, 0x02, 0x03, 0x04};
441 CONTEXT(wxT("Create BSOBValue"));
442 BSOBValue
bsob(sizeof (raw_data
), raw_data
);
444 CONTEXT(wxT("check_single_kad_tag BSOBValue"));
445 check_single_kad_tag(packet
, sizeof (packet
), TAG_FILESIZE
, bsob
);
449 TEST_M(CTag
, KadInt64
, wxT("Kad: Read/Write integer 64bit"))
452 /*Tag1*/ 0x0b, 0x01, 0x00, 0x02, 0x10, 0x11, 0x12, 0x13, 0x20, 0x21, 0x22, 0x23, // 64 bit int
454 check_single_kad_tag(packet
, sizeof (packet
), TAG_FILESIZE
, 0x2322212013121110LL
);
457 TEST_M(CTag
, KadInt32
, wxT("Kad: Read/Write integer 32bit"))
460 /*Tag1*/ 0x03, 0x01, 0x00, 0x02, 0x12, 0x34, 0x56, 0x78, // 32 bit int
462 check_single_kad_tag(packet
, sizeof (packet
), TAG_FILESIZE
, 0x78563412);
465 TEST_M(CTag
, KadInt16
, wxT("Kad: Read/Write integer 16bit"))
468 /*Tag1*/ 0x08, 0x01, 0x00, 0x02, 0x12, 0x34, // 16 bit int
470 check_single_kad_tag(packet
, sizeof (packet
), TAG_FILESIZE
, 0x3412);
473 TEST_M(CTag
, KadInt8
, wxT("Kad: Read/Write integer 8bit"))
476 /*Tag1*/ 0x09, 0x01, 0x00, 0x02, 0x12, // 8 bit int
478 check_single_kad_tag(packet
, sizeof (packet
), TAG_FILESIZE
, 0x12);
481 TEST_M(CTag
, ReadIntegers
, wxT("Kad: Read/Write multiple integers"))
485 /*Tag1*/ 0x03, 0x01, 0x00, 0x02, 0x12, 0x34, 0x56, 0x78, // 32 bit int
486 /*Tag2*/ 0x08, 0x01, 0x00, 0x02, 0x12, 0x34, // 16 bit int
487 /*Tag3*/ 0x09, 0x01, 0x00, 0x02, 0x12, // 8 bit int
488 /*Tag4*/ 0x0b, 0x01, 0x00, 0x02, 0x10, 0x11, 0x12, 0x13, 0x20, 0x21, 0x22, 0x23, // 64 bit int
490 /*Tag5*/ 0x03, 0x01, 0x00, 0x02, 0x12, 0x34, 0x56, 0x78, // 32 bit int
491 /*Tag6*/ 0x08, 0x01, 0x00, 0x02, 0x12, 0x34, // 16 bit int
492 /*Tag7*/ 0x09, 0x01, 0x00, 0x02, 0x12, // 8 bit int
493 /*Tag8*/ 0x0b, 0x01, 0x00, 0x02, 0x10, 0x11, 0x12, 0x13, 0x20, 0x21, 0x22, 0x23, // 64 bit int
497 ReadTagPtrList(taglist
, packet
, sizeof (packet
));
498 TagPtrList::iterator it
= taglist
.begin();
500 CheckTagData(*it
++, TAG_FILESIZE
, valid_tag_value(0x78563412));
501 CheckTagData(*it
++, TAG_FILESIZE
, valid_tag_value(0x3412));
502 CheckTagData(*it
++, TAG_FILESIZE
, valid_tag_value(0x12));
503 CheckTagData(*it
++, TAG_FILESIZE
, valid_tag_value(0x2322212013121110LL
));
505 CheckTagData(*it
++, TAG_FILESIZE
, valid_tag_value(0x78563412));
506 CheckTagData(*it
++, TAG_FILESIZE
, valid_tag_value(0x3412));
507 CheckTagData(*it
++, TAG_FILESIZE
, valid_tag_value(0x12));
508 CheckTagData(*it
++, TAG_FILESIZE
, valid_tag_value(0x2322212013121110LL
));
510 ASSERT_TRUE(it
== taglist
.end());
511 test_taglist_serialization(taglist
, packet
, sizeof (packet
));
512 deleteTagPtrListEntries(&taglist
);
518 typedef std::map
<wxString
, wxString
> TagNamesByString
;
520 TEST_M(CTag
, KadTagNames
, wxT("Kad: Test Kad tags (name=string) - write/read every valid tag name"))
522 TagNamesByString tagNames
;
524 tagNames
[TAG_FILENAME
] = wxT("TAG_FILENAME");
525 tagNames
[TAG_FILESIZE
] = wxT("TAG_FILESIZE");
526 tagNames
[TAG_FILESIZE_HI
] = wxT("TAG_FILESIZE_HI");
527 tagNames
[TAG_FILETYPE
] = wxT("TAG_FILETYPE");
528 tagNames
[TAG_FILEFORMAT
] = wxT("TAG_FILEFORMAT");
529 tagNames
[TAG_COLLECTION
] = wxT("TAG_COLLECTION");
530 tagNames
[TAG_PART_PATH
] = wxT("TAG_PART_PATH");
531 tagNames
[TAG_PART_HASH
] = wxT("TAG_PART_HASH");
532 tagNames
[TAG_COPIED
] = wxT("TAG_COPIED");
533 tagNames
[TAG_GAP_START
] = wxT("TAG_GAP_START");
534 tagNames
[TAG_GAP_END
] = wxT("TAG_GAP_END");
535 tagNames
[TAG_DESCRIPTION
] = wxT("TAG_DESCRIPTION");
536 tagNames
[TAG_PING
] = wxT("TAG_PING");
537 tagNames
[TAG_FAIL
] = wxT("TAG_FAIL");
538 tagNames
[TAG_PREFERENCE
] = wxT("TAG_PREFERENCE");
539 tagNames
[TAG_PORT
] = wxT("TAG_PORT");
540 tagNames
[TAG_IP_ADDRESS
] = wxT("TAG_IP_ADDRESS");
541 tagNames
[TAG_VERSION
] = wxT("TAG_VERSION");
542 tagNames
[TAG_TEMPFILE
] = wxT("TAG_TEMPFILE");
543 tagNames
[TAG_PRIORITY
] = wxT("TAG_PRIORITY");
544 tagNames
[TAG_STATUS
] = wxT("TAG_STATUS");
545 tagNames
[TAG_SOURCES
] = wxT("TAG_SOURCES");
546 tagNames
[TAG_AVAILABILITY
] = wxT("TAG_AVAILABILITY");
547 tagNames
[TAG_PERMISSIONS
] = wxT("TAG_PERMISSIONS");
548 tagNames
[TAG_QTIME
] = wxT("TAG_QTIME");
549 tagNames
[TAG_PARTS
] = wxT("TAG_PARTS");
550 tagNames
[TAG_PUBLISHINFO
] = wxT("TAG_PUBLISHINFO");
551 tagNames
[TAG_MEDIA_ARTIST
] = wxT("TAG_MEDIA_ARTIST");
552 tagNames
[TAG_MEDIA_ALBUM
] = wxT("TAG_MEDIA_ALBUM");
553 tagNames
[TAG_MEDIA_TITLE
] = wxT("TAG_MEDIA_TITLE");
554 tagNames
[TAG_MEDIA_LENGTH
] = wxT("TAG_MEDIA_LENGTH");
555 tagNames
[TAG_MEDIA_BITRATE
] = wxT("TAG_MEDIA_BITRATE");
556 tagNames
[TAG_MEDIA_CODEC
] = wxT("TAG_MEDIA_CODEC");
557 tagNames
[TAG_KADMISCOPTIONS
] = wxT("TAG_KADMISCOPTIONS");
558 tagNames
[TAG_ENCRYPTION
] = wxT("TAG_ENCRYPTION");
559 tagNames
[TAG_FILERATING
] = wxT("TAG_FILERATING");
560 tagNames
[TAG_BUDDYHASH
] = wxT("TAG_BUDDYHASH");
561 tagNames
[TAG_CLIENTLOWID
] = wxT("TAG_CLIENTLOWID");
562 tagNames
[TAG_SERVERPORT
] = wxT("TAG_SERVERPORT");
563 tagNames
[TAG_SERVERIP
] = wxT("TAG_SERVERIP");
564 tagNames
[TAG_SOURCEUPORT
] = wxT("TAG_SOURCEUPORT");
565 tagNames
[TAG_SOURCEPORT
] = wxT("TAG_SOURCEPORT");
566 tagNames
[TAG_SOURCEIP
] = wxT("TAG_SOURCEIP");
567 tagNames
[TAG_SOURCETYPE
] = wxT("TAG_SOURCETYPE");
570 buf
.WriteUInt8(tagNames
.size());
572 // For each tagNames entry write an 8bit int tag (type:0x9)
573 for (TagNamesByString::iterator it_name
= tagNames
.begin(); it_name
!= tagNames
.end(); it_name
++) {
574 buf
.WriteUInt8(0x09); // 8 bit int tag type
576 buf
.WriteUInt8(0x01); // single char string
577 buf
.WriteUInt8(0x00); //
579 buf
.WriteUInt8(it_name
->first
.GetChar(0)); // Write string first char
580 buf
.WriteUInt8(counter
++); // write tag value
584 buf
.Seek(0, wxFromStart
);
585 size_t packet_len
= buf
.GetLength();
586 std::vector
<byte
> packet(packet_len
);
587 buf
.Read(&packet
[0], packet_len
);
589 ReadTagPtrList(taglist
, &packet
[0], packet_len
);
591 TagPtrList::iterator it
= taglist
.begin();
594 for (TagNamesByString::iterator it_name
= tagNames
.begin(); it_name
!= tagNames
.end(); it_name
++) {
595 CONTEXT(wxT("Testing tag name: ") + it_name
->second
);
596 CheckTagData(*it
++, it_name
->first
, valid_tag_value(counter
++));
599 ASSERT_TRUE(it
== taglist
.end());
600 test_taglist_serialization(taglist
, &packet
[0], packet_len
);
601 deleteTagPtrListEntries(&taglist
);
604 typedef std::map
<int, wxString
> TagNamesByInt
;
606 TEST_M(CTag
, ED2kTagNames
, wxT("Ed2k: Test ed2k tags (name=id) - write/read every valid tag name"))
608 TagNamesByInt tagNames
;
610 tagNames
[FT_FILENAME
] = wxT("FT_FILENAME");
611 tagNames
[FT_FILESIZE
] = wxT("FT_FILESIZE");
612 tagNames
[FT_FILESIZE_HI
] = wxT("FT_FILESIZE_HI");
613 tagNames
[FT_FILETYPE
] = wxT("FT_FILETYPE");
614 tagNames
[FT_FILEFORMAT
] = wxT("FT_FILEFORMAT");
615 tagNames
[FT_LASTSEENCOMPLETE
] = wxT("FT_LASTSEENCOMPLETE");
616 tagNames
[FT_TRANSFERRED
] = wxT("FT_TRANSFERRED");
617 tagNames
[FT_GAPSTART
] = wxT("FT_GAPSTART");
618 tagNames
[FT_GAPEND
] = wxT("FT_GAPEND");
619 tagNames
[FT_PARTFILENAME
] = wxT("FT_PARTFILENAME");
620 tagNames
[FT_OLDDLPRIORITY
] = wxT("FT_OLDDLPRIORITY");
621 tagNames
[FT_STATUS
] = wxT("FT_STATUS");
622 tagNames
[FT_SOURCES
] = wxT("FT_SOURCES");
623 tagNames
[FT_PERMISSIONS
] = wxT("FT_PERMISSIONS");
624 tagNames
[FT_OLDULPRIORITY
] = wxT("FT_OLDULPRIORITY");
625 tagNames
[FT_DLPRIORITY
] = wxT("FT_DLPRIORITY");
626 tagNames
[FT_ULPRIORITY
] = wxT("FT_ULPRIORITY");
627 tagNames
[FT_KADLASTPUBLISHKEY
] = wxT("FT_KADLASTPUBLISHKEY");
628 tagNames
[FT_KADLASTPUBLISHSRC
] = wxT("FT_KADLASTPUBLISHSRC");
629 tagNames
[FT_FLAGS
] = wxT("FT_FLAGS");
630 tagNames
[FT_DL_ACTIVE_TIME
] = wxT("FT_DL_ACTIVE_TIME");
631 tagNames
[FT_CORRUPTEDPARTS
] = wxT("FT_CORRUPTEDPARTS");
632 tagNames
[FT_DL_PREVIEW
] = wxT("FT_DL_PREVIEW");
633 tagNames
[FT_KADLASTPUBLISHNOTES
] = wxT("FT_KADLASTPUBLISHNOTES");
634 tagNames
[FT_AICH_HASH
] = wxT("FT_AICH_HASH");
635 tagNames
[FT_COMPLETE_SOURCES
] = wxT("FT_COMPLETE_SOURCES");
636 tagNames
[FT_PUBLISHINFO
] = wxT("FT_PUBLISHINFO");
637 tagNames
[FT_ATTRANSFERRED
] = wxT("FT_ATTRANSFERRED");
638 tagNames
[FT_ATREQUESTED
] = wxT("FT_ATREQUESTED");
639 tagNames
[FT_ATACCEPTED
] = wxT("FT_ATACCEPTED");
640 tagNames
[FT_CATEGORY
] = wxT("FT_CATEGORY");
641 tagNames
[FT_ATTRANSFERREDHI
] = wxT("FT_ATTRANSFERREDHI");
642 tagNames
[FT_MEDIA_ARTIST
] = wxT("FT_MEDIA_ARTIST");
643 tagNames
[FT_MEDIA_ALBUM
] = wxT("FT_MEDIA_ALBUM");
644 tagNames
[FT_MEDIA_TITLE
] = wxT("FT_MEDIA_TITLE");
645 tagNames
[FT_MEDIA_LENGTH
] = wxT("FT_MEDIA_LENGTH");
646 tagNames
[FT_MEDIA_BITRATE
] = wxT("FT_MEDIA_BITRATE");
647 tagNames
[FT_MEDIA_CODEC
] = wxT("FT_MEDIA_CODEC");
648 tagNames
[FT_FILERATING
] = wxT("FT_FILERATING");
654 for (TagNamesByInt::iterator it_name
= tagNames
.begin(); it_name
!= tagNames
.end(); it_name
++) {
656 buf
.WriteUInt8(0x09 + 0x80);
658 buf
.WriteUInt8(it_name
->first
);
660 buf
.WriteUInt8(counter
++);
663 buf
.Seek(0, wxFromStart
);
666 for (TagNamesByInt::iterator it_name
= tagNames
.begin(); it_name
!= tagNames
.end(); it_name
++) {
667 CONTEXT(wxString::Format(wxT("Reading tag#%d"), counter
));
668 CTag
* newtag
= new CTag(buf
, true);
669 CheckTagName(it_name
->first
, newtag
);
670 CheckTagValue( valid_tag_value( counter
), newtag
);
676 TEST_M(CTag
, Ed2kBlob1
, wxT("Ed2k: Read/Write BLOB - numeric tagname"))
679 /*Tag1*/ 0x87, 0xFF, 0x04, 0x00, 0x00, 0x00,
680 0x01, 0x02, 0x03, 0x04,
683 CMemFile
buf(packet
, sizeof (packet
));
684 buf
.Seek(0, wxFromStart
);
685 byte raw_data
[] = {0x01, 0x02, 0x03, 0x04};
687 CONTEXT(wxT("Create BLOBValue"));
688 BLOBValue
blob(sizeof (raw_data
), raw_data
);
691 CheckTagName(0xFF, &tag
);
692 CheckTagValue( valid_tag_value( blob
), &tag
);
696 TEST_M(CTag
, Ed2kBlob2
, wxT("Ed2k: Read/Write BLOB - string tagname"))
699 /*Tag1*/ 0x07, 0x02, 0x00, 'A', 'A', 0x04, 0x00, 0x00, 0x00,
700 0x01, 0x02, 0x03, 0x04,
703 CMemFile
buf(packet
, sizeof (packet
));
704 buf
.Seek(0, wxFromStart
);
705 byte raw_data
[] = {0x01, 0x02, 0x03, 0x04};
707 CONTEXT(wxT("Create BLOBValue"));
708 BLOBValue
blob(sizeof (raw_data
), raw_data
);
711 CheckTagName(wxT("AA"), &tag
);
712 CheckTagValue( valid_tag_value( blob
), &tag
);