1c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko// Copyright 2014 The Chromium OS Authors. All rights reserved. 2c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko// Use of this source code is governed by a BSD-style license that can be 3c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko// found in the LICENSE file. 4c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko 59ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko#include <brillo/errors/error.h> 6c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko 78f815f563c71645fd218977f16de8e746bec28a6Alex Vakulenko#include <gtest/gtest.h> 88f815f563c71645fd218977f16de8e746bec28a6Alex Vakulenko 99ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenkousing brillo::Error; 10c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko 11c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenkonamespace { 12c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko 139ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenkobrillo::ErrorPtr GenerateNetworkError() { 1405d29044d14a60775ed6c51c75a414eb0cb50347Alex Vakulenko tracked_objects::Location loc("GenerateNetworkError", 1505d29044d14a60775ed6c51c75a414eb0cb50347Alex Vakulenko "error_unittest.cc", 1605d29044d14a60775ed6c51c75a414eb0cb50347Alex Vakulenko 15, 1705d29044d14a60775ed6c51c75a414eb0cb50347Alex Vakulenko ::tracked_objects::GetProgramCounter()); 188f815f563c71645fd218977f16de8e746bec28a6Alex Vakulenko return Error::Create(loc, "network", "not_found", "Resource not found"); 19c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko} 20c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko 219ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenkobrillo::ErrorPtr GenerateHttpError() { 229ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko brillo::ErrorPtr inner = GenerateNetworkError(); 238f815f563c71645fd218977f16de8e746bec28a6Alex Vakulenko return Error::Create(FROM_HERE, "HTTP", "404", "Not found", std::move(inner)); 24c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko} 25c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko 26c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko} // namespace 27c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko 28c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex VakulenkoTEST(Error, Single) { 299ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko brillo::ErrorPtr err = GenerateNetworkError(); 30c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_EQ("network", err->GetDomain()); 31c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_EQ("not_found", err->GetCode()); 32c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_EQ("Resource not found", err->GetMessage()); 338f815f563c71645fd218977f16de8e746bec28a6Alex Vakulenko EXPECT_EQ("GenerateNetworkError", err->GetLocation().function_name); 348f815f563c71645fd218977f16de8e746bec28a6Alex Vakulenko EXPECT_EQ("error_unittest.cc", err->GetLocation().file_name); 358f815f563c71645fd218977f16de8e746bec28a6Alex Vakulenko EXPECT_EQ(15, err->GetLocation().line_number); 36c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_EQ(nullptr, err->GetInnerError()); 37c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_TRUE(err->HasDomain("network")); 38c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_FALSE(err->HasDomain("HTTP")); 39c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_FALSE(err->HasDomain("foo")); 40c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_TRUE(err->HasError("network", "not_found")); 41c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_FALSE(err->HasError("network", "404")); 42c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_FALSE(err->HasError("HTTP", "404")); 43c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_FALSE(err->HasError("HTTP", "not_found")); 44c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_FALSE(err->HasError("foo", "bar")); 45c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko} 46c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko 47c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex VakulenkoTEST(Error, Nested) { 489ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko brillo::ErrorPtr err = GenerateHttpError(); 49c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_EQ("HTTP", err->GetDomain()); 50c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_EQ("404", err->GetCode()); 51c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_EQ("Not found", err->GetMessage()); 52c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_NE(nullptr, err->GetInnerError()); 53c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_EQ("network", err->GetInnerError()->GetDomain()); 54c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_TRUE(err->HasDomain("network")); 55c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_TRUE(err->HasDomain("HTTP")); 56c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_FALSE(err->HasDomain("foo")); 57c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_TRUE(err->HasError("network", "not_found")); 58c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_FALSE(err->HasError("network", "404")); 59c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_TRUE(err->HasError("HTTP", "404")); 60c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_FALSE(err->HasError("HTTP", "not_found")); 61c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko EXPECT_FALSE(err->HasError("foo", "bar")); 62c909a9f2ea6f99d0d3ac3efd5ae1114f576cd377Alex Vakulenko} 63c345858bb96cd56e3cac717cfc11ef6e8630cd9dVitaly Buka 64c345858bb96cd56e3cac717cfc11ef6e8630cd9dVitaly BukaTEST(Error, Clone) { 659ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko brillo::ErrorPtr err = GenerateHttpError(); 669ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko brillo::ErrorPtr clone = err->Clone(); 679ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko const brillo::Error* error1 = err.get(); 689ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko const brillo::Error* error2 = clone.get(); 69c345858bb96cd56e3cac717cfc11ef6e8630cd9dVitaly Buka while (error1 && error2) { 70c345858bb96cd56e3cac717cfc11ef6e8630cd9dVitaly Buka EXPECT_NE(error1, error2); 71c345858bb96cd56e3cac717cfc11ef6e8630cd9dVitaly Buka EXPECT_EQ(error1->GetDomain(), error2->GetDomain()); 72c345858bb96cd56e3cac717cfc11ef6e8630cd9dVitaly Buka EXPECT_EQ(error1->GetCode(), error2->GetCode()); 73c345858bb96cd56e3cac717cfc11ef6e8630cd9dVitaly Buka EXPECT_EQ(error1->GetMessage(), error2->GetMessage()); 74c345858bb96cd56e3cac717cfc11ef6e8630cd9dVitaly Buka EXPECT_EQ(error1->GetLocation().function_name, 75c345858bb96cd56e3cac717cfc11ef6e8630cd9dVitaly Buka error2->GetLocation().function_name); 76c345858bb96cd56e3cac717cfc11ef6e8630cd9dVitaly Buka EXPECT_EQ(error1->GetLocation().file_name, error2->GetLocation().file_name); 77c345858bb96cd56e3cac717cfc11ef6e8630cd9dVitaly Buka EXPECT_EQ(error1->GetLocation().line_number, 78c345858bb96cd56e3cac717cfc11ef6e8630cd9dVitaly Buka error2->GetLocation().line_number); 79c345858bb96cd56e3cac717cfc11ef6e8630cd9dVitaly Buka error1 = error1->GetInnerError(); 80c345858bb96cd56e3cac717cfc11ef6e8630cd9dVitaly Buka error2 = error2->GetInnerError(); 81c345858bb96cd56e3cac717cfc11ef6e8630cd9dVitaly Buka } 82c345858bb96cd56e3cac717cfc11ef6e8630cd9dVitaly Buka EXPECT_EQ(error1, error2); 83c345858bb96cd56e3cac717cfc11ef6e8630cd9dVitaly Buka} 84