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