1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5  * You can obtain one at http://mozilla.org/MPL/2.0/. */
6 
7 #include "mozilla/dom/QMResult.h"
8 
9 #include "gtest/gtest.h"
10 
11 #include "mozilla/dom/QMResultInlines.h"
12 
13 using namespace mozilla;
14 
15 #ifdef QM_ERROR_STACKS_ENABLED
TEST(DOM_Quota_QMResult,Construct_Default)16 TEST(DOM_Quota_QMResult, Construct_Default)
17 {
18   QMResult res;
19 
20   ASSERT_EQ(res.StackId(), 1u);
21   ASSERT_EQ(res.FrameId(), 1u);
22   ASSERT_EQ(res.NSResult(), NS_OK);
23 }
24 #endif
25 
TEST(DOM_Quota_QMResult,Construct_FromNSResult)26 TEST(DOM_Quota_QMResult, Construct_FromNSResult)
27 {
28   QMResult res(NS_ERROR_FAILURE);
29 
30 #ifdef QM_ERROR_STACKS_ENABLED
31   ASSERT_EQ(res.StackId(), 2u);
32   ASSERT_EQ(res.FrameId(), 1u);
33   ASSERT_EQ(res.NSResult(), NS_ERROR_FAILURE);
34 #else
35   ASSERT_EQ(res, NS_ERROR_FAILURE);
36 #endif
37 }
38 
39 #ifdef QM_ERROR_STACKS_ENABLED
TEST(DOM_Quota_QMResult,Propagate)40 TEST(DOM_Quota_QMResult, Propagate)
41 {
42   QMResult res1(NS_ERROR_FAILURE);
43 
44   ASSERT_EQ(res1.StackId(), 3u);
45   ASSERT_EQ(res1.FrameId(), 1u);
46   ASSERT_EQ(res1.NSResult(), NS_ERROR_FAILURE);
47 
48   QMResult res2 = res1.Propagate();
49 
50   ASSERT_EQ(res2.StackId(), 3u);
51   ASSERT_EQ(res2.FrameId(), 2u);
52   ASSERT_EQ(res2.NSResult(), NS_ERROR_FAILURE);
53 }
54 #endif
55 
TEST(DOM_Quota_QMResult,ToQMResult)56 TEST(DOM_Quota_QMResult, ToQMResult)
57 {
58   auto res = ToQMResult(NS_ERROR_FAILURE);
59 
60 #ifdef QM_ERROR_STACKS_ENABLED
61   ASSERT_EQ(res.StackId(), 4u);
62   ASSERT_EQ(res.FrameId(), 1u);
63   ASSERT_EQ(res.NSResult(), NS_ERROR_FAILURE);
64 #else
65   ASSERT_EQ(res, NS_ERROR_FAILURE);
66 #endif
67 }
68 
TEST(DOM_Quota_QMResult,ToResult)69 TEST(DOM_Quota_QMResult, ToResult)
70 {
71   // copy
72   {
73     const auto res = ToQMResult(NS_ERROR_FAILURE);
74     auto valOrErr = ToResult(res);
75     static_assert(std::is_same_v<decltype(valOrErr), Result<Ok, QMResult>>);
76     ASSERT_TRUE(valOrErr.isErr());
77     auto err = valOrErr.unwrapErr();
78 #ifdef QM_ERROR_STACKS_ENABLED
79     ASSERT_EQ(err.StackId(), 5u);
80     ASSERT_EQ(err.FrameId(), 1u);
81     ASSERT_EQ(err.NSResult(), NS_ERROR_FAILURE);
82 #else
83     ASSERT_EQ(err, NS_ERROR_FAILURE);
84 #endif
85   }
86 
87   // move
88   {
89     auto res = ToQMResult(NS_ERROR_FAILURE);
90     auto valOrErr = ToResult(std::move(res));
91     static_assert(std::is_same_v<decltype(valOrErr), Result<Ok, QMResult>>);
92     ASSERT_TRUE(valOrErr.isErr());
93     auto err = valOrErr.unwrapErr();
94 #ifdef QM_ERROR_STACKS_ENABLED
95     ASSERT_EQ(err.StackId(), 6u);
96     ASSERT_EQ(err.FrameId(), 1u);
97     ASSERT_EQ(err.NSResult(), NS_ERROR_FAILURE);
98 #else
99     ASSERT_EQ(err, NS_ERROR_FAILURE);
100 #endif
101   }
102 }
103 
TEST(DOM_Quota_QMResult,ErrorPropagation)104 TEST(DOM_Quota_QMResult, ErrorPropagation)
105 {
106   Result<Ok, QMResult> valOrErr1 = ToResult(ToQMResult(NS_ERROR_FAILURE));
107   const auto& err1 = valOrErr1.inspectErr();
108 #ifdef QM_ERROR_STACKS_ENABLED
109   ASSERT_EQ(err1.StackId(), 7u);
110   ASSERT_EQ(err1.FrameId(), 1u);
111   ASSERT_EQ(err1.NSResult(), NS_ERROR_FAILURE);
112 #else
113   ASSERT_EQ(err1, NS_ERROR_FAILURE);
114 #endif
115 
116   Result<Ok, QMResult> valOrErr2 = valOrErr1.propagateErr();
117   const auto& err2 = valOrErr2.inspectErr();
118 #ifdef QM_ERROR_STACKS_ENABLED
119   ASSERT_EQ(err2.StackId(), 7u);
120   ASSERT_EQ(err2.FrameId(), 2u);
121   ASSERT_EQ(err2.NSResult(), NS_ERROR_FAILURE);
122 #else
123   ASSERT_EQ(err2, NS_ERROR_FAILURE);
124 #endif
125 
126   Result<Ok, QMResult> valOrErr3 = valOrErr2.propagateErr();
127   const auto& err3 = valOrErr3.inspectErr();
128 #ifdef QM_ERROR_STACKS_ENABLED
129   ASSERT_EQ(err3.StackId(), 7u);
130   ASSERT_EQ(err3.FrameId(), 3u);
131   ASSERT_EQ(err3.NSResult(), NS_ERROR_FAILURE);
132 #else
133   ASSERT_EQ(err3, NS_ERROR_FAILURE);
134 #endif
135 }
136