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