blob: 2c105d98293f6ecaba0f074e67d51f110295a38d [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "device/nfc/nfc_ndef_record.h"
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include "base/values.h"
#include "testing/gtest/include/gtest/gtest.h"
using base::DictionaryValue;
using base::ListValue;
using base::StringValue;
namespace device {
namespace {
const char kTestAction[] = "test-action";
const char kTestEncoding[] = "test-encoding";
const char kTestLanguageCode[] = "test-language-code";
const char kTestMimeType[] = "test-mime-type";
const uint32_t kTestTargetSize = 0;
const char kTestText[] = "test-text";
const char kTestURI[] = "test://uri";
} // namespace
TEST(NfcNdefRecordTest, PopulateTextRecord) {
DictionaryValue data;
std::unique_ptr<NfcNdefRecord> record(new NfcNdefRecord());
// Missing text field. Should fail.
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeText, &data));
EXPECT_FALSE(record->IsPopulated());
// Text field with incorrect type. Should fail.
data.SetInteger(NfcNdefRecord::kFieldText, 0);
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeText, &data));
EXPECT_FALSE(record->IsPopulated());
// Text field with correct type but missing encoding and language.
// Should fail.
data.SetString(NfcNdefRecord::kFieldText, kTestText);
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeText, &data));
EXPECT_FALSE(record->IsPopulated());
// Populating a successfully populated record should fail.
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeText, &data));
// Incorrect type for language code.
data.SetInteger(NfcNdefRecord::kFieldLanguageCode, 0);
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeText, &data));
EXPECT_FALSE(record->IsPopulated());
// Correct type for language code, invalid encoding.
data.SetString(NfcNdefRecord::kFieldLanguageCode, kTestLanguageCode);
data.SetInteger(NfcNdefRecord::kFieldEncoding, 0);
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeText, &data));
EXPECT_FALSE(record->IsPopulated());
// All entries valid. Should succeed.
data.SetString(NfcNdefRecord::kFieldEncoding, kTestEncoding);
EXPECT_TRUE(record->Populate(NfcNdefRecord::kTypeText, &data));
EXPECT_TRUE(record->IsPopulated());
EXPECT_EQ(NfcNdefRecord::kTypeText, record->type());
// Compare record contents.
std::string string_value;
EXPECT_TRUE(record->data().GetString(
NfcNdefRecord::kFieldText, &string_value));
EXPECT_EQ(kTestText, string_value);
EXPECT_TRUE(record->data().GetString(
NfcNdefRecord::kFieldLanguageCode, &string_value));
EXPECT_EQ(kTestLanguageCode, string_value);
EXPECT_TRUE(record->data().GetString(
NfcNdefRecord::kFieldEncoding, &string_value));
EXPECT_EQ(kTestEncoding, string_value);
}
TEST(NfcNdefRecordTest, PopulateUriRecord) {
DictionaryValue data;
std::unique_ptr<NfcNdefRecord> record(new NfcNdefRecord());
// Missing URI field. Should fail.
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeURI, &data));
EXPECT_FALSE(record->IsPopulated());
// URI field with incorrect type. Should fail.
data.SetInteger(NfcNdefRecord::kFieldURI, 0);
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeURI, &data));
EXPECT_FALSE(record->IsPopulated());
// URI field with correct type but invalid format.
data.SetString(NfcNdefRecord::kFieldURI, "test.uri");
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeURI, &data));
EXPECT_FALSE(record->IsPopulated());
data.SetString(NfcNdefRecord::kFieldURI, kTestURI);
EXPECT_TRUE(record->Populate(NfcNdefRecord::kTypeURI, &data));
EXPECT_TRUE(record->IsPopulated());
EXPECT_EQ(NfcNdefRecord::kTypeURI, record->type());
// Populating a successfully populated record should fail.
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeURI, &data));
// Recycle the record.
record.reset(new NfcNdefRecord());
EXPECT_FALSE(record->IsPopulated());
// Incorrect optional fields. Should fail.
data.SetInteger(NfcNdefRecord::kFieldMimeType, 0);
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeURI, &data));
EXPECT_FALSE(record->IsPopulated());
data.SetString(NfcNdefRecord::kFieldMimeType, kTestMimeType);
data.SetInteger(NfcNdefRecord::kFieldTargetSize, kTestTargetSize);
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeURI, &data));
EXPECT_FALSE(record->IsPopulated());
// Optional fields are correct. Should succeed.
data.SetDouble(NfcNdefRecord::kFieldTargetSize,
static_cast<double>(kTestTargetSize));
EXPECT_TRUE(record->Populate(NfcNdefRecord::kTypeURI, &data));
EXPECT_TRUE(record->IsPopulated());
EXPECT_EQ(NfcNdefRecord::kTypeURI, record->type());
// Compare record contents.
std::string string_value;
double double_value;
EXPECT_TRUE(record->data().GetString(
NfcNdefRecord::kFieldURI, &string_value));
EXPECT_EQ(kTestURI, string_value);
EXPECT_TRUE(record->data().GetString(
NfcNdefRecord::kFieldMimeType, &string_value));
EXPECT_EQ(kTestMimeType, string_value);
EXPECT_TRUE(record->data().GetDouble(
NfcNdefRecord::kFieldTargetSize, &double_value));
EXPECT_EQ(kTestTargetSize, static_cast<uint32_t>(double_value));
}
TEST(NfcNdefRecordTest, PopulateSmartPoster) {
DictionaryValue data;
std::unique_ptr<NfcNdefRecord> record(new NfcNdefRecord());
// Missing URI field. Should fail.
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeSmartPoster, &data));
EXPECT_FALSE(record->IsPopulated());
// URI field with incorrect entry. Should fail.
data.SetInteger(NfcNdefRecord::kFieldURI, 0);
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeSmartPoster, &data));
EXPECT_FALSE(record->IsPopulated());
// URI field with correct entry. Should succeed.
data.SetString(NfcNdefRecord::kFieldURI, kTestURI);
EXPECT_TRUE(record->Populate(NfcNdefRecord::kTypeSmartPoster, &data));
EXPECT_TRUE(record->IsPopulated());
EXPECT_EQ(NfcNdefRecord::kTypeSmartPoster, record->type());
// Populating a successfully populated record should fail.
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeSmartPoster, &data));
// Recycle the record.
record.reset(new NfcNdefRecord());
EXPECT_FALSE(record->IsPopulated());
// Incorrect optional fields. Should fail.
data.SetInteger(NfcNdefRecord::kFieldAction, 0);
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeSmartPoster, &data));
EXPECT_FALSE(record->IsPopulated());
data.SetString(NfcNdefRecord::kFieldAction, kTestAction);
data.SetInteger(NfcNdefRecord::kFieldMimeType, 0);
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeSmartPoster, &data));
EXPECT_FALSE(record->IsPopulated());
data.SetString(NfcNdefRecord::kFieldMimeType, kTestMimeType);
data.SetInteger(NfcNdefRecord::kFieldTargetSize, kTestTargetSize);
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeSmartPoster, &data));
EXPECT_FALSE(record->IsPopulated());
data.SetDouble(NfcNdefRecord::kFieldTargetSize, kTestTargetSize);
data.SetInteger(NfcNdefRecord::kFieldTitles, 0);
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeSmartPoster, &data));
EXPECT_FALSE(record->IsPopulated());
// Empty titles value should fail.
ListValue* list_value = new ListValue();
data.Set(NfcNdefRecord::kFieldTitles, list_value);
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeSmartPoster, &data));
EXPECT_FALSE(record->IsPopulated());
// Title value with missing required field.
DictionaryValue* title_value = new DictionaryValue();
list_value->Append(title_value);
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeSmartPoster, &data));
EXPECT_FALSE(record->IsPopulated());
// Title value with invalid "text" field.
title_value->SetInteger(NfcNdefRecord::kFieldText, 0);
EXPECT_FALSE(record->Populate(NfcNdefRecord::kTypeSmartPoster, &data));
EXPECT_FALSE(record->IsPopulated());
// Title value with valid entries.
title_value->SetString(NfcNdefRecord::kFieldText, kTestText);
title_value->SetString(NfcNdefRecord::kFieldLanguageCode, kTestLanguageCode);
title_value->SetString(NfcNdefRecord::kFieldEncoding, kTestEncoding);
EXPECT_TRUE(record->Populate(NfcNdefRecord::kTypeSmartPoster, &data));
EXPECT_TRUE(record->IsPopulated());
// Verify the record contents.
std::string string_value;
double double_value;
const ListValue* const_list_value;
const DictionaryValue* const_dictionary_value;
EXPECT_TRUE(record->data().GetString(
NfcNdefRecord::kFieldURI, &string_value));
EXPECT_EQ(kTestURI, string_value);
EXPECT_TRUE(record->data().GetString(
NfcNdefRecord::kFieldMimeType, &string_value));
EXPECT_EQ(kTestMimeType, string_value);
EXPECT_TRUE(record->data().GetDouble(
NfcNdefRecord::kFieldTargetSize, &double_value));
EXPECT_EQ(kTestTargetSize, static_cast<uint32_t>(double_value));
EXPECT_TRUE(record->data().GetString(
NfcNdefRecord::kFieldAction, &string_value));
EXPECT_EQ(kTestAction, string_value);
EXPECT_TRUE(record->data().GetList(
NfcNdefRecord::kFieldTitles, &const_list_value));
EXPECT_EQ(static_cast<size_t>(1), const_list_value->GetSize());
EXPECT_TRUE(const_list_value->GetDictionary(0, &const_dictionary_value));
EXPECT_TRUE(const_dictionary_value->GetString(
NfcNdefRecord::kFieldText, &string_value));
EXPECT_EQ(kTestText, string_value);
EXPECT_TRUE(const_dictionary_value->GetString(
NfcNdefRecord::kFieldLanguageCode, &string_value));
EXPECT_EQ(kTestLanguageCode, string_value);
EXPECT_TRUE(const_dictionary_value->GetString(
NfcNdefRecord::kFieldEncoding, &string_value));
EXPECT_EQ(kTestEncoding, string_value);
}
} // namespace device