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
12namespace leveldb {
13
14TEST(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
73TEST(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