Skip to content

Commit ce23ff9

Browse files
committed
Add initial unit tests.
A few simple unit tests to ensure that signing and verification works.
1 parent 826c84b commit ce23ff9

File tree

3 files changed

+196
-0
lines changed

3 files changed

+196
-0
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ ExternalProject_Add(gtest
8181
)
8282

8383
enable_testing()
84+
add_subdirectory(test)
8485
endif()
8586

8687
install(

test/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
add_executable(scitokens-gtest main.cpp)
3+
add_dependencies(scitokens-gtest gtest)
4+
include_directories("${PROJECT_SOURCE_DIR}/vendor/gtest/googletest/include")
5+
6+
target_link_libraries(scitokens-gtest SciTokens "${CMAKE_BINARY_DIR}/external/gtest/src/gtest-build/lib/libgtest.a")

test/main.cpp

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
#include "../src/scitokens.h"
2+
3+
#include <gtest/gtest.h>
4+
5+
namespace {
6+
7+
const char ec_private[] = "-----BEGIN EC PRIVATE KEY-----\n"
8+
"MHcCAQEEIESSMxT7PLTR9A/aqd+CM0/6vv6fQWqDm0mNx8uE9EbpoAoGCCqGSM49\n"
9+
"AwEHoUQDQgAE1i+ImZ//iQhOPh0OMfZzdbmPH+3G1ouWezolCugQYWIRqNmwq3zR\n"
10+
"EnTbe4EmymTpJ1MJTPP/tCEUP3G/QqQuhA==\n"
11+
"-----END EC PRIVATE KEY-----\n";
12+
13+
const char ec_public[] = "-----BEGIN PUBLIC KEY-----\n"
14+
"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1i+ImZ//iQhOPh0OMfZzdbmPH+3G\n"
15+
"1ouWezolCugQYWIRqNmwq3zREnTbe4EmymTpJ1MJTPP/tCEUP3G/QqQuhA==\n"
16+
"-----END PUBLIC KEY-----\n";
17+
18+
const char ec_private_2[] = "-----BEGIN EC PRIVATE KEY-----\n"
19+
"MHcCAQEEIJH6NpWPHcM7wxL/bv89Nezug+KEUQjI9fZxhrBHNA1ioAoGCCqGSM49\n"
20+
"AwEHoUQDQgAEb8M7AxRN+DmbfYOoA6DeHCcSeA+kXWCq4E/g2ME/uBOdP8RE0tql\n"
21+
"e8fxYcaPikgMcppGq2ycTiLGgEYXgsq2JA==\n"
22+
"-----END EC PRIVATE KEY-----\n";
23+
24+
const char ec_public_2[] = "-----BEGIN PUBLIC KEY-----\n"
25+
"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEb8M7AxRN+DmbfYOoA6DeHCcSeA+k\n"
26+
"XWCq4E/g2ME/uBOdP8RE0tqle8fxYcaPikgMcppGq2ycTiLGgEYXgsq2JA==\n"
27+
"-----END PUBLIC KEY-----\n";
28+
29+
TEST(SciTokenTest, CreateToken) {
30+
SciToken token = scitoken_create(nullptr);
31+
ASSERT_TRUE(token != nullptr);
32+
scitoken_destroy(token);
33+
}
34+
35+
TEST(SciTokenTest, SignToken) {
36+
char *err_msg;
37+
38+
std::unique_ptr<void, decltype(&scitoken_key_destroy)> mykey(
39+
scitoken_key_create("1", "ES256", ec_public, ec_private, &err_msg),
40+
scitoken_key_destroy);
41+
ASSERT_TRUE(mykey.get() != nullptr);
42+
43+
std::unique_ptr<void, decltype(&scitoken_destroy)>
44+
mytoken(scitoken_create(mykey.get()), scitoken_destroy);
45+
ASSERT_TRUE(mytoken.get() != nullptr);
46+
47+
auto rv = scitoken_set_claim_string(mytoken.get(), "iss",
48+
"https://demo.scitokens.org/gtest", &err_msg);
49+
ASSERT_TRUE(rv == 0);
50+
51+
char *value;
52+
rv = scitoken_serialize(mytoken.get(), &value, &err_msg);
53+
ASSERT_TRUE(rv == 0);
54+
EXPECT_TRUE(value != nullptr);
55+
std::unique_ptr<char, decltype(&free)> value_ptr(value, free);
56+
57+
ASSERT_TRUE(strlen(value) > 50);
58+
}
59+
60+
61+
class SerializeTest : public ::testing::Test {
62+
protected:
63+
void SetUp() override {
64+
char *err_msg;
65+
m_key = KeyPtr(scitoken_key_create("1", "ES256", ec_public, ec_private, &err_msg),
66+
scitoken_key_destroy);
67+
ASSERT_TRUE(m_key.get() != nullptr);
68+
69+
m_token = TokenPtr(scitoken_create(m_key.get()), scitoken_destroy);
70+
ASSERT_TRUE(m_token.get() != nullptr);
71+
72+
auto rv = scitoken_set_claim_string(m_token.get(), "iss",
73+
"https://demo.scitokens.org/gtest", &err_msg);
74+
ASSERT_TRUE(rv == 0);
75+
76+
rv = scitoken_store_public_ec_key("https://demo.scitokens.org/gtest",
77+
"1", ec_public, &err_msg);
78+
ASSERT_TRUE(rv == 0);
79+
80+
m_read_token.reset(scitoken_create(nullptr));
81+
ASSERT_TRUE(m_read_token.get() != nullptr);
82+
}
83+
84+
using KeyPtr = std::unique_ptr<void, decltype(&scitoken_key_destroy)>;
85+
KeyPtr m_key{nullptr, scitoken_key_destroy};
86+
87+
using TokenPtr = std::unique_ptr<void, decltype(&scitoken_destroy)>;
88+
TokenPtr m_token{nullptr, scitoken_destroy};
89+
90+
TokenPtr m_read_token{nullptr, scitoken_destroy};
91+
};
92+
93+
94+
TEST_F(SerializeTest, VerifyTest) {
95+
96+
char *err_msg = nullptr;
97+
98+
char *token_value = nullptr;
99+
auto rv = scitoken_serialize(m_token.get(), &token_value, &err_msg);
100+
ASSERT_TRUE(rv == 0);
101+
std::unique_ptr<char, decltype(&free)> token_value_ptr(token_value, free);
102+
103+
rv = scitoken_deserialize_v2(token_value, m_read_token.get(), nullptr, &err_msg);
104+
ASSERT_TRUE(rv == 0);
105+
106+
char *value;
107+
rv = scitoken_get_claim_string(m_read_token.get(), "iss", &value, &err_msg);
108+
ASSERT_TRUE(value != nullptr);
109+
ASSERT_TRUE(rv == 0);
110+
std::unique_ptr<char, decltype(&free)> value_ptr(value, free);
111+
EXPECT_STREQ(value, "https://demo.scitokens.org/gtest");
112+
113+
value_ptr.reset();
114+
rv = scitoken_get_claim_string(m_read_token.get(), "doesnotexist", &value, &err_msg);
115+
EXPECT_FALSE(rv == 0);
116+
}
117+
118+
119+
TEST_F(SerializeTest, VerifyWLCGTest) {
120+
121+
char *err_msg = nullptr;
122+
123+
char *token_value = nullptr;
124+
scitoken_set_serialize_profile(m_token.get(), SciTokenProfile::WLCG_1_0);
125+
auto rv = scitoken_serialize(m_token.get(), &token_value, &err_msg);
126+
ASSERT_TRUE(rv == 0);
127+
std::unique_ptr<char, decltype(&free)> token_value_ptr(token_value, free);
128+
129+
// Accepts any profile.
130+
rv = scitoken_deserialize_v2(token_value, m_read_token.get(), nullptr, &err_msg);
131+
ASSERT_TRUE(rv == 0);
132+
133+
char *value;
134+
rv = scitoken_get_claim_string(m_read_token.get(), "wlcg.ver", &value, &err_msg);
135+
ASSERT_TRUE(rv == 0);
136+
ASSERT_TRUE(value != nullptr);
137+
std::unique_ptr<char, decltype(&free)> value_ptr(value, free);
138+
EXPECT_STREQ(value, "1.0");
139+
140+
value_ptr.reset();
141+
rv = scitoken_get_claim_string(m_read_token.get(), "ver", &value, &err_msg);
142+
EXPECT_FALSE(rv == 0);
143+
144+
// Accepts only a WLCG token
145+
scitoken_set_deserialize_profile(m_read_token.get(), SciTokenProfile::WLCG_1_0);
146+
rv = scitoken_deserialize_v2(token_value, m_read_token.get(), nullptr, &err_msg);
147+
ASSERT_TRUE(rv == 0);
148+
149+
// Accepts only SciToken 1.0; should fail.
150+
scitoken_set_deserialize_profile(m_read_token.get(), SciTokenProfile::SCITOKENS_1_0);
151+
rv = scitoken_deserialize_v2(token_value, m_read_token.get(), nullptr, &err_msg);
152+
ASSERT_FALSE(rv == 0);
153+
}
154+
155+
156+
TEST_F(SerializeTest, FailVerifyToken) {
157+
char *err_msg;
158+
159+
std::unique_ptr<void, decltype(&scitoken_key_destroy)> mykey(
160+
scitoken_key_create("1", "ES256", ec_public_2, ec_private_2, &err_msg),
161+
scitoken_key_destroy);
162+
ASSERT_TRUE(mykey.get() != nullptr);
163+
164+
std::unique_ptr<void, decltype(&scitoken_destroy)>
165+
mytoken(scitoken_create(mykey.get()), scitoken_destroy);
166+
ASSERT_TRUE(mytoken.get() != nullptr);
167+
168+
auto rv = scitoken_set_claim_string(mytoken.get(), "iss",
169+
"https://demo.scitokens.org/gtest", &err_msg);
170+
ASSERT_TRUE(rv == 0);
171+
172+
char *value;
173+
rv = scitoken_serialize(mytoken.get(), &value, &err_msg);
174+
ASSERT_TRUE(rv == 0);
175+
EXPECT_TRUE(value != nullptr);
176+
std::unique_ptr<char, decltype(&free)> value_ptr(value, free);
177+
EXPECT_TRUE(strlen(value) > 50);
178+
179+
// Should fail; we signed it with the wrong public key.
180+
rv = scitoken_deserialize_v2(value, m_read_token.get(), nullptr, &err_msg);
181+
EXPECT_FALSE(rv == 0);
182+
}
183+
184+
}
185+
186+
int main(int argc, char **argv) {
187+
::testing::InitGoogleTest(&argc, argv);
188+
return RUN_ALL_TESTS();
189+
}

0 commit comments

Comments
 (0)