xref: /aosp_15_r20/external/leveldb/db/filename_test.cc (revision 9507f98c5f32dee4b5f9e4a38cd499f3ff5c4490)
1 // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. See the AUTHORS file for names of contributors.
4 
5 #include "db/filename.h"
6 
7 #include "gtest/gtest.h"
8 #include "db/dbformat.h"
9 #include "port/port.h"
10 #include "util/logging.h"
11 
12 namespace leveldb {
13 
TEST(FileNameTest,Parse)14 TEST(FileNameTest, Parse) {
15   Slice db;
16   FileType type;
17   uint64_t number;
18 
19   // Successful parses
20   static struct {
21     const char* fname;
22     uint64_t number;
23     FileType type;
24   } cases[] = {
25       {"100.log", 100, kLogFile},
26       {"0.log", 0, kLogFile},
27       {"0.sst", 0, kTableFile},
28       {"0.ldb", 0, kTableFile},
29       {"CURRENT", 0, kCurrentFile},
30       {"LOCK", 0, kDBLockFile},
31       {"MANIFEST-2", 2, kDescriptorFile},
32       {"MANIFEST-7", 7, kDescriptorFile},
33       {"LOG", 0, kInfoLogFile},
34       {"LOG.old", 0, kInfoLogFile},
35       {"18446744073709551615.log", 18446744073709551615ull, kLogFile},
36   };
37   for (int i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) {
38     std::string f = cases[i].fname;
39     ASSERT_TRUE(ParseFileName(f, &number, &type)) << f;
40     ASSERT_EQ(cases[i].type, type) << f;
41     ASSERT_EQ(cases[i].number, number) << f;
42   }
43 
44   // Errors
45   static const char* errors[] = {"",
46                                  "foo",
47                                  "foo-dx-100.log",
48                                  ".log",
49                                  "",
50                                  "manifest",
51                                  "CURREN",
52                                  "CURRENTX",
53                                  "MANIFES",
54                                  "MANIFEST",
55                                  "MANIFEST-",
56                                  "XMANIFEST-3",
57                                  "MANIFEST-3x",
58                                  "LOC",
59                                  "LOCKx",
60                                  "LO",
61                                  "LOGx",
62                                  "18446744073709551616.log",
63                                  "184467440737095516150.log",
64                                  "100",
65                                  "100.",
66                                  "100.lop"};
67   for (int i = 0; i < sizeof(errors) / sizeof(errors[0]); i++) {
68     std::string f = errors[i];
69     ASSERT_TRUE(!ParseFileName(f, &number, &type)) << f;
70   }
71 }
72 
TEST(FileNameTest,Construction)73 TEST(FileNameTest, Construction) {
74   uint64_t number;
75   FileType type;
76   std::string fname;
77 
78   fname = CurrentFileName("foo");
79   ASSERT_EQ("foo/", std::string(fname.data(), 4));
80   ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type));
81   ASSERT_EQ(0, number);
82   ASSERT_EQ(kCurrentFile, type);
83 
84   fname = LockFileName("foo");
85   ASSERT_EQ("foo/", std::string(fname.data(), 4));
86   ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type));
87   ASSERT_EQ(0, number);
88   ASSERT_EQ(kDBLockFile, type);
89 
90   fname = LogFileName("foo", 192);
91   ASSERT_EQ("foo/", std::string(fname.data(), 4));
92   ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type));
93   ASSERT_EQ(192, number);
94   ASSERT_EQ(kLogFile, type);
95 
96   fname = TableFileName("bar", 200);
97   ASSERT_EQ("bar/", std::string(fname.data(), 4));
98   ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type));
99   ASSERT_EQ(200, number);
100   ASSERT_EQ(kTableFile, type);
101 
102   fname = DescriptorFileName("bar", 100);
103   ASSERT_EQ("bar/", std::string(fname.data(), 4));
104   ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type));
105   ASSERT_EQ(100, number);
106   ASSERT_EQ(kDescriptorFile, type);
107 
108   fname = TempFileName("tmp", 999);
109   ASSERT_EQ("tmp/", std::string(fname.data(), 4));
110   ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type));
111   ASSERT_EQ(999, number);
112   ASSERT_EQ(kTempFile, type);
113 
114   fname = InfoLogFileName("foo");
115   ASSERT_EQ("foo/", std::string(fname.data(), 4));
116   ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type));
117   ASSERT_EQ(0, number);
118   ASSERT_EQ(kInfoLogFile, type);
119 
120   fname = OldInfoLogFileName("foo");
121   ASSERT_EQ("foo/", std::string(fname.data(), 4));
122   ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type));
123   ASSERT_EQ(0, number);
124   ASSERT_EQ(kInfoLogFile, type);
125 }
126 
127 }  // namespace leveldb
128 
129