| // 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 "extensions/common/stack_frame.h" | 
 |  | 
 | #include "base/logging.h" | 
 | #include "base/memory/scoped_ptr.h" | 
 | #include "base/strings/string16.h" | 
 | #include "base/strings/utf_string_conversions.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 |  | 
 | using base::UTF8ToUTF16; | 
 |  | 
 | namespace extensions { | 
 |  | 
 | namespace { | 
 |  | 
 | void AssertStackFrameValid(const std::string& text, | 
 |                            size_t line, | 
 |                            size_t column, | 
 |                            const std::string& source, | 
 |                            const std::string& function) { | 
 |   base::string16 utf16_text = base::UTF8ToUTF16(text); | 
 |   scoped_ptr<StackFrame> frame = StackFrame::CreateFromText(utf16_text); | 
 |  | 
 |   ASSERT_TRUE(frame.get()) << "Failed to create frame from '" << text << "'"; | 
 |   EXPECT_EQ(line, frame->line_number); | 
 |   EXPECT_EQ(column, frame->column_number); | 
 |   EXPECT_EQ(base::UTF8ToUTF16(source), frame->source); | 
 |   EXPECT_EQ(base::UTF8ToUTF16(function), frame->function); | 
 | } | 
 |  | 
 | void AssertStackFrameInvalid(const std::string& text) { | 
 |   base::string16 utf16_text = base::UTF8ToUTF16(text); | 
 |   scoped_ptr<StackFrame> frame = StackFrame::CreateFromText(utf16_text); | 
 |   ASSERT_FALSE(frame.get()) << "Errantly created frame from '" << text << "'"; | 
 | } | 
 |  | 
 | }  // namespace | 
 |  | 
 | TEST(StackFrameUnitTest, ParseStackFramesFromText) { | 
 |   AssertStackFrameValid( | 
 |       "function_name (https://www.url.com/foo.html:100:201)", | 
 |       100u, 201u, "https://www.url.com/foo.html", "function_name"); | 
 |   AssertStackFrameValid( | 
 |       "(anonymous function) (https://www.url.com/foo.html:100:201)", | 
 |       100u, 201u, "https://www.url.com/foo.html", "(anonymous function)"); | 
 |   AssertStackFrameValid( | 
 |       "Function.target.(anonymous function) (internals::SafeBuiltins:19:14)", | 
 |       19u, 14u, "internals::SafeBuiltins", | 
 |       "Function.target.(anonymous function)"); | 
 |   AssertStackFrameValid( | 
 |       "internal-item:://fpgohbggpmcpeedljibghijiclejiklo/script.js:6:12", | 
 |       6u, 12u, "internal-item:://fpgohbggpmcpeedljibghijiclejiklo/script.js", | 
 |       "(anonymous function)"); | 
 |  | 
 |   // No delimiting ':' between line/column numbers. | 
 |   AssertStackFrameInvalid( | 
 |       "function_name (https://www.url.com/foo.html:100201)"); | 
 |   // No line number. | 
 |   AssertStackFrameInvalid("function_name (https://www.url.com/foo.html::201)"); | 
 |   // No line number or delimiting ':'. | 
 |   AssertStackFrameInvalid("function_name (https://www.url.com/foo.html201)"); | 
 |   // No leading '(' around url, line, column. | 
 |   AssertStackFrameInvalid( | 
 |       "function_name https://www.url.com/foo.html:100:201)"); | 
 |   // No trailing ')'. | 
 |   AssertStackFrameInvalid( | 
 |       "function_name (https://www.url.com/foo.html:100:201"); | 
 |   // Trailing ' '. | 
 |   AssertStackFrameInvalid( | 
 |       "function_name (https://www.url.com/foo.html:100:201) "); | 
 |   // Invalid column number. | 
 |   AssertStackFrameInvalid( | 
 |       "function_name (https://www.url.com/foo.html:100:201a)"); | 
 |   // Negative column number. | 
 |   AssertStackFrameInvalid( | 
 |       "function_name (https://www.url.com/foo.html:100:-201)"); | 
 |   // Extra trailing ')' | 
 |   AssertStackFrameInvalid( | 
 |       "function_name (https://www.url.com/foo.html:100:201))"); | 
 | } | 
 |  | 
 | }  // namespace extensions |