1 /*
2  * Copyright (c) 2009-2022, Google LLC
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *     * Redistributions of source code must retain the above copyright
8  *       notice, this list of conditions and the following disclaimer.
9  *     * Redistributions in binary form must reproduce the above copyright
10  *       notice, this list of conditions and the following disclaimer in the
11  *       documentation and/or other materials provided with the distribution.
12  *     * Neither the name of Google LLC nor the
13  *       names of its contributors may be used to endorse or promote products
14  *       derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT,
20  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #include "gtest/gtest.h"
29 #include "absl/strings/string_view.h"
30 #include "upb/reflection/def_builder_internal.h"
31 #include "upb/upb.hpp"
32 
33 // Must be last.
34 #include "upb/port/def.inc"
35 
36 struct IdentTestData {
37   absl::string_view text;
38   bool ok;
39 };
40 
41 class FullIdentTestBase : public testing::TestWithParam<IdentTestData> {};
42 
TEST_P(FullIdentTestBase,CheckFullIdent)43 TEST_P(FullIdentTestBase, CheckFullIdent) {
44   upb_Status status;
45   upb_DefBuilder ctx;
46   upb::Arena arena;
47   ctx.status = &status;
48   ctx.arena = arena.ptr();
49   upb_Status_Clear(&status);
50 
51   if (UPB_SETJMP(ctx.err)) {
52     EXPECT_FALSE(GetParam().ok);
53   } else {
54     _upb_DefBuilder_CheckIdentFull(
55         &ctx, upb_StringView_FromDataAndSize(GetParam().text.data(),
56                                              GetParam().text.size()));
57     EXPECT_TRUE(GetParam().ok);
58   }
59 }
60 
61 INSTANTIATE_TEST_SUITE_P(FullIdentTest, FullIdentTestBase,
62                          testing::ValuesIn(std::vector<IdentTestData>{
63                              {"foo.bar", true},
64                              {"foo.", true},
65                              {"foo", true},
66 
67                              {"foo.7bar", false},
68                              {".foo", false},
69                              {"#", false},
70                              {".", false},
71                              {"", false}}));
72 
73 class PartIdentTestBase : public testing::TestWithParam<IdentTestData> {};
74 
TEST_P(PartIdentTestBase,TestNotFullIdent)75 TEST_P(PartIdentTestBase, TestNotFullIdent) {
76   upb_Status status;
77   upb_DefBuilder ctx;
78   upb::Arena arena;
79   ctx.status = &status;
80   ctx.arena = arena.ptr();
81   upb_Status_Clear(&status);
82 
83   if (UPB_SETJMP(ctx.err)) {
84     EXPECT_FALSE(GetParam().ok);
85   } else {
86     _upb_DefBuilder_MakeFullName(
87         &ctx, "abc",
88         upb_StringView_FromDataAndSize(GetParam().text.data(),
89                                        GetParam().text.size()));
90     EXPECT_TRUE(GetParam().ok);
91   }
92 }
93 
94 INSTANTIATE_TEST_SUITE_P(PartIdentTest, PartIdentTestBase,
95                          testing::ValuesIn(std::vector<IdentTestData>{
96                              {"foo", true},
97                              {"foo1", true},
98 
99                              {"foo.bar", false},
100                              {"1foo", false},
101                              {"#", false},
102                              {".", false},
103                              {"", false}}));
104