mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-20 00:51:42 +00:00
Implement independent instances.
Previously, most of the classes were implemented as singletons so only one
instance was possible.
This change adds an instance handle-based API. In Java, this API is located
in a different package than the old API (edu.wpi.first.networktables).
Backwards compatibility with ITable and the old NetworkTable API is largely
maintained, but a handful of classes have moved to the new package in Java
(ConnectionInfo and PersistentException), and the old JNI has been completed
replaced.
Also:
- Move SetTeam implementation to Dispatcher.
- Consistently pass time through Java and C++ Value API.
- Rename nt_Value.h to NetworkTableValue.h for consistency with Java.
- Improve documentation
- Make C++ and Java APIs more consistent
- Document RPC functions and support RPC in Java.
- Add polling features for entry and connection listeners and use them to
move callback threads to Java level.
- Remove thread start and stop hooks (as polling is available).
- Make Notifiers, RpcServer, Dispatcher, and Storage mockable.
- Set NOTIFY_NEW on immediate entry notifications.
- Make GetTable("/") and GetTable("") equivalent.
- Generate local notification for flags update when loading persistent file.
And many unit test updates/changes:
- Use InitGoogleMock instead of InitGoogleTest in test main.
- Move test printers to TestPrinter.h/cpp.
- Provide printers for StringRef, EntryNotifier, and Handle.
- StorageTest: Check notifications.
- Add entry notifier unit tests.
- Storage: Add test for incoming entry assignment.
- Update connection listener tests.
- Add entry listener unit tests.
Fixes #11, #140, #189, #190, #192, #193, #221
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
#include "WireDecoder.h"
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
#include "TestPrinters.h"
|
||||
|
||||
#include <cfloat>
|
||||
#include <climits>
|
||||
@@ -64,21 +65,24 @@ class WireDecoderTest : public ::testing::Test {
|
||||
|
||||
TEST_F(WireDecoderTest, Construct) {
|
||||
wpi::raw_mem_istream is("", 0);
|
||||
WireDecoder d(is, 0x0300u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0300u, logger);
|
||||
EXPECT_EQ(nullptr, d.error());
|
||||
EXPECT_EQ(0x0300u, d.proto_rev());
|
||||
}
|
||||
|
||||
TEST_F(WireDecoderTest, SetProtoRev) {
|
||||
wpi::raw_mem_istream is("", 0);
|
||||
WireDecoder d(is, 0x0300u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0300u, logger);
|
||||
d.set_proto_rev(0x0200u);
|
||||
EXPECT_EQ(0x0200u, d.proto_rev());
|
||||
}
|
||||
|
||||
TEST_F(WireDecoderTest, Read8) {
|
||||
wpi::raw_mem_istream is("\x05\x01\x00", 3);
|
||||
WireDecoder d(is, 0x0300u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0300u, logger);
|
||||
unsigned int val;
|
||||
ASSERT_TRUE(d.Read8(&val));
|
||||
EXPECT_EQ(5u, val);
|
||||
@@ -92,7 +96,8 @@ TEST_F(WireDecoderTest, Read8) {
|
||||
|
||||
TEST_F(WireDecoderTest, Read16) {
|
||||
wpi::raw_mem_istream is("\x00\x05\x00\x01\x45\x67\x00\x00", 8);
|
||||
WireDecoder d(is, 0x0300u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0300u, logger);
|
||||
unsigned int val;
|
||||
ASSERT_TRUE(d.Read16(&val));
|
||||
EXPECT_EQ(5u, val);
|
||||
@@ -111,7 +116,8 @@ TEST_F(WireDecoderTest, Read32) {
|
||||
"\x00\x00\x00\x05\x00\x00\x00\x01\x00\x00\xab\xcd"
|
||||
"\x12\x34\x56\x78\x00\x00\x00\x00",
|
||||
20);
|
||||
WireDecoder d(is, 0x0300u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0300u, logger);
|
||||
unsigned long val;
|
||||
ASSERT_TRUE(d.Read32(&val));
|
||||
EXPECT_EQ(5ul, val);
|
||||
@@ -137,7 +143,8 @@ TEST_F(WireDecoderTest, ReadDouble) {
|
||||
"\x00\x10\x00\x00\x00\x00\x00\x00"
|
||||
"\x7f\xef\xff\xff\xff\xff\xff\xff",
|
||||
40);
|
||||
WireDecoder d(is, 0x0300u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0300u, logger);
|
||||
double val;
|
||||
ASSERT_TRUE(d.ReadDouble(&val));
|
||||
EXPECT_EQ(0.0, val);
|
||||
@@ -155,7 +162,8 @@ TEST_F(WireDecoderTest, ReadDouble) {
|
||||
|
||||
TEST_F(WireDecoderTest, ReadUleb128) {
|
||||
wpi::raw_mem_istream is("\x00\x7f\x80\x01\x80", 5);
|
||||
WireDecoder d(is, 0x0300u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0300u, logger);
|
||||
unsigned long val;
|
||||
ASSERT_TRUE(d.ReadUleb128(&val));
|
||||
EXPECT_EQ(0ul, val);
|
||||
@@ -169,7 +177,8 @@ TEST_F(WireDecoderTest, ReadUleb128) {
|
||||
|
||||
TEST_F(WireDecoderTest, ReadType) {
|
||||
wpi::raw_mem_istream is("\x00\x01\x02\x03\x10\x11\x12\x20", 8);
|
||||
WireDecoder d(is, 0x0300u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0300u, logger);
|
||||
NT_Type val;
|
||||
ASSERT_TRUE(d.ReadType(&val));
|
||||
EXPECT_EQ(NT_BOOLEAN, val);
|
||||
@@ -193,7 +202,8 @@ TEST_F(WireDecoderTest, ReadType) {
|
||||
|
||||
TEST_F(WireDecoderTest, ReadTypeError) {
|
||||
wpi::raw_mem_istream is("\x30", 1);
|
||||
WireDecoder d(is, 0x0200u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0200u, logger);
|
||||
NT_Type val;
|
||||
ASSERT_FALSE(d.ReadType(&val));
|
||||
EXPECT_EQ(NT_UNASSIGNED, val);
|
||||
@@ -202,7 +212,8 @@ TEST_F(WireDecoderTest, ReadTypeError) {
|
||||
|
||||
TEST_F(WireDecoderTest, Reset) {
|
||||
wpi::raw_mem_istream is("\x30", 1);
|
||||
WireDecoder d(is, 0x0200u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0200u, logger);
|
||||
NT_Type val;
|
||||
ASSERT_FALSE(d.ReadType(&val));
|
||||
EXPECT_EQ(NT_UNASSIGNED, val);
|
||||
@@ -213,7 +224,8 @@ TEST_F(WireDecoderTest, Reset) {
|
||||
|
||||
TEST_F(WireDecoderTest, ReadBooleanValue2) {
|
||||
wpi::raw_mem_istream is("\x01\x00", 2);
|
||||
WireDecoder d(is, 0x0200u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0200u, logger);
|
||||
auto val = d.ReadValue(NT_BOOLEAN);
|
||||
ASSERT_TRUE(bool(val));
|
||||
EXPECT_EQ(*v_boolean, *val);
|
||||
@@ -232,7 +244,8 @@ TEST_F(WireDecoderTest, ReadDoubleValue2) {
|
||||
"\x3f\xf0\x00\x00\x00\x00\x00\x00"
|
||||
"\x3f\xf0\x00\x00\x00\x00\x00\x00",
|
||||
16);
|
||||
WireDecoder d(is, 0x0200u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0200u, logger);
|
||||
auto val = d.ReadValue(NT_DOUBLE);
|
||||
ASSERT_TRUE(bool(val));
|
||||
EXPECT_EQ(*v_double, *val);
|
||||
@@ -247,7 +260,8 @@ TEST_F(WireDecoderTest, ReadDoubleValue2) {
|
||||
|
||||
TEST_F(WireDecoderTest, ReadStringValue2) {
|
||||
wpi::raw_mem_istream is("\x00\x05hello\x00\x03" "bye\x55", 13);
|
||||
WireDecoder d(is, 0x0200u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0200u, logger);
|
||||
auto val = d.ReadValue(NT_STRING);
|
||||
ASSERT_TRUE(bool(val));
|
||||
EXPECT_EQ(*v_string, *val);
|
||||
@@ -267,7 +281,8 @@ TEST_F(WireDecoderTest, ReadStringValue2) {
|
||||
|
||||
TEST_F(WireDecoderTest, ReadBooleanArrayValue2) {
|
||||
wpi::raw_mem_istream is("\x03\x00\x01\x00\x02\x01\x00\xff", 8);
|
||||
WireDecoder d(is, 0x0200u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0200u, logger);
|
||||
auto val = d.ReadValue(NT_BOOLEAN_ARRAY);
|
||||
ASSERT_TRUE(bool(val));
|
||||
EXPECT_EQ(*v_boolean_array, *val);
|
||||
@@ -286,7 +301,8 @@ TEST_F(WireDecoderTest, ReadBooleanArrayBigValue2) {
|
||||
s.push_back('\xff');
|
||||
s.append(255, '\x00');
|
||||
wpi::raw_mem_istream is(s.data(), s.size());
|
||||
WireDecoder d(is, 0x0200u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0200u, logger);
|
||||
auto val = d.ReadValue(NT_BOOLEAN_ARRAY);
|
||||
ASSERT_TRUE(bool(val));
|
||||
EXPECT_EQ(*v_boolean_array_big, *val);
|
||||
@@ -300,7 +316,8 @@ TEST_F(WireDecoderTest, ReadDoubleArrayValue2) {
|
||||
"\x02\x3f\xe0\x00\x00\x00\x00\x00\x00"
|
||||
"\x3f\xd0\x00\x00\x00\x00\x00\x00\x55",
|
||||
18);
|
||||
WireDecoder d(is, 0x0200u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0200u, logger);
|
||||
auto val = d.ReadValue(NT_DOUBLE_ARRAY);
|
||||
ASSERT_TRUE(bool(val));
|
||||
EXPECT_EQ(*v_double_array, *val);
|
||||
@@ -318,7 +335,8 @@ TEST_F(WireDecoderTest, ReadDoubleArrayBigValue2) {
|
||||
s.push_back('\xff');
|
||||
s.append(255*8, '\x00');
|
||||
wpi::raw_mem_istream is(s.data(), s.size());
|
||||
WireDecoder d(is, 0x0200u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0200u, logger);
|
||||
auto val = d.ReadValue(NT_DOUBLE_ARRAY);
|
||||
ASSERT_TRUE(bool(val));
|
||||
EXPECT_EQ(*v_double_array_big, *val);
|
||||
@@ -329,7 +347,8 @@ TEST_F(WireDecoderTest, ReadDoubleArrayBigValue2) {
|
||||
|
||||
TEST_F(WireDecoderTest, ReadStringArrayValue2) {
|
||||
wpi::raw_mem_istream is("\x02\x00\x05hello\x00\x07goodbye\x55", 18);
|
||||
WireDecoder d(is, 0x0200u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0200u, logger);
|
||||
auto val = d.ReadValue(NT_STRING_ARRAY);
|
||||
ASSERT_TRUE(bool(val));
|
||||
EXPECT_EQ(*v_string_array, *val);
|
||||
@@ -348,7 +367,8 @@ TEST_F(WireDecoderTest, ReadStringArrayBigValue2) {
|
||||
for (int i=0; i<255; ++i)
|
||||
s.append("\x00\x01h", 3);
|
||||
wpi::raw_mem_istream is(s.data(), s.size());
|
||||
WireDecoder d(is, 0x0200u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0200u, logger);
|
||||
auto val = d.ReadValue(NT_STRING_ARRAY);
|
||||
ASSERT_TRUE(bool(val));
|
||||
EXPECT_EQ(*v_string_array_big, *val);
|
||||
@@ -359,7 +379,8 @@ TEST_F(WireDecoderTest, ReadStringArrayBigValue2) {
|
||||
|
||||
TEST_F(WireDecoderTest, ReadValueError2) {
|
||||
wpi::raw_mem_istream is("", 0);
|
||||
WireDecoder d(is, 0x0200u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0200u, logger);
|
||||
ASSERT_FALSE(d.ReadValue(NT_UNASSIGNED)); // unassigned
|
||||
ASSERT_NE(nullptr, d.error());
|
||||
|
||||
@@ -374,7 +395,8 @@ TEST_F(WireDecoderTest, ReadValueError2) {
|
||||
|
||||
TEST_F(WireDecoderTest, ReadBooleanValue3) {
|
||||
wpi::raw_mem_istream is("\x01\x00", 2);
|
||||
WireDecoder d(is, 0x0300u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0300u, logger);
|
||||
auto val = d.ReadValue(NT_BOOLEAN);
|
||||
ASSERT_TRUE(bool(val));
|
||||
EXPECT_EQ(*v_boolean, *val);
|
||||
@@ -393,7 +415,8 @@ TEST_F(WireDecoderTest, ReadDoubleValue3) {
|
||||
"\x3f\xf0\x00\x00\x00\x00\x00\x00"
|
||||
"\x3f\xf0\x00\x00\x00\x00\x00\x00",
|
||||
16);
|
||||
WireDecoder d(is, 0x0300u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0300u, logger);
|
||||
auto val = d.ReadValue(NT_DOUBLE);
|
||||
ASSERT_TRUE(bool(val));
|
||||
EXPECT_EQ(*v_double, *val);
|
||||
@@ -408,7 +431,8 @@ TEST_F(WireDecoderTest, ReadDoubleValue3) {
|
||||
|
||||
TEST_F(WireDecoderTest, ReadStringValue3) {
|
||||
wpi::raw_mem_istream is("\x05hello\x03" "bye\x55", 11);
|
||||
WireDecoder d(is, 0x0300u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0300u, logger);
|
||||
auto val = d.ReadValue(NT_STRING);
|
||||
ASSERT_TRUE(bool(val));
|
||||
EXPECT_EQ(*v_string, *val);
|
||||
@@ -428,7 +452,8 @@ TEST_F(WireDecoderTest, ReadStringValue3) {
|
||||
|
||||
TEST_F(WireDecoderTest, ReadRawValue3) {
|
||||
wpi::raw_mem_istream is("\x05hello\x03" "bye\x55", 11);
|
||||
WireDecoder d(is, 0x0300u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0300u, logger);
|
||||
auto val = d.ReadValue(NT_RAW);
|
||||
ASSERT_TRUE(bool(val));
|
||||
EXPECT_EQ(*v_raw, *val);
|
||||
@@ -448,7 +473,8 @@ TEST_F(WireDecoderTest, ReadRawValue3) {
|
||||
|
||||
TEST_F(WireDecoderTest, ReadBooleanArrayValue3) {
|
||||
wpi::raw_mem_istream is("\x03\x00\x01\x00\x02\x01\x00\xff", 8);
|
||||
WireDecoder d(is, 0x0300u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0300u, logger);
|
||||
auto val = d.ReadValue(NT_BOOLEAN_ARRAY);
|
||||
ASSERT_TRUE(bool(val));
|
||||
EXPECT_EQ(*v_boolean_array, *val);
|
||||
@@ -467,7 +493,8 @@ TEST_F(WireDecoderTest, ReadBooleanArrayBigValue3) {
|
||||
s.push_back('\xff');
|
||||
s.append(255, '\x00');
|
||||
wpi::raw_mem_istream is(s.data(), s.size());
|
||||
WireDecoder d(is, 0x0300u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0300u, logger);
|
||||
auto val = d.ReadValue(NT_BOOLEAN_ARRAY);
|
||||
ASSERT_TRUE(bool(val));
|
||||
EXPECT_EQ(*v_boolean_array_big, *val);
|
||||
@@ -481,7 +508,8 @@ TEST_F(WireDecoderTest, ReadDoubleArrayValue3) {
|
||||
"\x02\x3f\xe0\x00\x00\x00\x00\x00\x00"
|
||||
"\x3f\xd0\x00\x00\x00\x00\x00\x00\x55",
|
||||
18);
|
||||
WireDecoder d(is, 0x0300u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0300u, logger);
|
||||
auto val = d.ReadValue(NT_DOUBLE_ARRAY);
|
||||
ASSERT_TRUE(bool(val));
|
||||
EXPECT_EQ(*v_double_array, *val);
|
||||
@@ -499,7 +527,8 @@ TEST_F(WireDecoderTest, ReadDoubleArrayBigValue3) {
|
||||
s.push_back('\xff');
|
||||
s.append(255*8, '\x00');
|
||||
wpi::raw_mem_istream is(s.data(), s.size());
|
||||
WireDecoder d(is, 0x0300u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0300u, logger);
|
||||
auto val = d.ReadValue(NT_DOUBLE_ARRAY);
|
||||
ASSERT_TRUE(bool(val));
|
||||
EXPECT_EQ(*v_double_array_big, *val);
|
||||
@@ -510,7 +539,8 @@ TEST_F(WireDecoderTest, ReadDoubleArrayBigValue3) {
|
||||
|
||||
TEST_F(WireDecoderTest, ReadStringArrayValue3) {
|
||||
wpi::raw_mem_istream is("\x02\x05hello\x07goodbye\x55", 16);
|
||||
WireDecoder d(is, 0x0300u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0300u, logger);
|
||||
auto val = d.ReadValue(NT_STRING_ARRAY);
|
||||
ASSERT_TRUE(bool(val));
|
||||
EXPECT_EQ(*v_string_array, *val);
|
||||
@@ -529,7 +559,8 @@ TEST_F(WireDecoderTest, ReadStringArrayBigValue3) {
|
||||
for (int i=0; i<255; ++i)
|
||||
s.append("\x01h", 2);
|
||||
wpi::raw_mem_istream is(s.data(), s.size());
|
||||
WireDecoder d(is, 0x0300u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0300u, logger);
|
||||
auto val = d.ReadValue(NT_STRING_ARRAY);
|
||||
ASSERT_TRUE(bool(val));
|
||||
EXPECT_EQ(*v_string_array_big, *val);
|
||||
@@ -540,7 +571,8 @@ TEST_F(WireDecoderTest, ReadStringArrayBigValue3) {
|
||||
|
||||
TEST_F(WireDecoderTest, ReadValueError3) {
|
||||
wpi::raw_mem_istream is("", 0);
|
||||
WireDecoder d(is, 0x0200u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0200u, logger);
|
||||
ASSERT_FALSE(d.ReadValue(NT_UNASSIGNED)); // unassigned
|
||||
ASSERT_NE(nullptr, d.error());
|
||||
}
|
||||
@@ -555,7 +587,8 @@ TEST_F(WireDecoderTest, ReadString2) {
|
||||
s += s_big2;
|
||||
s.push_back('\x55');
|
||||
wpi::raw_mem_istream is(s.data(), s.size());
|
||||
WireDecoder d(is, 0x0200u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0200u, logger);
|
||||
std::string outs;
|
||||
ASSERT_TRUE(d.ReadString(&outs));
|
||||
EXPECT_EQ(s_normal, outs);
|
||||
@@ -582,7 +615,8 @@ TEST_F(WireDecoderTest, ReadString3) {
|
||||
s += s_big3;
|
||||
s.push_back('\x55');
|
||||
wpi::raw_mem_istream is(s.data(), s.size());
|
||||
WireDecoder d(is, 0x0300u);
|
||||
wpi::Logger logger;
|
||||
WireDecoder d(is, 0x0300u, logger);
|
||||
std::string outs;
|
||||
ASSERT_TRUE(d.ReadString(&outs));
|
||||
EXPECT_EQ(s_normal, outs);
|
||||
|
||||
Reference in New Issue
Block a user