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 10 using base::DictionaryValue; 11 using base::ListValue; 12 using base::StringValue; 13 14 namespace device { 15 16 namespace { 17 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"; 25 26 } // namespace 27 28 TEST(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 80 TEST(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 141 TEST(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