| // Copyright 2018 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/notifications/win/notification_launch_id.h" |
| |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| TEST(NotificationLaunchIdTest, SerializationTests) { |
| { |
| NotificationLaunchId id(NotificationHandler::Type::WEB_PERSISTENT, |
| "notification_id", "Default", L"aumi", true, |
| GURL("https://example.com")); |
| ASSERT_TRUE(id.is_valid()); |
| EXPECT_EQ("0|0|Default|aumi|1|https://example.com/|notification_id", |
| id.Serialize()); |
| } |
| |
| { |
| NotificationLaunchId id(NotificationHandler::Type::WEB_PERSISTENT, |
| "notification_id", "Default", L"aumi", true, |
| GURL("https://example.com")); |
| id.set_button_index(0); |
| ASSERT_TRUE(id.is_valid()); |
| EXPECT_EQ("1|0|0|Default|aumi|1|https://example.com/|notification_id", |
| id.Serialize()); |
| } |
| |
| { |
| NotificationLaunchId id(NotificationHandler::Type::WEB_PERSISTENT, |
| "notification_id", "Default", L"aumi", true, |
| GURL("https://example.com")); |
| id.set_is_for_context_menu(); |
| ASSERT_TRUE(id.is_valid()); |
| EXPECT_EQ("2|0|Default|aumi|1|https://example.com/|notification_id", |
| id.Serialize()); |
| } |
| |
| { |
| NotificationLaunchId id(NotificationHandler::Type::WEB_PERSISTENT, |
| "notification_id", "Default", L"aumi", true, |
| GURL("https://example.com")); |
| id.set_is_for_dismiss_button(); |
| ASSERT_TRUE(id.is_valid()); |
| EXPECT_EQ("3|0|Default|aumi|1|https://example.com/|notification_id", |
| id.Serialize()); |
| } |
| } |
| |
| TEST(NotificationLaunchIdTest, ParsingTests) { |
| // Input string as Windows passes it to us when you click on the notification. |
| { |
| std::string encoded = |
| "0|0|Default|aumi|1|https://example.com/|notification_id"; |
| NotificationLaunchId id(encoded); |
| |
| ASSERT_TRUE(id.is_valid()); |
| EXPECT_EQ(-1, id.button_index()); |
| EXPECT_FALSE(id.is_for_context_menu()); |
| EXPECT_FALSE(id.is_for_dismiss_button()); |
| EXPECT_EQ(NotificationHandler::Type::WEB_PERSISTENT, |
| id.notification_type()); |
| EXPECT_TRUE(id.incognito()); |
| EXPECT_EQ("Default", id.profile_id()); |
| EXPECT_EQ(L"aumi", id.app_user_model_id()); |
| EXPECT_EQ("notification_id", id.notification_id()); |
| } |
| |
| // Extra pipe signs should be treated as part of the notification id. |
| { |
| std::string encoded = |
| "0|0|Default|aumi|1|https://example.com/|notification_id|Extra|Data"; |
| NotificationLaunchId id(encoded); |
| |
| ASSERT_TRUE(id.is_valid()); |
| EXPECT_EQ(-1, id.button_index()); |
| EXPECT_FALSE(id.is_for_context_menu()); |
| EXPECT_FALSE(id.is_for_dismiss_button()); |
| EXPECT_EQ(NotificationHandler::Type::WEB_PERSISTENT, |
| id.notification_type()); |
| EXPECT_TRUE(id.incognito()); |
| EXPECT_EQ("Default", id.profile_id()); |
| EXPECT_EQ(L"aumi", id.app_user_model_id()); |
| EXPECT_EQ("notification_id|Extra|Data", id.notification_id()); |
| } |
| |
| // Input string for when a button is pressed. |
| { |
| std::string encoded = |
| "1|0|0|Default|aumi|1|https://example.com/|notification_id"; |
| NotificationLaunchId id(encoded); |
| |
| ASSERT_TRUE(id.is_valid()); |
| EXPECT_EQ(0, id.button_index()); |
| EXPECT_FALSE(id.is_for_context_menu()); |
| EXPECT_FALSE(id.is_for_dismiss_button()); |
| EXPECT_EQ(NotificationHandler::Type::WEB_PERSISTENT, |
| id.notification_type()); |
| EXPECT_TRUE(id.incognito()); |
| EXPECT_EQ("Default", id.profile_id()); |
| EXPECT_EQ(L"aumi", id.app_user_model_id()); |
| EXPECT_EQ("notification_id", id.notification_id()); |
| } |
| |
| // Input string for when a button is pressed, with extra pipes in notification |
| // id. |
| { |
| std::string encoded = |
| "1|0|0|Default|aumi|1|https://example.com/|notification_id|Extra|Data|"; |
| NotificationLaunchId id(encoded); |
| |
| ASSERT_TRUE(id.is_valid()); |
| EXPECT_EQ(0, id.button_index()); |
| EXPECT_FALSE(id.is_for_context_menu()); |
| EXPECT_FALSE(id.is_for_dismiss_button()); |
| EXPECT_EQ(NotificationHandler::Type::WEB_PERSISTENT, |
| id.notification_type()); |
| EXPECT_TRUE(id.incognito()); |
| EXPECT_EQ("Default", id.profile_id()); |
| EXPECT_EQ(L"aumi", id.app_user_model_id()); |
| EXPECT_EQ("notification_id|Extra|Data|", id.notification_id()); |
| } |
| |
| // Input string for when the context menu item is selected. |
| { |
| std::string encoded = |
| "2|0|Default|aumi|1|https://example.com/|notification_id"; |
| NotificationLaunchId id(encoded); |
| |
| ASSERT_TRUE(id.is_valid()); |
| EXPECT_EQ(-1, id.button_index()); |
| EXPECT_TRUE(id.is_for_context_menu()); |
| EXPECT_FALSE(id.is_for_dismiss_button()); |
| EXPECT_EQ(NotificationHandler::Type::WEB_PERSISTENT, |
| id.notification_type()); |
| EXPECT_TRUE(id.incognito()); |
| EXPECT_EQ("Default", id.profile_id()); |
| EXPECT_EQ(L"aumi", id.app_user_model_id()); |
| EXPECT_EQ("notification_id", id.notification_id()); |
| } |
| |
| // Input string for when the context menu item is selected. |
| { |
| std::string encoded = |
| "3|0|Default|aumi|1|https://example.com/|notification_id"; |
| NotificationLaunchId id(encoded); |
| |
| ASSERT_TRUE(id.is_valid()); |
| EXPECT_EQ(-1, id.button_index()); |
| EXPECT_FALSE(id.is_for_context_menu()); |
| EXPECT_TRUE(id.is_for_dismiss_button()); |
| EXPECT_EQ(NotificationHandler::Type::WEB_PERSISTENT, |
| id.notification_type()); |
| EXPECT_TRUE(id.incognito()); |
| EXPECT_EQ("Default", id.profile_id()); |
| EXPECT_EQ(L"aumi", id.app_user_model_id()); |
| EXPECT_EQ("notification_id", id.notification_id()); |
| } |
| } |
| |
| TEST(NotificationLaunchIdTest, ParsingErrorCases) { |
| struct TestCases { |
| const char* const encoded_string; |
| } cases[] = { |
| {""}, |
| // Missing button index/notification type. |
| {"1|0|Default|1|https://example.com/|notification_id"}, |
| // Valid, except button index is not an int. |
| {"1|a|0|Default|1|https://example.com/|notification_id"}, |
| // Missing notification id from end. |
| {"0|0|Default|1|https://example.com/"}, |
| // Missing notification id, and origin. |
| {"0|0|Default|1"}, |
| // Missing notification id, origin, and incognito. |
| {"0|0|Default"}, |
| // Missing notification id, origin, incognito, and profile id. |
| {"0|0"}, |
| // Missing all but the component type (type NORMAL). |
| {"0"}, |
| // Missing all but the component type (type BUTTON_INDEX). |
| {"1"}, |
| // Missing all but the component type (type CONTEXT_MENU). |
| {"2"}, |
| // Missing all but the component type (type DISMISS_BUTTON). |
| {"3"}, |
| }; |
| |
| for (const auto& test_case : cases) { |
| SCOPED_TRACE(test_case.encoded_string); |
| NotificationLaunchId id(test_case.encoded_string); |
| EXPECT_FALSE(id.is_valid()); |
| } |
| } |
| |
| TEST(NotificationLaunchIdTest, GetProfileIdFromLaunchId) { |
| // Given a valid launch id, the profile id can be obtained correctly. |
| ASSERT_EQ(NotificationLaunchId::GetProfileIdFromLaunchId( |
| L"1|1|0|Default|aumi|0|https://example.com/|notification_id"), |
| "Default"); |
| |
| // Given an invalid launch id, the profile id is set to an empty string. |
| ASSERT_EQ(NotificationLaunchId::GetProfileIdFromLaunchId( |
| L"1|Default|aumi|0|https://example.com/|notification_id"), |
| ""); |
| } |