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.
4
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"
9
10using base::DictionaryValue;
11using base::ListValue;
12using base::StringValue;
13
14namespace device {
15
16namespace {
17
18const char kTestAction[] = "test-action";
19const char kTestEncoding[] = "test-encoding";
20const char kTestLanguageCode[] = "test-language-code";
21const char kTestMimeType[] = "test-mime-type";
22const uint32 kTestTargetSize = 0;
23const char kTestText[] = "test-text";
24const char kTestURI[] = "test://uri";
25
26}  // namespace
27
28TEST(NfcNdefRecordTest, PopulateTextRecord) {
29  DictionaryValue data;
30  scoped_ptr<NfcNdefRecord> record(new NfcNdefRecord());
31
32  // Missing text field. Should fail.
33  EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeText, &data));
34  EXPECT_FALSE(record->IsPopulated());
35
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());
40
41  // Text field with correct type but missing encoding and language.
42  // Should fail.
43  data.SetString(NfcNdefRecord::kFieldText, kTestText);
44  EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeText, &data));
45  EXPECT_FALSE(record->IsPopulated());
46
47  // Populating a successfully populated record should fail.
48  EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeText, &data));
49
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());
54
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());
60
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());
66
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);
78}
79
80TEST(NfcNdefRecordTest, PopulateUriRecord) {
81  DictionaryValue data;
82  scoped_ptr<NfcNdefRecord> record(new NfcNdefRecord());
83
84  // Missing URI field. Should fail.
85  EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeURI, &data));
86  EXPECT_FALSE(record->IsPopulated());
87
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());
92
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());
97
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());
102
103  // Populating a successfully populated record should fail.
104  EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeURI, &data));
105
106  // Recycle the record.
107  record.reset(new NfcNdefRecord());
108  EXPECT_FALSE(record->IsPopulated());
109
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());
114
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());
119
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());
126
127  // Compare record contents.
128  std::string string_value;
129  double double_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));
139}
140
141TEST(NfcNdefRecordTest, PopulateSmartPoster) {
142  DictionaryValue data;
143  scoped_ptr<NfcNdefRecord> record(new NfcNdefRecord());
144
145  // Missing URI field. Should fail.
146  EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeSmartPoster, &data));
147  EXPECT_FALSE(record->IsPopulated());
148
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());
153
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());
159
160  // Populating a successfully populated record should fail.
161  EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeSmartPoster, &data));
162
163  // Recycle the record.
164  record.reset(new NfcNdefRecord());
165  EXPECT_FALSE(record->IsPopulated());
166
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());
171
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());
176
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());
181
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());
186
187  // Empty titles value should fail.
188  ListValue* list_value = new ListValue();
189  data.Set(NfcNdefRecord::kFieldTitles, list_value);
190
191  EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeSmartPoster, &data));
192  EXPECT_FALSE(record->IsPopulated());
193
194  // Title value with missing required field.
195  DictionaryValue* title_value = new DictionaryValue();
196  list_value->Append(title_value);
197
198  EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeSmartPoster, &data));
199  EXPECT_FALSE(record->IsPopulated());
200
201  // Title value with invalid "text" field.
202  title_value->SetInteger(NfcNdefRecord::kFieldText, 0);
203
204  EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeSmartPoster, &data));
205  EXPECT_FALSE(record->IsPopulated());
206
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);
211
212  EXPECT_TRUE(record->Populate(NfcNdefRecord::kTypeSmartPoster, &data));
213  EXPECT_TRUE(record->IsPopulated());
214
215  // Verify the record contents.
216  std::string string_value;
217  double double_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);
245}
246
247}  // namespace device
248