blob: 8df1a85e892efafd9bc04a2bd98ef2fe7109967e [file] [log] [blame]
Adam Cozzette501ecec2023-09-26 14:36:20 -07001// Protocol Buffers - Google's data interchange format
2// Copyright 2023 Google LLC. All rights reserved.
Adam Cozzette501ecec2023-09-26 14:36:20 -07003//
Hong Shin26dcf402023-11-15 17:15:11 -08004// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file or at
6// https://developers.google.com/open-source/licenses/bsd
Adam Cozzette501ecec2023-09-26 14:36:20 -07007
8#include <lauxlib.h>
9#include <lua.h>
10#include <lualib.h>
11#include <signal.h>
12
13#include "lua/upb.h"
14
15lua_State* L;
16
17static void interrupt(lua_State* L, lua_Debug* ar) {
18 (void)ar;
19 lua_sethook(L, NULL, 0, 0);
20 luaL_error(L, "SIGINT");
21}
22
23static void sighandler(int i) {
24 fprintf(stderr, "Signal!\n");
25 signal(i, SIG_DFL);
26 lua_sethook(L, interrupt, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1);
27}
28
29const char* init =
30 "package.preload['lupb'] = ... "
31 "package.path = '"
32 "./?.lua;"
33 "./third_party/lunit/?.lua;"
34 "external/com_google_protobuf/?.lua;"
35 "external/com_google_protobuf/src/?.lua;"
36 "bazel-bin/?.lua;"
37 "bazel-bin/external/com_google_protobuf/src/?.lua;"
38 "bazel-bin/external/com_google_protobuf/?.lua;"
39 "lua/?.lua;"
40 // These additional paths handle the case where this test is invoked from
41 // the protobuf repo's Bazel workspace.
42 "external/?.lua;"
43 "external/third_party/lunit/?.lua;"
44 "src/?.lua;"
45 "bazel-bin/external/?.lua;"
46 "external/lua/?.lua"
47 "'";
48
49int main(int argc, char** argv) {
50 if (argc < 2) {
51 fprintf(stderr, "missing argument with path to .lua file\n");
52 return 1;
53 }
54
55 int ret = 0;
56 L = luaL_newstate();
57 luaL_openlibs(L);
58 lua_pushcfunction(L, luaopen_lupb);
59 ret = luaL_loadstring(L, init);
60 lua_pushcfunction(L, luaopen_lupb);
61
62 signal(SIGINT, sighandler);
63 ret = ret || lua_pcall(L, 1, LUA_MULTRET, 0) || luaL_dofile(L, argv[1]);
64 signal(SIGINT, SIG_DFL);
65
66 if (ret) {
67 fprintf(stderr, "error testing Lua: %s\n", lua_tostring(L, -1));
68 ret = 1;
69 }
70
71 lua_close(L);
72 return ret;
73}