1 /*
2 * Copyright 2017, Andrew Lindesay <apl@lindesay.co.nz>.
3 * All rights reserved. Distributed under the terms of the MIT License.
4 */
5
6 #include "StandardMetaData.h"
7 #include "StandardMetaDataJsonEventListener.h"
8 #include "StandardMetaDataJsonEventListenerTest.h"
9
10 #include <stdio.h>
11
12 #include <AutoDeleter.h>
13 #include <Json.h>
14
15 #include <cppunit/TestCaller.h>
16 #include <cppunit/TestSuite.h>
17
18
19 #define INPUT_TOP_LEVEL "{\"createTimestamp\":123456," \
20 "\"dataModifiedTimestamp\":789012}"
21
22 // This example is from the HDS server and comes back as part of the icons
23 // bundle; real-world example.
24
25 #define INPUT_ICON "{\"createTimestamp\":1501456139480," \
26 "\"createTimestampIso\":\"2017-07-30 23:08:59\"," \
27 "\"dataModifiedTimestamp\":1500536391000," \
28 "\"dataModifiedTimestampIso\":\"2017-07-20 07:39:51\"," \
29 "\"agent\":\"hds\"," \
30 "\"agentVersion\":\"1.0.86\"" \
31 "}"
32
33 #define INPUT_THIRD_LEVEL "{" \
34 "\"createTimestamp\":99999," \
35 "\"gonk\":{\"zink\":[ 123, { \"a\":\"b\" } ]}\n," \
36 "\"rink\":{" \
37 "\"tonk\":{" \
38 "\"createTimestamp\":665544," \
39 "\"dataModifiedTimestamp\":554433" \
40 "}" \
41 "}," \
42 "\"cake\": { \"type\": \"bananas\" }," \
43 "\"createTimestamp\":99999," \
44 "}"
45
46 #define INPUT_BROKEN "{\"broken\",,"
47
48
StandardMetaDataJsonEventListenerTest()49 StandardMetaDataJsonEventListenerTest::StandardMetaDataJsonEventListenerTest()
50 {
51 }
52
53
~StandardMetaDataJsonEventListenerTest()54 StandardMetaDataJsonEventListenerTest::~StandardMetaDataJsonEventListenerTest()
55 {
56 }
57
58
59 void
TestGeneric(const char * input,const char * jsonPath,status_t expectedStatus,uint64_t expectedCreateTimestamp,uint64_t expectedDataModifiedTimestamp)60 StandardMetaDataJsonEventListenerTest::TestGeneric(
61 const char* input, const char* jsonPath, status_t expectedStatus,
62 uint64_t expectedCreateTimestamp, uint64_t expectedDataModifiedTimestamp)
63 {
64 StandardMetaData metaData;
65 StandardMetaDataJsonEventListener listener(jsonPath, metaData);
66
67 BDataIO* inputData = new BMemoryIO(input, strlen(input));
68 ObjectDeleter<BDataIO> inputDataDeleter(inputData);
69 BMallocIO* outputData = new BMallocIO();
70 ObjectDeleter<BMallocIO> outputDataDeleter(outputData);
71
72 // ----------------------
73 BPrivate::BJson::Parse(inputData, &listener);
74 // ----------------------
75
76 CPPUNIT_ASSERT_EQUAL(expectedStatus, listener.ErrorStatus());
77 CPPUNIT_ASSERT_EQUAL(expectedCreateTimestamp,
78 metaData.GetCreateTimestamp());
79 CPPUNIT_ASSERT_EQUAL(expectedDataModifiedTimestamp,
80 metaData.GetDataModifiedTimestamp());
81 }
82
83
84 void
TestTopLevel()85 StandardMetaDataJsonEventListenerTest::TestTopLevel()
86 {
87 TestGeneric(INPUT_TOP_LEVEL, "$", B_OK, 123456L, 789012L);
88 }
89
90
91 void
TestIcon()92 StandardMetaDataJsonEventListenerTest::TestIcon()
93 {
94 TestGeneric(INPUT_ICON, "$", B_OK, 1501456139480ULL, 1500536391000ULL);
95 }
96
97
98 void
TestThirdLevel()99 StandardMetaDataJsonEventListenerTest::TestThirdLevel()
100 {
101 TestGeneric(INPUT_THIRD_LEVEL, "$.rink.tonk", B_OK, 665544L, 554433L);
102 }
103
104
105 void
TestBroken()106 StandardMetaDataJsonEventListenerTest::TestBroken()
107 {
108 TestGeneric(INPUT_BROKEN, "$", B_BAD_DATA, 0L, 0L);
109 }
110
111
112 /*static*/ void
AddTests(BTestSuite & parent)113 StandardMetaDataJsonEventListenerTest::AddTests(BTestSuite& parent)
114 {
115 CppUnit::TestSuite& suite = *new CppUnit::TestSuite(
116 "StandardMetaDataJsonEventListenerTest");
117
118 suite.addTest(
119 new CppUnit::TestCaller<StandardMetaDataJsonEventListenerTest>(
120 "StandardMetaDataJsonEventListenerTest::TestTopLevel",
121 &StandardMetaDataJsonEventListenerTest::TestTopLevel));
122
123 suite.addTest(
124 new CppUnit::TestCaller<StandardMetaDataJsonEventListenerTest>(
125 "StandardMetaDataJsonEventListenerTest::TestIcon",
126 &StandardMetaDataJsonEventListenerTest::TestIcon));
127
128 suite.addTest(
129 new CppUnit::TestCaller<StandardMetaDataJsonEventListenerTest>(
130 "StandardMetaDataJsonEventListenerTest::TestThirdLevel",
131 &StandardMetaDataJsonEventListenerTest::TestThirdLevel));
132
133 suite.addTest(
134 new CppUnit::TestCaller<StandardMetaDataJsonEventListenerTest>(
135 "StandardMetaDataJsonEventListenerTest::TestBroken",
136 &StandardMetaDataJsonEventListenerTest::TestBroken));
137
138 parent.addTest("StandardMetaDataJsonEventListenerTest", &suite);
139 }