16c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko// Copyright (c) 2014 The Chromium OS Authors. All rights reserved. 26c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko// Use of this source code is governed by a BSD-style license that can be 36c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko// found in the LICENSE file. 46c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 59ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko#include <brillo/strings/string_utils.h> 66c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 73b206ce7c4f7ac92af7f9468e8f82d1fb15baf80Vitaly Buka#include <list> 83b206ce7c4f7ac92af7f9468e8f82d1fb15baf80Vitaly Buka#include <set> 93b206ce7c4f7ac92af7f9468e8f82d1fb15baf80Vitaly Buka#include <string> 103b206ce7c4f7ac92af7f9468e8f82d1fb15baf80Vitaly Buka#include <vector> 113b206ce7c4f7ac92af7f9468e8f82d1fb15baf80Vitaly Buka 126c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko#include <gtest/gtest.h> 136c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 149ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenkonamespace brillo { 156c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 166c0515d22612d04876139b77ef9c50b59288a6daAlex VakulenkoTEST(StringUtils, Split) { 176c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko std::vector<std::string> parts; 186c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 19852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka parts = string_utils::Split("", ",", false, false); 20852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka EXPECT_EQ(0, parts.size()); 21852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka 22852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka parts = string_utils::Split("abc", ",", false, false); 23852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka EXPECT_EQ(1, parts.size()); 24852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka EXPECT_EQ("abc", parts[0]); 25852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka 26852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka parts = string_utils::Split(",a,bc , d, ,e, ", ",", true, true); 276c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ(4, parts.size()); 286c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("a", parts[0]); 296c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("bc", parts[1]); 306c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("d", parts[2]); 316c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("e", parts[3]); 326c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 33852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka parts = string_utils::Split(",a,bc , d, ,e, ", ",", false, true); 340748d37de8d24309ad8c3e5c0d61a78d722dc2c8Alex Vakulenko EXPECT_EQ(6, parts.size()); 356c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("a", parts[0]); 366c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("bc ", parts[1]); 376c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ(" d", parts[2]); 380748d37de8d24309ad8c3e5c0d61a78d722dc2c8Alex Vakulenko EXPECT_EQ(" ", parts[3]); 390748d37de8d24309ad8c3e5c0d61a78d722dc2c8Alex Vakulenko EXPECT_EQ("e", parts[4]); 400748d37de8d24309ad8c3e5c0d61a78d722dc2c8Alex Vakulenko EXPECT_EQ(" ", parts[5]); 416c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 42852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka parts = string_utils::Split(",a,bc , d, ,e, ", ",", true, false); 436c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ(7, parts.size()); 446c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("", parts[0]); 456c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("a", parts[1]); 466c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("bc", parts[2]); 476c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("d", parts[3]); 486c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("", parts[4]); 496c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("e", parts[5]); 506c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("", parts[6]); 516c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 52852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka parts = string_utils::Split(",a,bc , d, ,e, ", ",", false, false); 536c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ(7, parts.size()); 546c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("", parts[0]); 556c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("a", parts[1]); 566c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("bc ", parts[2]); 576c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ(" d", parts[3]); 580748d37de8d24309ad8c3e5c0d61a78d722dc2c8Alex Vakulenko EXPECT_EQ(" ", parts[4]); 596c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("e", parts[5]); 600748d37de8d24309ad8c3e5c0d61a78d722dc2c8Alex Vakulenko EXPECT_EQ(" ", parts[6]); 61852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka 62852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka parts = string_utils::Split("abc:=xyz", ":=", false, false); 63852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka EXPECT_EQ(2, parts.size()); 64852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka EXPECT_EQ("abc", parts[0]); 65852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka EXPECT_EQ("xyz", parts[1]); 66852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka 67852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka parts = string_utils::Split("abc", "", false, false); 68852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka EXPECT_EQ(3, parts.size()); 69852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka EXPECT_EQ("a", parts[0]); 70852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka EXPECT_EQ("b", parts[1]); 71852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka EXPECT_EQ("c", parts[2]); 726c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko} 736c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 746c0515d22612d04876139b77ef9c50b59288a6daAlex VakulenkoTEST(StringUtils, SplitAtFirst) { 756c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko std::pair<std::string, std::string> pair; 766c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 77852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka pair = string_utils::SplitAtFirst(" 123 : 4 : 56 : 789 ", ":", true); 786c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("123", pair.first); 796c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("4 : 56 : 789", pair.second); 806c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 81852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka pair = string_utils::SplitAtFirst(" 123 : 4 : 56 : 789 ", ":", false); 826c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ(" 123 ", pair.first); 836c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ(" 4 : 56 : 789 ", pair.second); 846c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 85852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka pair = string_utils::SplitAtFirst("", "="); 866c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("", pair.first); 876c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("", pair.second); 886c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 89852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka pair = string_utils::SplitAtFirst("=", "="); 906c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("", pair.first); 916c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("", pair.second); 926c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 93852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka pair = string_utils::SplitAtFirst("a=", "="); 946c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("a", pair.first); 956c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("", pair.second); 966c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 97852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka pair = string_utils::SplitAtFirst("abc=", "="); 986c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("abc", pair.first); 996c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("", pair.second); 1006c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 101852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka pair = string_utils::SplitAtFirst("=a", "="); 1026c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("", pair.first); 1036c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("a", pair.second); 1046c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 105852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka pair = string_utils::SplitAtFirst("=abc=", "="); 1066c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("", pair.first); 1076c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("abc=", pair.second); 1086c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 109852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka pair = string_utils::SplitAtFirst("abc", "="); 1106c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("abc", pair.first); 1116c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("", pair.second); 1126c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 113852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka pair = string_utils::SplitAtFirst("abc:=xyz", ":="); 114852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka EXPECT_EQ("abc", pair.first); 115852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka EXPECT_EQ("xyz", pair.second); 116852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka 117852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka pair = string_utils::SplitAtFirst("abc", ""); 118852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka EXPECT_EQ("", pair.first); 119852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka EXPECT_EQ("abc", pair.second); 1206c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko} 1216c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 1226c0515d22612d04876139b77ef9c50b59288a6daAlex VakulenkoTEST(StringUtils, Join_String) { 1236c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("", string_utils::Join(",", {})); 1246c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("abc", string_utils::Join(",", {"abc"})); 1253b206ce7c4f7ac92af7f9468e8f82d1fb15baf80Vitaly Buka EXPECT_EQ("abc,,xyz", string_utils::Join(",", {"abc", "", "xyz"})); 1266c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("abc,defg", string_utils::Join(",", {"abc", "defg"})); 1276c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("1 : 2 : 3", string_utils::Join(" : ", {"1", "2", "3"})); 1283b206ce7c4f7ac92af7f9468e8f82d1fb15baf80Vitaly Buka EXPECT_EQ("1:2", string_utils::Join(":", std::set<std::string>{"1", "2"})); 1293b206ce7c4f7ac92af7f9468e8f82d1fb15baf80Vitaly Buka EXPECT_EQ("1:2", string_utils::Join(":", std::vector<std::string>{"1", "2"})); 1303b206ce7c4f7ac92af7f9468e8f82d1fb15baf80Vitaly Buka EXPECT_EQ("1:2", string_utils::Join(":", std::list<std::string>{"1", "2"})); 1316c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("123", string_utils::Join("", {"1", "2", "3"})); 1326c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko} 1336c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 1346c0515d22612d04876139b77ef9c50b59288a6daAlex VakulenkoTEST(StringUtils, Join_Pair) { 135852ff001e232f6fcc2bddd10d97c609d7461cda2Vitaly Buka EXPECT_EQ("ab,cd", string_utils::Join(",", "ab", "cd")); 1366c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko EXPECT_EQ("key = value", string_utils::Join(" = ", "key", "value")); 1376c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko} 1386c0515d22612d04876139b77ef9c50b59288a6daAlex Vakulenko 139c0f562cc8a779ad6a8088cc86f10a620093c7935Alex VakulenkoTEST(StringUtils, GetBytesAsString) { 140c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko EXPECT_EQ("abc", string_utils::GetBytesAsString({'a', 'b', 'c'})); 141c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko EXPECT_TRUE(string_utils::GetBytesAsString({}).empty()); 142c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko auto str = string_utils::GetBytesAsString({0xFF, 0x00, 0x01, 0x7F, 0x80}); 143c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko ASSERT_EQ(5, str.size()); 144c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko EXPECT_EQ('\xFF', str[0]); 145c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko EXPECT_EQ('\x00', str[1]); 146c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko EXPECT_EQ('\x01', str[2]); 147c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko EXPECT_EQ('\x7F', str[3]); 148c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko EXPECT_EQ('\x80', str[4]); 149c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko} 150c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko 151c0f562cc8a779ad6a8088cc86f10a620093c7935Alex VakulenkoTEST(StringUtils, GetStringAsBytes) { 152c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko EXPECT_EQ((std::vector<uint8_t>{'a', 'b', 'c'}), 153c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko string_utils::GetStringAsBytes("abc")); 154c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko EXPECT_TRUE(string_utils::GetStringAsBytes("").empty()); 155c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko auto buf = string_utils::GetStringAsBytes(std::string{"\x80\0\1\xFF", 4}); 156c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko ASSERT_EQ(4, buf.size()); 157c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko EXPECT_EQ(128, buf[0]); 158c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko EXPECT_EQ(0, buf[1]); 159c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko EXPECT_EQ(1, buf[2]); 160c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko EXPECT_EQ(255, buf[3]); 161c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko} 162c0f562cc8a779ad6a8088cc86f10a620093c7935Alex Vakulenko 1639ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko} // namespace brillo 164