1 /*
2  *Any copyright is dedicated to the Public Domain.
3  * http://creativecommons.org/publicdomain/zero/1.0/
4  */
5 
6 #include "storage_test_harness.h"
7 #include "mozIStorageRow.h"
8 #include "mozIStorageResultSet.h"
9 
10 /**
11  * This file tests AsXXX (AsInt32, AsInt64, ...) helpers.
12  */
13 
14 ////////////////////////////////////////////////////////////////////////////////
15 //// Event Loop Spinning
16 
17 class Spinner : public AsyncStatementSpinner
18 {
19 public:
20   NS_DECL_ISUPPORTS_INHERITED
21   NS_DECL_ASYNCSTATEMENTSPINNER
Spinner()22   Spinner() {}
23 protected:
24   ~Spinner() override = default;
25 };
26 
NS_IMPL_ISUPPORTS_INHERITED0(Spinner,AsyncStatementSpinner)27 NS_IMPL_ISUPPORTS_INHERITED0(Spinner,
28                              AsyncStatementSpinner)
29 
30 NS_IMETHODIMP
31 Spinner::HandleResult(mozIStorageResultSet *aResultSet)
32 {
33   nsCOMPtr<mozIStorageRow> row;
34   do_check_true(NS_SUCCEEDED(aResultSet->GetNextRow(getter_AddRefs(row))) && row);
35 
36   do_check_eq(row->AsInt32(0), 0);
37   do_check_eq(row->AsInt64(0), 0);
38   do_check_eq(row->AsDouble(0), 0.0);
39 
40   uint32_t len = 100;
41   do_check_eq(row->AsSharedUTF8String(0, &len), (const char*)nullptr);
42   do_check_eq(len, 0);
43   len = 100;
44   do_check_eq(row->AsSharedWString(0, &len), (const char16_t*)nullptr);
45   do_check_eq(len, 0);
46   len = 100;
47   do_check_eq(row->AsSharedBlob(0, &len), (const uint8_t*)nullptr);
48   do_check_eq(len, 0);
49 
50   do_check_eq(row->IsNull(0), true);
51   return NS_OK;
52 }
53 
TEST(storage_AsXXX_helpers,NULLFallback)54 TEST(storage_AsXXX_helpers, NULLFallback)
55 {
56   nsCOMPtr<mozIStorageConnection> db(getMemoryDatabase());
57 
58   nsCOMPtr<mozIStorageStatement> stmt;
59   (void)db->CreateStatement(NS_LITERAL_CSTRING(
60     "SELECT NULL"
61   ), getter_AddRefs(stmt));
62 
63   nsCOMPtr<mozIStorageValueArray> valueArray = do_QueryInterface(stmt);
64   do_check_true(valueArray);
65 
66   bool hasMore;
67   do_check_true(NS_SUCCEEDED(stmt->ExecuteStep(&hasMore)) && hasMore);
68 
69   do_check_eq(stmt->AsInt32(0), 0);
70   do_check_eq(stmt->AsInt64(0), 0);
71   do_check_eq(stmt->AsDouble(0), 0.0);
72   uint32_t len = 100;
73   do_check_eq(stmt->AsSharedUTF8String(0, &len), (const char*)nullptr);
74   do_check_eq(len, 0);
75   len = 100;
76   do_check_eq(stmt->AsSharedWString(0, &len), (const char16_t*)nullptr);
77   do_check_eq(len, 0);
78   len = 100;
79   do_check_eq(stmt->AsSharedBlob(0, &len), (const uint8_t*)nullptr);
80   do_check_eq(len, 0);
81   do_check_eq(stmt->IsNull(0), true);
82 
83   do_check_eq(valueArray->AsInt32(0), 0);
84   do_check_eq(valueArray->AsInt64(0), 0);
85   do_check_eq(valueArray->AsDouble(0), 0.0);
86   len = 100;
87   do_check_eq(valueArray->AsSharedUTF8String(0, &len), (const char*)nullptr);
88   do_check_eq(len, 0);
89   len = 100;
90   do_check_eq(valueArray->AsSharedWString(0, &len), (const char16_t*)nullptr);
91   do_check_eq(len, 0);
92   len = 100;
93   do_check_eq(valueArray->AsSharedBlob(0, &len), (const uint8_t*)nullptr);
94   do_check_eq(len, 0);
95   do_check_eq(valueArray->IsNull(0), true);
96 }
97 
TEST(storage_AsXXX_helpers,asyncNULLFallback)98 TEST(storage_AsXXX_helpers, asyncNULLFallback)
99 {
100   nsCOMPtr<mozIStorageConnection> db(getMemoryDatabase());
101 
102   nsCOMPtr<mozIStorageAsyncStatement> stmt;
103   (void)db->CreateAsyncStatement(NS_LITERAL_CSTRING(
104     "SELECT NULL"
105   ), getter_AddRefs(stmt));
106 
107   nsCOMPtr<mozIStoragePendingStatement> pendingStmt;
108   do_check_true(NS_SUCCEEDED(stmt->ExecuteAsync(nullptr, getter_AddRefs(pendingStmt))));
109   do_check_true(pendingStmt);
110   stmt->Finalize();
111   RefPtr<Spinner> asyncSpin(new Spinner());
112   db->AsyncClose(asyncSpin);
113   asyncSpin->SpinUntilCompleted();
114 }
115 
116