Perparation work for the metadata module.

Signed-off-by: Adam Rocska <adam.rocska@adams.solutions>
This commit is contained in:
Adam Rocska 2020-05-11 13:20:08 +02:00
parent 07a8298fc4
commit bcd1c7e023
5 changed files with 25 additions and 57 deletions

View File

@ -27,6 +27,11 @@ let package = Package(
dependencies: ["MaxMindDecoder"],
path: "Sources/Index"
),
.target(
name: "Metadata",
dependencies: ["MaxMindDecoder"],
path: "Sources/Metadata"
),
.target(
name: "MaxMindDBReader",
@ -54,6 +59,11 @@ let package = Package(
dependencies: ["Index"]
),
.testTarget(
name: "MetadataTests",
dependencies: ["Metadata"]
),
.testTarget(
name: "MaxMindDecoderTests",
dependencies: ["MaxMindDecoder"]

View File

@ -10,7 +10,7 @@ public class InMemoryReader {
private let databaseContent: Data
private let indexRange: Range<Data.Index>
let metadata: Metadata
let metadata: MetadataStruct
public init(data: Data) throws {
databaseContent = data

View File

@ -17,8 +17,3 @@ public protocol Metadata {
var searchTreeSize: UInt64 { get }
}
public extension Metadata {
var nodeByteSize: UInt16 { get { return recordSize / 4 } }
var searchTreeSize: UInt64 { get { return UInt64(nodeCount * UInt32(nodeByteSize)) } }
}

View File

@ -1,7 +1,7 @@
import Foundation
import MaxMindDecoder
struct MetadataStruct: Metadata {
struct MetadataStruct {
let nodeCount: UInt32
let recordSize: UInt16
let ipVersion: UInt16
@ -11,6 +11,8 @@ struct MetadataStruct: Metadata {
let binaryFormatMinorVersion: UInt16
let buildEpoch: UInt64
let description: LanguageToDescription
var nodeByteSize: UInt16 { get { return recordSize / 4 } }
var searchTreeSize: UInt64 { get { return UInt64(nodeCount * UInt32(nodeByteSize)) } }
init?(_ iterator: MaxMindIterator) {
guard let mapControlByte = iterator.next() else { return nil }

View File

@ -3,58 +3,17 @@ import XCTest
@testable import MaxMindDBReader
import MaxMindDecoder
fileprivate struct MetadataTestImpl: Metadata {
let nodeCount: UInt32
let recordSize: UInt16
let ipVersion: UInt16 = 4
let databaseType: String = ""
let languages: [String] = [""]
let binaryFormatMajorVersion: UInt16 = 1
let binaryFormatMinorVersion: UInt16 = 3
let buildEpoch: UInt64 = 1588065718
let description: LanguageToDescription = [:]
}
class MetadataStructTest: XCTestCase {
private func assertCalculatedValues(nodeCount: UInt32, recordSize: UInt16) {
let expectedNodeByteSize: UInt16 = recordSize / 4
let expectedSearchTreeSize = UInt64(nodeCount * UInt32(expectedNodeByteSize))
XCTAssertEqual(
expectedNodeByteSize,
MetadataTestImpl(
nodeCount: nodeCount,
recordSize: recordSize
).nodeByteSize
)
XCTAssertEqual(
expectedSearchTreeSize,
MetadataTestImpl(
nodeCount: nodeCount,
recordSize: recordSize
).searchTreeSize
)
}
func testCalculatedValues() {
assertCalculatedValues(nodeCount: 3, recordSize: 3)
assertCalculatedValues(nodeCount: 3, recordSize: 10)
assertCalculatedValues(nodeCount: 3, recordSize: 100)
assertCalculatedValues(nodeCount: 3, recordSize: 1000)
assertCalculatedValues(nodeCount: 3, recordSize: 1000)
assertCalculatedValues(nodeCount: 3, recordSize: 10000)
assertCalculatedValues(nodeCount: 5, recordSize: 3)
assertCalculatedValues(nodeCount: 5, recordSize: 10)
assertCalculatedValues(nodeCount: 5, recordSize: 100)
assertCalculatedValues(nodeCount: 5, recordSize: 1000)
assertCalculatedValues(nodeCount: 5, recordSize: 1000)
assertCalculatedValues(nodeCount: 5, recordSize: 10000)
assertCalculatedValues(nodeCount: 500, recordSize: 3)
assertCalculatedValues(nodeCount: 500, recordSize: 10)
assertCalculatedValues(nodeCount: 500, recordSize: 100)
assertCalculatedValues(nodeCount: 500, recordSize: 1000)
assertCalculatedValues(nodeCount: 500, recordSize: 1000)
assertCalculatedValues(nodeCount: 500, recordSize: 10000)
private func assertCalculatedValues(
_ metadata: MetadataStruct,
file: StaticString = #file,
line: UInt = #line
) {
let expectedNodeByteSize: UInt16 = metadata.recordSize / 4
let expectedSearchTreeSize = UInt64(metadata.nodeCount * UInt32(expectedNodeByteSize))
XCTAssertEqual(expectedNodeByteSize, metadata.nodeByteSize, file: file, line: line)
XCTAssertEqual(expectedSearchTreeSize, metadata.searchTreeSize, file: file, line: line)
}
func testInit_nilIfCantCreateIterator() {
@ -88,6 +47,7 @@ class MetadataStructTest: XCTestCase {
XCTAssertEqual(["en": "GeoLite2 Country database"], metadata.description)
XCTAssertEqual(6, metadata.nodeByteSize)
XCTAssertEqual(3710754, metadata.searchTreeSize)
assertCalculatedValues(metadata)
}
func testInit_withIterator() {
@ -111,6 +71,7 @@ class MetadataStructTest: XCTestCase {
XCTAssertEqual(["en": "GeoLite2 Country database"], metadata.description)
XCTAssertEqual(6, metadata.nodeByteSize)
XCTAssertEqual(3710754, metadata.searchTreeSize)
assertCalculatedValues(metadata)
}
}