1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/memory/scoped_ptr.h"
6 #include "base/values.h"
7 #include "device/nfc/nfc_ndef_record.h"
8 #include "testing/gtest/include/gtest/gtest.h"
10 using base::DictionaryValue
;
11 using base::ListValue
;
12 using base::StringValue
;
18 const char kTestAction
[] = "test-action";
19 const char kTestEncoding
[] = "test-encoding";
20 const char kTestLanguageCode
[] = "test-language-code";
21 const char kTestMimeType
[] = "test-mime-type";
22 const uint32 kTestTargetSize
= 0;
23 const char kTestText
[] = "test-text";
24 const char kTestURI
[] = "test://uri";
28 TEST(NfcNdefRecordTest
, PopulateTextRecord
) {
30 scoped_ptr
<NfcNdefRecord
> record(new NfcNdefRecord());
32 // Missing text field. Should fail.
33 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeText
, &data
));
34 EXPECT_FALSE(record
->IsPopulated());
36 // Text field with incorrect type. Should fail.
37 data
.SetInteger(NfcNdefRecord::kFieldText
, 0);
38 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeText
, &data
));
39 EXPECT_FALSE(record
->IsPopulated());
41 // Text field with correct type but missing encoding and language.
43 data
.SetString(NfcNdefRecord::kFieldText
, kTestText
);
44 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeText
, &data
));
45 EXPECT_FALSE(record
->IsPopulated());
47 // Populating a successfully populated record should fail.
48 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeText
, &data
));
50 // Incorrect type for language code.
51 data
.SetInteger(NfcNdefRecord::kFieldLanguageCode
, 0);
52 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeText
, &data
));
53 EXPECT_FALSE(record
->IsPopulated());
55 // Correct type for language code, invalid encoding.
56 data
.SetString(NfcNdefRecord::kFieldLanguageCode
, kTestLanguageCode
);
57 data
.SetInteger(NfcNdefRecord::kFieldEncoding
, 0);
58 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeText
, &data
));
59 EXPECT_FALSE(record
->IsPopulated());
61 // All entries valid. Should succeed.
62 data
.SetString(NfcNdefRecord::kFieldEncoding
, kTestEncoding
);
63 EXPECT_TRUE(record
->Populate(NfcNdefRecord::kTypeText
, &data
));
64 EXPECT_TRUE(record
->IsPopulated());
65 EXPECT_EQ(NfcNdefRecord::kTypeText
, record
->type());
67 // Compare record contents.
68 std::string string_value
;
69 EXPECT_TRUE(record
->data().GetString(
70 NfcNdefRecord::kFieldText
, &string_value
));
71 EXPECT_EQ(kTestText
, string_value
);
72 EXPECT_TRUE(record
->data().GetString(
73 NfcNdefRecord::kFieldLanguageCode
, &string_value
));
74 EXPECT_EQ(kTestLanguageCode
, string_value
);
75 EXPECT_TRUE(record
->data().GetString(
76 NfcNdefRecord::kFieldEncoding
, &string_value
));
77 EXPECT_EQ(kTestEncoding
, string_value
);
80 TEST(NfcNdefRecordTest
, PopulateUriRecord
) {
82 scoped_ptr
<NfcNdefRecord
> record(new NfcNdefRecord());
84 // Missing URI field. Should fail.
85 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeURI
, &data
));
86 EXPECT_FALSE(record
->IsPopulated());
88 // URI field with incorrect type. Should fail.
89 data
.SetInteger(NfcNdefRecord::kFieldURI
, 0);
90 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeURI
, &data
));
91 EXPECT_FALSE(record
->IsPopulated());
93 // URI field with correct type but invalid format.
94 data
.SetString(NfcNdefRecord::kFieldURI
, "test.uri");
95 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeURI
, &data
));
96 EXPECT_FALSE(record
->IsPopulated());
98 data
.SetString(NfcNdefRecord::kFieldURI
, kTestURI
);
99 EXPECT_TRUE(record
->Populate(NfcNdefRecord::kTypeURI
, &data
));
100 EXPECT_TRUE(record
->IsPopulated());
101 EXPECT_EQ(NfcNdefRecord::kTypeURI
, record
->type());
103 // Populating a successfully populated record should fail.
104 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeURI
, &data
));
106 // Recycle the record.
107 record
.reset(new NfcNdefRecord());
108 EXPECT_FALSE(record
->IsPopulated());
110 // Incorrect optional fields. Should fail.
111 data
.SetInteger(NfcNdefRecord::kFieldMimeType
, 0);
112 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeURI
, &data
));
113 EXPECT_FALSE(record
->IsPopulated());
115 data
.SetString(NfcNdefRecord::kFieldMimeType
, kTestMimeType
);
116 data
.SetInteger(NfcNdefRecord::kFieldTargetSize
, kTestTargetSize
);
117 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeURI
, &data
));
118 EXPECT_FALSE(record
->IsPopulated());
120 // Optional fields are correct. Should succeed.
121 data
.SetDouble(NfcNdefRecord::kFieldTargetSize
,
122 static_cast<double>(kTestTargetSize
));
123 EXPECT_TRUE(record
->Populate(NfcNdefRecord::kTypeURI
, &data
));
124 EXPECT_TRUE(record
->IsPopulated());
125 EXPECT_EQ(NfcNdefRecord::kTypeURI
, record
->type());
127 // Compare record contents.
128 std::string string_value
;
130 EXPECT_TRUE(record
->data().GetString(
131 NfcNdefRecord::kFieldURI
, &string_value
));
132 EXPECT_EQ(kTestURI
, string_value
);
133 EXPECT_TRUE(record
->data().GetString(
134 NfcNdefRecord::kFieldMimeType
, &string_value
));
135 EXPECT_EQ(kTestMimeType
, string_value
);
136 EXPECT_TRUE(record
->data().GetDouble(
137 NfcNdefRecord::kFieldTargetSize
, &double_value
));
138 EXPECT_EQ(kTestTargetSize
, static_cast<uint32
>(double_value
));
141 TEST(NfcNdefRecordTest
, PopulateSmartPoster
) {
142 DictionaryValue data
;
143 scoped_ptr
<NfcNdefRecord
> record(new NfcNdefRecord());
145 // Missing URI field. Should fail.
146 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeSmartPoster
, &data
));
147 EXPECT_FALSE(record
->IsPopulated());
149 // URI field with incorrect entry. Should fail.
150 data
.SetInteger(NfcNdefRecord::kFieldURI
, 0);
151 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeSmartPoster
, &data
));
152 EXPECT_FALSE(record
->IsPopulated());
154 // URI field with correct entry. Should succeed.
155 data
.SetString(NfcNdefRecord::kFieldURI
, kTestURI
);
156 EXPECT_TRUE(record
->Populate(NfcNdefRecord::kTypeSmartPoster
, &data
));
157 EXPECT_TRUE(record
->IsPopulated());
158 EXPECT_EQ(NfcNdefRecord::kTypeSmartPoster
, record
->type());
160 // Populating a successfully populated record should fail.
161 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeSmartPoster
, &data
));
163 // Recycle the record.
164 record
.reset(new NfcNdefRecord());
165 EXPECT_FALSE(record
->IsPopulated());
167 // Incorrect optional fields. Should fail.
168 data
.SetInteger(NfcNdefRecord::kFieldAction
, 0);
169 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeSmartPoster
, &data
));
170 EXPECT_FALSE(record
->IsPopulated());
172 data
.SetString(NfcNdefRecord::kFieldAction
, kTestAction
);
173 data
.SetInteger(NfcNdefRecord::kFieldMimeType
, 0);
174 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeSmartPoster
, &data
));
175 EXPECT_FALSE(record
->IsPopulated());
177 data
.SetString(NfcNdefRecord::kFieldMimeType
, kTestMimeType
);
178 data
.SetInteger(NfcNdefRecord::kFieldTargetSize
, kTestTargetSize
);
179 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeSmartPoster
, &data
));
180 EXPECT_FALSE(record
->IsPopulated());
182 data
.SetDouble(NfcNdefRecord::kFieldTargetSize
, kTestTargetSize
);
183 data
.SetInteger(NfcNdefRecord::kFieldTitles
, 0);
184 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeSmartPoster
, &data
));
185 EXPECT_FALSE(record
->IsPopulated());
187 // Empty titles value should fail.
188 ListValue
* list_value
= new ListValue();
189 data
.Set(NfcNdefRecord::kFieldTitles
, list_value
);
191 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeSmartPoster
, &data
));
192 EXPECT_FALSE(record
->IsPopulated());
194 // Title value with missing required field.
195 DictionaryValue
* title_value
= new DictionaryValue();
196 list_value
->Append(title_value
);
198 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeSmartPoster
, &data
));
199 EXPECT_FALSE(record
->IsPopulated());
201 // Title value with invalid "text" field.
202 title_value
->SetInteger(NfcNdefRecord::kFieldText
, 0);
204 EXPECT_FALSE(record
->Populate(NfcNdefRecord::kTypeSmartPoster
, &data
));
205 EXPECT_FALSE(record
->IsPopulated());
207 // Title value with valid entries.
208 title_value
->SetString(NfcNdefRecord::kFieldText
, kTestText
);
209 title_value
->SetString(NfcNdefRecord::kFieldLanguageCode
, kTestLanguageCode
);
210 title_value
->SetString(NfcNdefRecord::kFieldEncoding
, kTestEncoding
);
212 EXPECT_TRUE(record
->Populate(NfcNdefRecord::kTypeSmartPoster
, &data
));
213 EXPECT_TRUE(record
->IsPopulated());
215 // Verify the record contents.
216 std::string string_value
;
218 const ListValue
* const_list_value
;
219 const DictionaryValue
* const_dictionary_value
;
220 EXPECT_TRUE(record
->data().GetString(
221 NfcNdefRecord::kFieldURI
, &string_value
));
222 EXPECT_EQ(kTestURI
, string_value
);
223 EXPECT_TRUE(record
->data().GetString(
224 NfcNdefRecord::kFieldMimeType
, &string_value
));
225 EXPECT_EQ(kTestMimeType
, string_value
);
226 EXPECT_TRUE(record
->data().GetDouble(
227 NfcNdefRecord::kFieldTargetSize
, &double_value
));
228 EXPECT_EQ(kTestTargetSize
, static_cast<uint32
>(double_value
));
229 EXPECT_TRUE(record
->data().GetString(
230 NfcNdefRecord::kFieldAction
, &string_value
));
231 EXPECT_EQ(kTestAction
, string_value
);
232 EXPECT_TRUE(record
->data().GetList(
233 NfcNdefRecord::kFieldTitles
, &const_list_value
));
234 EXPECT_EQ(static_cast<size_t>(1), const_list_value
->GetSize());
235 EXPECT_TRUE(const_list_value
->GetDictionary(0, &const_dictionary_value
));
236 EXPECT_TRUE(const_dictionary_value
->GetString(
237 NfcNdefRecord::kFieldText
, &string_value
));
238 EXPECT_EQ(kTestText
, string_value
);
239 EXPECT_TRUE(const_dictionary_value
->GetString(
240 NfcNdefRecord::kFieldLanguageCode
, &string_value
));
241 EXPECT_EQ(kTestLanguageCode
, string_value
);
242 EXPECT_TRUE(const_dictionary_value
->GetString(
243 NfcNdefRecord::kFieldEncoding
, &string_value
));
244 EXPECT_EQ(kTestEncoding
, string_value
);
247 } // namespace device