working on testing the phonebook
This commit is contained in:
parent
5d2e255bea
commit
82f5e32ddb
|
@ -2,5 +2,8 @@
|
||||||
*.o
|
*.o
|
||||||
*.bin
|
*.bin
|
||||||
build
|
build
|
||||||
|
core
|
||||||
|
core.*
|
||||||
cmake-build-*
|
cmake-build-*
|
||||||
|
phonebook_test
|
||||||
tlv_test
|
tlv_test
|
||||||
|
|
5
Makefile
5
Makefile
|
@ -1,5 +1,5 @@
|
||||||
TARGET := klib.a
|
TARGET := klib.a
|
||||||
TESTS := tlv_test
|
TESTS := tlv_test phonebook_test
|
||||||
HEADERS := $(wildcard *.h)
|
HEADERS := $(wildcard *.h)
|
||||||
SOURCES := $(wildcard *.cc)
|
SOURCES := $(wildcard *.cc)
|
||||||
OBJS := Arena.o Phonebook.o TLV.o
|
OBJS := Arena.o Phonebook.o TLV.o
|
||||||
|
@ -19,6 +19,9 @@ $(TARGET): $(OBJS)
|
||||||
tlv_test: tlv_test.o $(TARGET)
|
tlv_test: tlv_test.o $(TARGET)
|
||||||
$(CXX) -o $@ $(CXXFLAGS) $@.o $(TARGET)
|
$(CXX) -o $@ $(CXXFLAGS) $@.o $(TARGET)
|
||||||
|
|
||||||
|
phonebook_test: phonebook_test.o $(TARGET)
|
||||||
|
$(CXX) -o $@ $(CXXFLAGS) $@.o $(TARGET)
|
||||||
|
|
||||||
.PHONY: print-%
|
.PHONY: print-%
|
||||||
print-%: ; @echo '$(subst ','\'',$*=$($*))'
|
print-%: ; @echo '$(subst ','\'',$*=$($*))'
|
||||||
|
|
||||||
|
|
26
Phonebook.cc
26
Phonebook.cc
|
@ -26,7 +26,7 @@ Phonebook::lookup(const char *key, uint8_t klen, TLV::Record &res)
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
Phonebook::set(const char *key, uint8_t klen, char *val, uint8_t vlen)
|
Phonebook::set(const char *key, uint8_t klen, const char *val, uint8_t vlen)
|
||||||
{
|
{
|
||||||
TLV::Record rec;
|
TLV::Record rec;
|
||||||
uint8_t *cursor = NULL;
|
uint8_t *cursor = NULL;
|
||||||
|
@ -38,6 +38,10 @@ Phonebook::set(const char *key, uint8_t klen, char *val, uint8_t vlen)
|
||||||
TLV::delete_record(this->arena, cursor);
|
TLV::delete_record(this->arena, cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!space_available(klen, vlen)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
cursor = TLV::write_to_memory(this->arena, NULL, rec);
|
cursor = TLV::write_to_memory(this->arena, NULL, rec);
|
||||||
if (cursor == NULL) {
|
if (cursor == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -80,3 +84,23 @@ Phonebook::has(const char *key, uint8_t klen)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Phonebook::space_available(uint8_t kl, uint8_t vl)
|
||||||
|
{
|
||||||
|
size_t required = 0;
|
||||||
|
uintptr_t remaining = 0;
|
||||||
|
uint8_t *cursor = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
cursor = TLV::find_empty(this->arena, NULL);
|
||||||
|
if (cursor == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
required += kl + 2;
|
||||||
|
required += vl + 2;
|
||||||
|
|
||||||
|
remaining = (uintptr_t)cursor - (uintptr_t)arena.store;
|
||||||
|
remaining = arena.size - remaining;
|
||||||
|
return ((size_t)remaining >= required);
|
||||||
|
}
|
||||||
|
|
|
@ -23,11 +23,13 @@ public:
|
||||||
vtag(vt) {};
|
vtag(vt) {};
|
||||||
|
|
||||||
bool lookup(const char *key, uint8_t klen, TLV::Record &res);
|
bool lookup(const char *key, uint8_t klen, TLV::Record &res);
|
||||||
int set(const char *key, uint8_t klen, char *val, uint8_t vlen);
|
int set(const char *key, uint8_t klen, const char *val,
|
||||||
|
uint8_t vlen);
|
||||||
bool has(const char *key, uint8_t klen);
|
bool has(const char *key, uint8_t klen);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint8_t *seek(const char *key, uint8_t klen);
|
uint8_t *seek(const char *key, uint8_t klen);
|
||||||
|
bool space_available(uint8_t klen, uint8_t vlen);
|
||||||
|
|
||||||
Arena &arena;
|
Arena &arena;
|
||||||
uint8_t ktag;
|
uint8_t ktag;
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
#include <cassert>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "Arena.h"
|
||||||
|
#include "Phonebook.h"
|
||||||
|
#include "test_fixtures.h"
|
||||||
|
|
||||||
|
|
||||||
|
constexpr char TEST_PBSTR1[] = "foo";
|
||||||
|
constexpr uint8_t TEST_PBSTRLEN1 = 3;
|
||||||
|
constexpr char TEST_PBSTR2[] = "baz";
|
||||||
|
constexpr uint8_t TEST_PBSTRLEN2 = 3;
|
||||||
|
constexpr char TEST_PBSTR3[] = "quux";
|
||||||
|
constexpr uint8_t TEST_PBSTRLEN3 = 4;
|
||||||
|
/*
|
||||||
|
constexpr char TEST_PBSTR4[] = "spam";
|
||||||
|
constexpr uint8_t TEST_PBSTRLEN4 = 4;
|
||||||
|
constexpr char TEST_PBSTR5[] = "xyzzx";
|
||||||
|
constexpr uint8_t TEST_PBSTRLEN5 = 5;
|
||||||
|
constexpr char TEST_PBSTR6[] = "corvid";
|
||||||
|
constexpr uint8_t TEST_PBSTRLEN6 = 6;
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
test_setpb(Phonebook &pb, const char *k, uint8_t kl, const char *v,
|
||||||
|
uint8_t vl)
|
||||||
|
{
|
||||||
|
bool ok;
|
||||||
|
std::cout << "test set " << k << "->" << v << std::endl;
|
||||||
|
ok = pb.set(k, kl, v, vl) == 0;
|
||||||
|
std::cout << "\tset complete\n";
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, const char *argv[])
|
||||||
|
{
|
||||||
|
Arena arena;
|
||||||
|
//TLV::Record value;
|
||||||
|
//TLV::Record expect;
|
||||||
|
|
||||||
|
std::cout << "TESTPROG: " << argv[0] << std::endl;
|
||||||
|
if (create_arena(arena, ARENA_FILE, ARENA_SIZE, 0644) == -1) {
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
Phonebook pb(arena);
|
||||||
|
assert(!pb.has(TEST_PBSTR2, TEST_PBSTRLEN2));
|
||||||
|
|
||||||
|
assert(test_setpb(pb, TEST_PBSTR1, TEST_PBSTRLEN1, TEST_PBSTR3,
|
||||||
|
TEST_PBSTRLEN3));
|
||||||
|
assert(test_setpb(pb, TEST_PBSTR2, TEST_PBSTRLEN2, TEST_PBSTR3,
|
||||||
|
TEST_PBSTRLEN3));
|
||||||
|
|
||||||
|
std::cout << "OK" <<std::endl;
|
||||||
|
}
|
Loading…
Reference in New Issue